diff --git a/.pnpm-approved-builds.json b/.pnpm-approved-builds.json new file mode 100644 index 0000000..9f5a774 --- /dev/null +++ b/.pnpm-approved-builds.json @@ -0,0 +1 @@ +{"better-sqlite3@12.10.0": true, "esbuild@0.27.7": true} diff --git a/package.json b/package.json index 986bd47..4f99192 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,21 @@ { "name": "@united-workforce/monorepo", "private": true, - "packageManager": "bun@1.3.14", "workspaces": [ "packages/*" ], "scripts": { - "uwf": "bun packages/cli/src/cli.ts", - "preinstall": "npx only-allow bun", - "prepublishOnly": "echo 'Use bun run release instead' && exit 1", - "build": "bunx tsc --build", - "check": "bunx tsc --build && biome check . && bash scripts/lint-log-tags.sh", - "typecheck": "bunx tsc --build", + "uwf": "pnpm tsx packages/cli/src/cli.ts", + "prepublishOnly": "echo 'Use pnpm run release instead' && exit 1", + "build": "npx tsc --build", + "check": "npx tsc --build && biome check . && bash scripts/lint-log-tags.sh", + "typecheck": "npx tsc --build", "format": "biome format --write .", - "test": "bun run --filter './packages/*' test", - "test:ci": "bun run --filter './packages/*' test:ci", - "changeset": "bunx changeset", - "version": "bunx changeset version", - "release": "bun run build && bun run test && node scripts/publish-all.mjs" + "test": "pnpm -r run test", + "test:ci": "pnpm -r run test:ci", + "changeset": "npx changeset", + "version": "npx changeset version", + "release": "pnpm run build && pnpm run test && node scripts/publish-all.mjs" }, "devDependencies": { "@agentclientprotocol/sdk": "^0.22.1", @@ -26,8 +24,8 @@ "@types/node": "^25.7.0", "@types/xxhashjs": "^0.2.4", "@united-workforce/agent-hermes": "workspace:*", - "bun-types": "^1.3.13", "typescript": "^5.8.3", + "vitest": "^3.2.1", "yaml": "^2.9.0" }, "repository": { diff --git a/packages/agent-builtin/__tests__/llm-parse.test.ts b/packages/agent-builtin/__tests__/llm-parse.test.ts index ecf38bd..b391136 100644 --- a/packages/agent-builtin/__tests__/llm-parse.test.ts +++ b/packages/agent-builtin/__tests__/llm-parse.test.ts @@ -1,5 +1,4 @@ -import { describe, expect, test } from "bun:test"; - +import { describe, expect, test } from 'vitest'; import type { LlmToolCall } from "../src/llm/types.js"; /** Mirror OpenAI response shape for parser coverage via chatCompletionWithTools integration later. */ diff --git a/packages/agent-builtin/__tests__/loop.test.ts b/packages/agent-builtin/__tests__/loop.test.ts index 832e84d..09b20ce 100644 --- a/packages/agent-builtin/__tests__/loop.test.ts +++ b/packages/agent-builtin/__tests__/loop.test.ts @@ -1,19 +1,20 @@ -import { beforeEach, describe, expect, mock, test } from "bun:test"; - -const mockChatCompletionWithTools = mock(async () => ({ - content: "---\nstatus: done\n---", - toolCalls: [], +import { beforeEach, describe, expect, test, vi } from 'vitest'; +const { mockChatCompletionWithTools, mockAppendSessionTurn, mockExecuteBuiltinTool } = vi.hoisted(() => ({ + mockChatCompletionWithTools: vi.fn(async () => ({ + content: "---\nstatus: done\n---", + toolCalls: [], + })), + mockAppendSessionTurn: vi.fn(async () => {}), + mockExecuteBuiltinTool: vi.fn(async () => "tool-result"), })); -const mockAppendSessionTurn = mock(async () => {}); -const mockExecuteBuiltinTool = mock(async () => "tool-result"); -mock.module("../src/llm/index.js", () => ({ +vi.mock("../src/llm/index.js", () => ({ chatCompletionWithTools: mockChatCompletionWithTools, })); -mock.module("../src/session.js", () => ({ +vi.mock("../src/session.js", () => ({ appendSessionTurn: mockAppendSessionTurn, })); -mock.module("../src/tools/index.js", () => ({ +vi.mock("../src/tools/index.js", () => ({ builtinToolsToOpenAi: () => [], executeBuiltinTool: mockExecuteBuiltinTool, getBuiltinTools: () => [], diff --git a/packages/agent-builtin/__tests__/path.test.ts b/packages/agent-builtin/__tests__/path.test.ts index 47ff143..dd14ee5 100644 --- a/packages/agent-builtin/__tests__/path.test.ts +++ b/packages/agent-builtin/__tests__/path.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { resolve } from "node:path"; import { resolvePath } from "../src/tools/path.js"; diff --git a/packages/agent-builtin/__tests__/prompt.test.ts b/packages/agent-builtin/__tests__/prompt.test.ts index 2d648e4..2adffce 100644 --- a/packages/agent-builtin/__tests__/prompt.test.ts +++ b/packages/agent-builtin/__tests__/prompt.test.ts @@ -1,5 +1,4 @@ -import { describe, expect, test } from "bun:test"; - +import { describe, expect, test } from 'vitest'; import type { AgentContext } from "@united-workforce/util-agent"; import { buildBuiltinMessages } from "../src/prompt.js"; diff --git a/packages/agent-builtin/package.json b/packages/agent-builtin/package.json index fc8f2a4..dac7d7d 100644 --- a/packages/agent-builtin/package.json +++ b/packages/agent-builtin/package.json @@ -12,20 +12,19 @@ }, "exports": { ".": { - "bun": "./src/index.ts", "types": "./dist/index.d.ts", "import": "./dist/index.js" } }, "scripts": { - "prepublishOnly": "echo 'Use bun run release from repo root' && exit 1", - "test": "bun test __tests__/", - "test:ci": "bun test __tests__/" + "prepublishOnly": "echo 'Use pnpm run release from repo root' && exit 1", + "test": "vitest run __tests__/", + "test:ci": "vitest run __tests__/" }, "dependencies": { - "@ocas/core": "^0.1.1", - "@united-workforce/util-agent": "workspace:^", - "@united-workforce/util": "workspace:^" + "@ocas/core": "^0.2.2", + "@united-workforce/util": "workspace:^", + "@united-workforce/util-agent": "workspace:^" }, "devDependencies": { "typescript": "^5.8.3" diff --git a/packages/agent-builtin/src/detail.ts b/packages/agent-builtin/src/detail.ts index c1d887f..9ce2558 100644 --- a/packages/agent-builtin/src/detail.ts +++ b/packages/agent-builtin/src/detail.ts @@ -32,7 +32,7 @@ export async function storeBuiltinDetail( const turnHashes: string[] = []; for (const turn of turns) { - const hash = await store.put(schemas.turn, turn); + const hash = await store.cas.put(schemas.turn, turn); turnHashes.push(hash); } @@ -44,6 +44,6 @@ export async function storeBuiltinDetail( turnCount: turnHashes.length, turns: turnHashes, }; - const detailHash = await store.put(schemas.detail, detail); + const detailHash = await store.cas.put(schemas.detail, detail); return { detailHash, turnCount: turnHashes.length }; } diff --git a/packages/agent-claude-code/__tests__/claude-code.test.ts b/packages/agent-claude-code/__tests__/claude-code.test.ts index 5f089c8..1efd2bb 100644 --- a/packages/agent-claude-code/__tests__/claude-code.test.ts +++ b/packages/agent-claude-code/__tests__/claude-code.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import type { ThreadId } from "@united-workforce/protocol"; import type { AgentContext } from "@united-workforce/util-agent"; import { buildClaudeCodePrompt } from "../src/claude-code.js"; diff --git a/packages/agent-claude-code/__tests__/session-detail.test.ts b/packages/agent-claude-code/__tests__/session-detail.test.ts index 28c9bb0..4806321 100644 --- a/packages/agent-claude-code/__tests__/session-detail.test.ts +++ b/packages/agent-claude-code/__tests__/session-detail.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { createMemoryStore, walk } from "@ocas/core"; import { parseClaudeCodeJsonOutput, @@ -278,7 +278,7 @@ describe("storeClaudeCodeDetail", () => { expect(output).toBe("The answer"); expect(sessionId).toBe("abc-123"); - const node = await store.get(detailHash); + const node = await store.cas.get(detailHash); expect(node).not.toBeNull(); expect(node!.payload.model).toBe("claude-sonnet-4.5"); expect(node!.payload.stopReason).toBe("end_turn"); @@ -286,7 +286,7 @@ describe("storeClaudeCodeDetail", () => { expect(node!.payload.turns).toHaveLength(2); // Verify turn CAS nodes - const turn0 = await store.get(node!.payload.turns[0]); + const turn0 = await store.cas.get(node!.payload.turns[0]); expect(turn0).not.toBeNull(); expect(turn0!.payload.role).toBe("assistant"); expect(turn0!.payload.content).toBe("hello"); @@ -466,7 +466,7 @@ describe("storeClaudeCodeDetail — incomplete results", () => { expect(output).toBe("Partial output"); expect(sessionId).toBe("sess-incomplete"); - const node = await store.get(detailHash); + const node = await store.cas.get(detailHash); expect(node).not.toBeNull(); expect(node!.payload.subtype).toBe("incomplete"); expect(node!.payload.stopReason).toBe("incomplete_no_result_line"); @@ -480,7 +480,7 @@ describe("storeClaudeCodeRawOutput", () => { const rawText = "Claude produced plain text without JSON"; const hash = await storeClaudeCodeRawOutput(store, rawText); expect(hash).toHaveLength(13); - const node = await store.get(hash); + const node = await store.cas.get(hash); expect(node).not.toBeNull(); expect(node!.payload.text).toBe(rawText); }); diff --git a/packages/agent-claude-code/package.json b/packages/agent-claude-code/package.json index a3d3cc3..eb1b7c1 100644 --- a/packages/agent-claude-code/package.json +++ b/packages/agent-claude-code/package.json @@ -12,20 +12,19 @@ }, "exports": { ".": { - "bun": "./src/index.ts", "types": "./dist/index.d.ts", "import": "./dist/index.js" } }, "scripts": { - "prepublishOnly": "echo 'Use bun run release from repo root' && exit 1", - "test": "bun test __tests__/", - "test:ci": "bun test __tests__/" + "prepublishOnly": "echo 'Use pnpm run release from repo root' && exit 1", + "test": "vitest run __tests__/", + "test:ci": "vitest run __tests__/" }, "dependencies": { - "@ocas/core": "^0.1.1", - "@united-workforce/util-agent": "workspace:^", - "@united-workforce/util": "workspace:^" + "@ocas/core": "^0.2.2", + "@united-workforce/util": "workspace:^", + "@united-workforce/util-agent": "workspace:^" }, "devDependencies": { "typescript": "^5.8.3" diff --git a/packages/agent-claude-code/src/session-detail.ts b/packages/agent-claude-code/src/session-detail.ts index 0854ecc..9a2d95a 100644 --- a/packages/agent-claude-code/src/session-detail.ts +++ b/packages/agent-claude-code/src/session-detail.ts @@ -290,7 +290,7 @@ export async function storeClaudeCodeDetail( // Store each turn as an individual CAS node const turnHashes: string[] = []; for (const turn of parsed.turns) { - const hash = await store.put(schemas.turn, turn); + const hash = await store.cas.put(schemas.turn, turn); turnHashes.push(hash); } @@ -306,12 +306,12 @@ export async function storeClaudeCodeDetail( turns: turnHashes, }; - const detailHash = await store.put(schemas.detail, detail); + const detailHash = await store.cas.put(schemas.detail, detail); return { detailHash, output: parsed.result, sessionId: parsed.sessionId }; } /** Fallback: store raw text output when JSON parsing fails. */ export async function storeClaudeCodeRawOutput(store: Store, rawOutput: string): Promise { const schemas = await registerSchemas(store); - return store.put(schemas.rawOutput, { text: rawOutput }); + return store.cas.put(schemas.rawOutput, { text: rawOutput }); } diff --git a/packages/agent-hermes/__tests__/acp-client.test.ts b/packages/agent-hermes/__tests__/acp-client.test.ts index 6e68d8e..5667d3b 100644 --- a/packages/agent-hermes/__tests__/acp-client.test.ts +++ b/packages/agent-hermes/__tests__/acp-client.test.ts @@ -1,5 +1,4 @@ -import { afterEach, beforeEach, describe, expect, it } from "bun:test"; - +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { HermesAcpClient } from "../src/acp-client.js"; describe("handleSessionUpdate — text extraction", () => { diff --git a/packages/agent-hermes/__tests__/hermes-prompt.test.ts b/packages/agent-hermes/__tests__/hermes-prompt.test.ts index 47de678..c52bab7 100644 --- a/packages/agent-hermes/__tests__/hermes-prompt.test.ts +++ b/packages/agent-hermes/__tests__/hermes-prompt.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import type { ThreadId } from "@united-workforce/protocol"; import type { AgentContext } from "@united-workforce/util-agent"; import { buildHermesPrompt } from "../src/hermes.js"; diff --git a/packages/agent-hermes/__tests__/integration/acp-client.integration.test.ts b/packages/agent-hermes/__tests__/integration/acp-client.integration.test.ts index f4e6c6f..825be29 100644 --- a/packages/agent-hermes/__tests__/integration/acp-client.integration.test.ts +++ b/packages/agent-hermes/__tests__/integration/acp-client.integration.test.ts @@ -1,5 +1,4 @@ -import { afterEach, beforeEach, describe, expect, it } from "bun:test"; - +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { HermesAcpClient } from "../../src/acp-client.js"; const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; diff --git a/packages/agent-hermes/__tests__/integration/resume-e2e.integration.test.ts b/packages/agent-hermes/__tests__/integration/resume-e2e.integration.test.ts index 22f6d89..b11e3e6 100644 --- a/packages/agent-hermes/__tests__/integration/resume-e2e.integration.test.ts +++ b/packages/agent-hermes/__tests__/integration/resume-e2e.integration.test.ts @@ -1,5 +1,4 @@ -import { afterEach, describe, expect, it } from "bun:test"; - +import { afterEach, describe, expect, it } from 'vitest'; import { HermesAcpClient } from "../../src/acp-client.js"; /** diff --git a/packages/agent-hermes/__tests__/issue-551.test.ts b/packages/agent-hermes/__tests__/issue-551.test.ts index 3b646b9..db7bb5a 100644 --- a/packages/agent-hermes/__tests__/issue-551.test.ts +++ b/packages/agent-hermes/__tests__/issue-551.test.ts @@ -1,8 +1,10 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { readFileSync } from "node:fs"; import { join } from "node:path"; -const PKG_ROOT = join(import.meta.dir, ".."); +const PKG_ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); describe("Issue #551 — bin entry & engines", () => { test("package.json declares bun in engines", () => { diff --git a/packages/agent-hermes/__tests__/session-detail.test.ts b/packages/agent-hermes/__tests__/session-detail.test.ts index 5f0a293..45a108b 100644 --- a/packages/agent-hermes/__tests__/session-detail.test.ts +++ b/packages/agent-hermes/__tests__/session-detail.test.ts @@ -1,5 +1,5 @@ -import { Database } from "bun:sqlite"; -import { describe, expect, test } from "bun:test"; +import Database from "better-sqlite3"; +import { describe, expect, test } from 'vitest'; import { mkdtemp, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -106,7 +106,7 @@ describe("storeHermesSessionDetail", () => { expect(output).toBe("done"); - const detailNode = store.get(detailHash); + const detailNode = store.cas.get(detailHash); expect(detailNode).not.toBeNull(); if (detailNode === null) { return; diff --git a/packages/agent-hermes/package.json b/packages/agent-hermes/package.json index 6aa3ef2..34f747d 100644 --- a/packages/agent-hermes/package.json +++ b/packages/agent-hermes/package.json @@ -12,23 +12,24 @@ }, "exports": { ".": { - "bun": "./src/index.ts", "types": "./dist/index.d.ts", "import": "./dist/index.js" } }, "scripts": { - "prepublishOnly": "echo 'Use bun run release from repo root' && exit 1", - "test": "bun test __tests__/", - "test:ci": "bun test __tests__/" + "prepublishOnly": "echo 'Use pnpm run release from repo root' && exit 1", + "test": "vitest run __tests__/", + "test:ci": "vitest run __tests__/" }, "dependencies": { - "@ocas/core": "^0.1.1", - "@united-workforce/util-agent": "workspace:^", + "@ocas/core": "^0.2.2", "@united-workforce/protocol": "workspace:^", - "@united-workforce/util": "workspace:^" + "@united-workforce/util": "workspace:^", + "@united-workforce/util-agent": "workspace:^", + "better-sqlite3": "^12.10.0" }, "devDependencies": { + "@types/better-sqlite3": "^7.6.13", "typescript": "^5.8.3" }, "publishConfig": { @@ -43,8 +44,5 @@ "bugs": { "url": "https://git.shazhou.work/shazhou/united-workforce/issues" }, - "engines": { - "bun": ">= 1.0.0" - }, "license": "MIT" } diff --git a/packages/agent-hermes/src/session-detail.ts b/packages/agent-hermes/src/session-detail.ts index 28b3ba0..4d3bf49 100644 --- a/packages/agent-hermes/src/session-detail.ts +++ b/packages/agent-hermes/src/session-detail.ts @@ -1,4 +1,4 @@ -import { Database } from "bun:sqlite"; +import Database from "better-sqlite3"; import { readFile } from "node:fs/promises"; import { homedir } from "node:os"; import { join } from "node:path"; @@ -156,13 +156,13 @@ export function loadHermesSessionFromDb( try { db = new Database(resolvedPath, { readonly: true }); const session = db - .query("SELECT id, model, started_at FROM sessions WHERE id = ?") + .prepare("SELECT id, model, started_at FROM sessions WHERE id = ?") .get(sessionId) as DbSessionRow | null; if (session === null) { return null; } const rows = db - .query( + .prepare( "SELECT role, content, reasoning, tool_calls FROM messages WHERE session_id = ? ORDER BY id", ) .all(sessionId) as DbMessageRow[]; @@ -285,7 +285,7 @@ export async function storeHermesSessionDetail( if (turn === null) { continue; } - const hash = await store.put(schemas.turn, turn); + const hash = await store.cas.put(schemas.turn, turn); turnHashes.push(hash); turnIndex += 1; } @@ -297,12 +297,12 @@ export async function storeHermesSessionDetail( turnCount: turnHashes.length, turns: turnHashes, }; - const detailHash = await store.put(schemas.detail, detail); + const detailHash = await store.cas.put(schemas.detail, detail); const output = extractLastAssistantContent(session.messages); return { detailHash, output }; } export async function storeHermesRawOutput(store: Store, rawOutput: string): Promise { const schemas = await registerHermesSchemas(store); - return store.put(schemas.rawOutput, { text: rawOutput }); + return store.cas.put(schemas.rawOutput, { text: rawOutput }); } diff --git a/packages/cli/package.json b/packages/cli/package.json index cc02d6f..4aa12c9 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -11,8 +11,8 @@ "uwf": "./dist/cli.js" }, "dependencies": { - "@ocas/core": "^0.1.1", - "@ocas/fs": "^0.1.1", + "@ocas/core": "^0.2.2", + "@ocas/fs": "^0.2.2", "@united-workforce/protocol": "workspace:^", "@united-workforce/util": "workspace:^", "@united-workforce/util-agent": "workspace:^", @@ -22,9 +22,9 @@ "yaml": "^2.8.4" }, "scripts": { - "prepublishOnly": "echo 'Use bun run release from repo root' && exit 1", - "test": "bun test src/", - "test:ci": "bun test src/" + "prepublishOnly": "echo 'Use pnpm run release from repo root' && exit 1", + "test": "vitest run src/", + "test:ci": "vitest run src/" }, "publishConfig": { "access": "public" diff --git a/packages/cli/src/__tests__/adapter-json-roundtrip.test.ts b/packages/cli/src/__tests__/adapter-json-roundtrip.test.ts index 2de2d23..43557a5 100644 --- a/packages/cli/src/__tests__/adapter-json-roundtrip.test.ts +++ b/packages/cli/src/__tests__/adapter-json-roundtrip.test.ts @@ -1,10 +1,12 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { execFileSync } from "node:child_process"; import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { putSchema } from "@ocas/core"; -import { createFsStore } from "@ocas/fs"; +import { openStore } from "@ocas/fs"; import type { CasRef, StepNodePayload, ThreadId } from "@united-workforce/protocol"; import { registerUwfSchemas } from "../schemas.js"; import { seedThreads } from "./thread-test-helpers.js"; @@ -38,12 +40,12 @@ describe("C1: adapter JSON round-trip integration", () => { // 1. Set up CAS store with workflow, start node, and output schema const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const outputSchemaHash = await putSchema(store, OUTPUT_SCHEMA); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-roundtrip", description: "roundtrip integration test", roles: { @@ -62,7 +64,7 @@ describe("C1: adapter JSON round-trip integration", () => { }, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test round-trip task", }); @@ -73,18 +75,18 @@ describe("C1: adapter JSON round-trip integration", () => { await seedThreads(tmpDir, { [threadId]: startHash }); // 2. Pre-create CAS nodes that the mock agent would produce - const outputHash = await store.put(outputSchemaHash, { + const outputHash = await store.cas.put(outputSchemaHash, { $status: "done", result: "test-ok", }); // Use text schema for detail (simple placeholder) - const detailHash = await store.put(schemas.text, "mock detail"); + const detailHash = await store.cas.put(schemas.text, "mock detail"); const startedAtMs = 1716600000000; const completedAtMs = 1716600001500; - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -119,15 +121,15 @@ describe("C1: adapter JSON round-trip integration", () => { ); // 5. Run CLI with agent override pointing to our mock - const cliPath = join(import.meta.dirname, "..", "cli.js"); + const cliPath = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "dist", "cli.js"); let stdout: string; let stderr: string; let exitCode: number; try { stdout = execFileSync( - "bun", - ["run", cliPath, "thread", "exec", threadId, "--agent", mockAgentPath], + process.execPath, + [cliPath, "thread", "exec", threadId, "--agent", mockAgentPath], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], @@ -165,8 +167,8 @@ describe("C1: adapter JSON round-trip integration", () => { expect(cliOutput.head).toMatch(/^[0-9A-HJ-NP-TV-Z]{13}$/); // Verify the CAS step node exists and has correct metadata - const storeAfter = createFsStore(casDir); - const stepNode = storeAfter.get(cliOutput.head as CasRef); + const storeAfter = await openStore(casDir); + const stepNode = storeAfter.cas.get(cliOutput.head as CasRef); expect(stepNode).not.toBeNull(); const payload = stepNode!.payload as StepNodePayload; diff --git a/packages/cli/src/__tests__/config.test.ts b/packages/cli/src/__tests__/config.test.ts index 9604c0a..00d7edc 100644 --- a/packages/cli/src/__tests__/config.test.ts +++ b/packages/cli/src/__tests__/config.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; diff --git a/packages/cli/src/__tests__/current-role.test.ts b/packages/cli/src/__tests__/current-role.test.ts index fc9b559..29a3dde 100644 --- a/packages/cli/src/__tests__/current-role.test.ts +++ b/packages/cli/src/__tests__/current-role.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { mkdir, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -181,18 +181,18 @@ async function insertStepNode( const head = headEntry.head; const outputSchemaHash = await putSchema(uwf.store, OUTPUT_SCHEMA); - const outputHash = await uwf.store.put(outputSchemaHash, outputPayload); + const outputHash = await uwf.store.cas.put(outputSchemaHash, outputPayload); // Use text schema for detail (simple placeholder) - const detailHash = await uwf.store.put(uwf.schemas.text, "detail-placeholder"); + const detailHash = await uwf.store.cas.put(uwf.schemas.text, "detail-placeholder"); // Resolve start hash from head - const headNode = uwf.store.get(head); + const headNode = uwf.store.cas.get(head); if (headNode === null) throw new Error(`head ${head} not found`); const isStart = headNode.type === uwf.schemas.startNode; const startHash = isStart ? head : (headNode.payload as { start: CasRef }).start; - const stepHash = (await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = (await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: isStart ? null : head, role, diff --git a/packages/cli/src/__tests__/include-tag.test.ts b/packages/cli/src/__tests__/include-tag.test.ts index f451ebd..512ba11 100644 --- a/packages/cli/src/__tests__/include-tag.test.ts +++ b/packages/cli/src/__tests__/include-tag.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; diff --git a/packages/cli/src/__tests__/log.test.ts b/packages/cli/src/__tests__/log.test.ts index b9ba793..b79a889 100644 --- a/packages/cli/src/__tests__/log.test.ts +++ b/packages/cli/src/__tests__/log.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, readdir, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; diff --git a/packages/cli/src/__tests__/moderator-evaluate.test.ts b/packages/cli/src/__tests__/moderator-evaluate.test.ts index 89b6f37..120c75e 100644 --- a/packages/cli/src/__tests__/moderator-evaluate.test.ts +++ b/packages/cli/src/__tests__/moderator-evaluate.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import type { Target, WorkflowPayload } from "@united-workforce/protocol"; import { evaluate } from "../moderator/evaluate.js"; diff --git a/packages/cli/src/__tests__/prompt.test.ts b/packages/cli/src/__tests__/prompt.test.ts index 5e45bba..89cd1ed 100644 --- a/packages/cli/src/__tests__/prompt.test.ts +++ b/packages/cli/src/__tests__/prompt.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { execFileSync } from "node:child_process"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; diff --git a/packages/cli/src/__tests__/resolve-head-hash.test.ts b/packages/cli/src/__tests__/resolve-head-hash.test.ts index b1dac22..44a8f4a 100644 --- a/packages/cli/src/__tests__/resolve-head-hash.test.ts +++ b/packages/cli/src/__tests__/resolve-head-hash.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -23,7 +23,7 @@ describe("resolveHeadHash", () => { test("returns head hash from variable store for active thread", async () => { const threadId = "01JTEST0000000000000000001" as ThreadId; const uwf = await createUwfStore(tmpDir); - const headHash = (await uwf.store.put(uwf.schemas.text, "active")) as CasRef; + const headHash = (await uwf.store.cas.put(uwf.schemas.text, "active")) as CasRef; setThread(uwf.varStore, threadId, createThreadIndexEntry(headHash as CasRef)); const result = await resolveHeadHash(tmpDir, threadId); @@ -36,7 +36,7 @@ describe("resolveHeadHash", () => { const workflowHash = "workflow_hash_789" as CasRef; const uwf = await createUwfStore(tmpDir); - const headHash = (await uwf.store.put(uwf.schemas.text, "completed-head")) as CasRef; + const headHash = (await uwf.store.cas.put(uwf.schemas.text, "completed-head")) as CasRef; addHistoryEntry(uwf.varStore, { thread: threadId, workflow: workflowHash, @@ -59,8 +59,8 @@ describe("resolveHeadHash", () => { const workflowHash = "workflow_hash_xyz" as CasRef; const uwf = await createUwfStore(tmpDir); - const activeHead = (await uwf.store.put(uwf.schemas.text, "active-v2")) as CasRef; - const historicalHash = (await uwf.store.put(uwf.schemas.text, "historical-v1")) as CasRef; + const activeHead = (await uwf.store.cas.put(uwf.schemas.text, "active-v2")) as CasRef; + const historicalHash = (await uwf.store.cas.put(uwf.schemas.text, "historical-v1")) as CasRef; setThread(uwf.varStore, threadId, createThreadIndexEntry(activeHead)); addHistoryEntry(uwf.varStore, { thread: threadId, @@ -82,9 +82,9 @@ describe("resolveHeadHash", () => { const threadId3 = "01JTEST0000000000000000007" as ThreadId; const workflowHash = "workflow_hash_abc" as CasRef; const uwf = await createUwfStore(tmpDir); - const hash1 = (await uwf.store.put(uwf.schemas.text, "hash-thread1")) as CasRef; - const hash2 = (await uwf.store.put(uwf.schemas.text, "hash-thread2")) as CasRef; - const hash3 = (await uwf.store.put(uwf.schemas.text, "hash-thread3")) as CasRef; + const hash1 = (await uwf.store.cas.put(uwf.schemas.text, "hash-thread1")) as CasRef; + const hash2 = (await uwf.store.cas.put(uwf.schemas.text, "hash-thread2")) as CasRef; + const hash3 = (await uwf.store.cas.put(uwf.schemas.text, "hash-thread3")) as CasRef; addHistoryEntry(uwf.varStore, { thread: threadId1, workflow: workflowHash, diff --git a/packages/cli/src/__tests__/setup-agent-discovery.test.ts b/packages/cli/src/__tests__/setup-agent-discovery.test.ts index 43710a1..bb41d9a 100644 --- a/packages/cli/src/__tests__/setup-agent-discovery.test.ts +++ b/packages/cli/src/__tests__/setup-agent-discovery.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { readFileSync } from "node:fs"; import { mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; @@ -31,7 +31,7 @@ describe("_agentNameFromBinary", () => { describe("_printAgentMenu", () => { test("prints known agents with labels", () => { const logs: string[] = []; - spyOn(console, "log").mockImplementation((...args: unknown[]) => { + vi.spyOn(console, "log").mockImplementation((...args: unknown[]) => { logs.push(args.join(" ")); }); @@ -40,12 +40,12 @@ describe("_printAgentMenu", () => { expect(logs.some((l) => l.includes("Hermes"))).toBe(true); expect(logs.some((l) => l.includes("Claude Code"))).toBe(true); - mock.restore(); + vi.restoreAllMocks(); }); test("prints unknown agents with binary name as label", () => { const logs: string[] = []; - spyOn(console, "log").mockImplementation((...args: unknown[]) => { + vi.spyOn(console, "log").mockImplementation((...args: unknown[]) => { logs.push(args.join(" ")); }); @@ -53,7 +53,7 @@ describe("_printAgentMenu", () => { expect(logs.some((l) => l.includes("uwf-custom-agent"))).toBe(true); - mock.restore(); + vi.restoreAllMocks(); }); }); @@ -67,7 +67,7 @@ describe("cmdSetup agent configuration", () => { }); afterEach(async () => { - mock.restore(); + vi.restoreAllMocks(); await rm(storageRoot, { recursive: true, force: true }); }); @@ -80,7 +80,7 @@ describe("cmdSetup agent configuration", () => { }); test("defaults to hermes agent when no agent specified", async () => { - spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); + vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); const result = await cmdSetup(baseArgs()); @@ -91,7 +91,7 @@ describe("cmdSetup agent configuration", () => { }); test("writes specified agent as default", async () => { - spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); + vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); const result = await cmdSetup({ ...baseArgs(), agent: "claude-code" }); @@ -102,7 +102,7 @@ describe("cmdSetup agent configuration", () => { }); test("preserves existing agents when adding new one", async () => { - spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); + vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); // First setup with hermes await cmdSetup(baseArgs()); @@ -116,7 +116,7 @@ describe("cmdSetup agent configuration", () => { }); test("updates defaultAgent on re-run with different agent", async () => { - spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); + vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); await cmdSetup(baseArgs()); const config1 = parse(readFileSync(join(storageRoot, "config.yaml"), "utf8")); @@ -128,7 +128,7 @@ describe("cmdSetup agent configuration", () => { }); test("normalizes agent name with uwf- prefix to bare name", async () => { - spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); + vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); const result = await cmdSetup({ ...baseArgs(), agent: "uwf-hermes" }); @@ -141,7 +141,7 @@ describe("cmdSetup agent configuration", () => { }); test("normalizes uwf-claude-code to claude-code", async () => { - spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); + vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); const result = await cmdSetup({ ...baseArgs(), agent: "uwf-claude-code" }); diff --git a/packages/cli/src/__tests__/setup-complexity.test.ts b/packages/cli/src/__tests__/setup-complexity.test.ts index 9904cff..26cd4d7 100644 --- a/packages/cli/src/__tests__/setup-complexity.test.ts +++ b/packages/cli/src/__tests__/setup-complexity.test.ts @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, mock, spyOn, test } from "bun:test"; +import { afterEach, describe, expect, test, vi } from 'vitest'; import { mkdirSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -178,7 +178,7 @@ describe("_isBackspace", () => { describe("_printProviderMenu", () => { afterEach(() => { - mock.restore(); + vi.restoreAllMocks(); }); const providers = [ @@ -188,7 +188,7 @@ describe("_printProviderMenu", () => { test("prints correct number of lines (one per provider + custom)", () => { const lines: string[] = []; - spyOn(console, "log").mockImplementation((msg: string) => { + vi.spyOn(console, "log").mockImplementation((msg: string) => { lines.push(msg); }); _printProviderMenu(providers); @@ -198,7 +198,7 @@ describe("_printProviderMenu", () => { test("custom option number = providers.length + 1", () => { const lines: string[] = []; - spyOn(console, "log").mockImplementation((msg: string) => { + vi.spyOn(console, "log").mockImplementation((msg: string) => { lines.push(msg); }); _printProviderMenu(providers); @@ -208,7 +208,7 @@ describe("_printProviderMenu", () => { test("each provider line contains its label and baseUrl", () => { const lines: string[] = []; - spyOn(console, "log").mockImplementation((msg: string) => { + vi.spyOn(console, "log").mockImplementation((msg: string) => { lines.push(msg); }); _printProviderMenu(providers); @@ -294,12 +294,12 @@ describe("_resolveModelChoice", () => { describe("_printModelMenu", () => { afterEach(() => { - mock.restore(); + vi.restoreAllMocks(); }); test("prints all models — each model name appears in output", () => { const output: string[] = []; - spyOn(console, "log").mockImplementation((msg: string) => { + vi.spyOn(console, "log").mockImplementation((msg: string) => { output.push(msg); }); const models = ["model-a", "model-b", "model-c"]; @@ -312,7 +312,7 @@ describe("_printModelMenu", () => { test("single column when termCols is very small", () => { const output: string[] = []; - spyOn(console, "log").mockImplementation((msg: string) => { + vi.spyOn(console, "log").mockImplementation((msg: string) => { output.push(msg); }); _printModelMenu(["a", "b", "c"], 1); @@ -322,7 +322,7 @@ describe("_printModelMenu", () => { test("wide terminal fits multiple columns", () => { const output: string[] = []; - spyOn(console, "log").mockImplementation((msg: string) => { + vi.spyOn(console, "log").mockImplementation((msg: string) => { output.push(msg); }); const models = Array.from({ length: 6 }, (_, i) => `m${i}`); @@ -338,12 +338,12 @@ describe("_printModelMenu", () => { describe("_printValidationResult", () => { afterEach(() => { - mock.restore(); + vi.restoreAllMocks(); }); test("ok=true prints success message containing '✓'", () => { const lines: string[] = []; - spyOn(console, "log").mockImplementation((msg: string) => { + vi.spyOn(console, "log").mockImplementation((msg: string) => { lines.push(msg); }); _printValidationResult({ ok: true, error: null }); @@ -352,7 +352,7 @@ describe("_printValidationResult", () => { test("ok=false prints warning message containing '⚠'", () => { const lines: string[] = []; - spyOn(console, "log").mockImplementation((msg: string) => { + vi.spyOn(console, "log").mockImplementation((msg: string) => { lines.push(msg); }); _printValidationResult({ ok: false, error: "HTTP 401" }); @@ -361,7 +361,7 @@ describe("_printValidationResult", () => { test("ok=false includes the error string in output", () => { const lines: string[] = []; - spyOn(console, "log").mockImplementation((msg: string) => { + vi.spyOn(console, "log").mockImplementation((msg: string) => { lines.push(msg); }); _printValidationResult({ ok: false, error: "HTTP 401" }); diff --git a/packages/cli/src/__tests__/setup-validate.test.ts b/packages/cli/src/__tests__/setup-validate.test.ts index 51d8f05..46e1b1e 100644 --- a/packages/cli/src/__tests__/setup-validate.test.ts +++ b/packages/cli/src/__tests__/setup-validate.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -10,11 +10,11 @@ describe("validateModel", () => { const MODEL = "test-model"; afterEach(() => { - mock.restore(); + vi.restoreAllMocks(); }); test("success path — returns ok on 200", async () => { - const mockFetch = spyOn(globalThis, "fetch").mockResolvedValue( + const mockFetch = vi.spyOn(globalThis, "fetch").mockResolvedValue( new Response(JSON.stringify({}), { status: 200 }), ); @@ -37,7 +37,7 @@ describe("validateModel", () => { }); test("HTTP 401 — returns error containing 401", async () => { - spyOn(globalThis, "fetch").mockResolvedValue( + vi.spyOn(globalThis, "fetch").mockResolvedValue( new Response("Unauthorized", { status: 401, statusText: "Unauthorized" }), ); @@ -50,7 +50,7 @@ describe("validateModel", () => { }); test("HTTP 404 — returns error containing 404", async () => { - spyOn(globalThis, "fetch").mockResolvedValue( + vi.spyOn(globalThis, "fetch").mockResolvedValue( new Response("Not Found", { status: 404, statusText: "Not Found" }), ); @@ -64,7 +64,7 @@ describe("validateModel", () => { test("network timeout — returns error mentioning timeout", async () => { const err = new DOMException("signal timed out", "AbortError"); - spyOn(globalThis, "fetch").mockRejectedValue(err); + vi.spyOn(globalThis, "fetch").mockRejectedValue(err); const result = await validateModel(BASE_URL, API_KEY, MODEL); @@ -75,7 +75,7 @@ describe("validateModel", () => { }); test("network error (DNS/connection) — returns error mentioning connectivity", async () => { - spyOn(globalThis, "fetch").mockRejectedValue(new TypeError("fetch failed")); + vi.spyOn(globalThis, "fetch").mockRejectedValue(new TypeError("fetch failed")); const result = await validateModel(BASE_URL, API_KEY, MODEL); @@ -86,7 +86,7 @@ describe("validateModel", () => { }); test("request body correctness", async () => { - const mockFetch = spyOn(globalThis, "fetch").mockResolvedValue( + const mockFetch = vi.spyOn(globalThis, "fetch").mockResolvedValue( new Response(JSON.stringify({}), { status: 200 }), ); @@ -109,7 +109,7 @@ describe("cmdSetup with validation", () => { }); afterEach(async () => { - mock.restore(); + vi.restoreAllMocks(); await rm(storageRoot, { recursive: true, force: true }); }); @@ -122,7 +122,7 @@ describe("cmdSetup with validation", () => { }); test("includes validation result on success", async () => { - spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); + vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({}), { status: 200 })); const result = await cmdSetup(setupArgs()); @@ -132,7 +132,7 @@ describe("cmdSetup with validation", () => { }); test("includes validation failure — config still saved", async () => { - spyOn(globalThis, "fetch").mockResolvedValue( + vi.spyOn(globalThis, "fetch").mockResolvedValue( new Response("Unauthorized", { status: 401, statusText: "Unauthorized" }), ); diff --git a/packages/cli/src/__tests__/solve-issue-tea-worktree.test.ts b/packages/cli/src/__tests__/solve-issue-tea-worktree.test.ts index 23b592e..2a33051 100644 --- a/packages/cli/src/__tests__/solve-issue-tea-worktree.test.ts +++ b/packages/cli/src/__tests__/solve-issue-tea-worktree.test.ts @@ -1,4 +1,6 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { readFile } from "node:fs/promises"; import { join } from "node:path"; import type { WorkflowPayload } from "@united-workforce/protocol"; @@ -15,7 +17,7 @@ import { parse } from "yaml"; describe("solve-issue workflow: Gitea API PR creation", () => { // Navigate up from packages/cli/src/__tests__ to repo root const workflowPath = join( - import.meta.dirname, + dirname(fileURLToPath(import.meta.url)), "..", "..", "..", diff --git a/packages/cli/src/__tests__/spawn-agent-json.test.ts b/packages/cli/src/__tests__/spawn-agent-json.test.ts index a150e1c..0eff30f 100644 --- a/packages/cli/src/__tests__/spawn-agent-json.test.ts +++ b/packages/cli/src/__tests__/spawn-agent-json.test.ts @@ -1,5 +1,4 @@ -import { describe, expect, test } from "bun:test"; - +import { describe, expect, test } from 'vitest'; /** * B-group tests: validate JSON parsing logic used by spawnAgent. * diff --git a/packages/cli/src/__tests__/step-read.test.ts b/packages/cli/src/__tests__/step-read.test.ts index d481292..1326cd7 100644 --- a/packages/cli/src/__tests__/step-read.test.ts +++ b/packages/cli/src/__tests__/step-read.test.ts @@ -1,9 +1,9 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { bootstrap, putSchema } from "@ocas/core"; -import { createFsStore } from "@ocas/fs"; +import { openStore } from "@ocas/fs"; import type { CasRef } from "@united-workforce/protocol"; import { cmdStepRead } from "../commands/step.js"; import { registerUwfSchemas } from "../schemas.js"; @@ -48,7 +48,7 @@ const DETAIL_SCHEMA = { // ── helpers ─────────────────────────────────────────────────────────────────── -async function registerDetailSchemas(store: ReturnType) { +async function registerDetailSchemas(store: Awaited>) { await bootstrap(store); const [turn, detail] = await Promise.all([ putSchema(store, TURN_SCHEMA), @@ -92,11 +92,11 @@ describe("step read", () => { await mkdir(casDir, { recursive: true }); process.env.OCAS_DIR = casDir; process.env.OCAS_DIR = casDir; - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -113,12 +113,12 @@ describe("step read", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -130,7 +130,7 @@ describe("step read", () => { const turnHashes: CasRef[] = []; for (let i = 1; i <= 3; i++) { const content = `Turn ${i} content with some text to make it readable.`; - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: i - 1, role: "assistant", content, @@ -140,7 +140,7 @@ describe("step read", () => { turnHashes.push(turnHash); } - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "session-1", model: "test-model", duration: 1000, @@ -148,7 +148,7 @@ describe("step read", () => { turns: turnHashes, }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -180,11 +180,11 @@ describe("step read", () => { process.env.OCAS_DIR = casDir; await mkdir(casDir, { recursive: true }); process.env.OCAS_DIR = casDir; - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -201,12 +201,12 @@ describe("step read", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -218,7 +218,7 @@ describe("step read", () => { const turnHashes: CasRef[] = []; for (let i = 1; i <= 4; i++) { const content = generateContent(300, `Turn${i}`); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: i - 1, role: "assistant", content, @@ -228,7 +228,7 @@ describe("step read", () => { turnHashes.push(turnHash); } - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "session-1", model: "test-model", duration: 1000, @@ -236,7 +236,7 @@ describe("step read", () => { turns: turnHashes, }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -266,11 +266,11 @@ describe("step read", () => { process.env.OCAS_DIR = casDir; await mkdir(casDir, { recursive: true }); process.env.OCAS_DIR = casDir; - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -287,12 +287,12 @@ describe("step read", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -302,7 +302,7 @@ describe("step read", () => { // Create 1 turn of 500 chars const content = generateContent(500, "LongTurn"); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content, @@ -310,7 +310,7 @@ describe("step read", () => { reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "session-1", model: "test-model", duration: 1000, @@ -318,7 +318,7 @@ describe("step read", () => { turns: [turnHash], }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -343,10 +343,10 @@ describe("step read", () => { process.env.OCAS_DIR = casDir; await mkdir(casDir, { recursive: true }); process.env.OCAS_DIR = casDir; - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -363,12 +363,12 @@ describe("step read", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -376,7 +376,7 @@ describe("step read", () => { graph: {}, }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -404,11 +404,11 @@ describe("step read", () => { process.env.OCAS_DIR = casDir; await mkdir(casDir, { recursive: true }); process.env.OCAS_DIR = casDir; - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -425,12 +425,12 @@ describe("step read", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -451,11 +451,11 @@ describe("step read", () => { await bootstrap(store); const simpleDetailType = await putSchema(store, SIMPLE_DETAIL_SCHEMA); - const detailHash = await store.put(simpleDetailType, { + const detailHash = await store.cas.put(simpleDetailType, { sessionId: "session-1", }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -482,11 +482,11 @@ describe("step read", () => { process.env.OCAS_DIR = casDir; await mkdir(casDir, { recursive: true }); process.env.OCAS_DIR = casDir; - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -503,12 +503,12 @@ describe("step read", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -516,7 +516,7 @@ describe("step read", () => { graph: {}, }); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: "", @@ -524,7 +524,7 @@ describe("step read", () => { reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "session-1", model: "test-model", duration: 1000, @@ -532,7 +532,7 @@ describe("step read", () => { turns: [turnHash], }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -556,11 +556,11 @@ describe("step read", () => { process.env.OCAS_DIR = casDir; await mkdir(casDir, { recursive: true }); process.env.OCAS_DIR = casDir; - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -577,12 +577,12 @@ describe("step read", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -592,7 +592,7 @@ describe("step read", () => { // Create turn with special markdown characters const content = "This has `backticks`, **bold**, *italic*, and [links](http://example.com)"; - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content, @@ -600,7 +600,7 @@ describe("step read", () => { reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "session-1", model: "test-model", duration: 1000, @@ -608,7 +608,7 @@ describe("step read", () => { turns: [turnHash], }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", diff --git a/packages/cli/src/__tests__/step-show-json.test.ts b/packages/cli/src/__tests__/step-show-json.test.ts index b99e02d..44a00f7 100644 --- a/packages/cli/src/__tests__/step-show-json.test.ts +++ b/packages/cli/src/__tests__/step-show-json.test.ts @@ -1,9 +1,9 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { bootstrap, type Hash, type JSONSchema, putSchema } from "@ocas/core"; -import { createFsStore } from "@ocas/fs"; +import { openStore } from "@ocas/fs"; import type { CasRef, StepNodePayload } from "@united-workforce/protocol"; import { cmdStepShow } from "../commands/step.js"; import { formatOutput } from "../format.js"; @@ -52,7 +52,7 @@ const DETAIL_SCHEMA: JSONSchema = { }; type TestSetup = { - store: ReturnType; + store: Awaited>; schemas: { workflow: Hash; startNode: Hash; @@ -64,7 +64,7 @@ type TestSetup = { }; async function setupTest(casDir: string): Promise { - const store = createFsStore(casDir); + const store = await openStore(casDir); await bootstrap(store); const schemas = await registerUwfSchemas(store); const [turnType, detailType] = await Promise.all([ @@ -88,22 +88,22 @@ async function createTestStep( // Create turn nodes const turnHashes: CasRef[] = []; for (const payload of turnPayloads) { - const turnHash = await store.put(turnType, payload); + const turnHash = await store.cas.put(turnType, payload); turnHashes.push(turnHash); } // Create detail node - const detailHash = await store.put(detailType, { turns: turnHashes }); + const detailHash = await store.cas.put(detailType, { turns: turnHashes }); // Create dummy start node - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: "0000000000000" as CasRef, prompt: "test prompt", cwd: "/tmp", }); // Create dummy output node - const outputHash = await store.put(schemas.text, { $status: "done" }); + const outputHash = await store.cas.put(schemas.text, { $status: "done" }); // Create step node const stepPayload: StepNodePayload = { @@ -119,7 +119,7 @@ async function createTestStep( assembledPrompt: null, cwd: "/tmp", }; - return store.put(schemas.stepNode, stepPayload); + return store.cas.put(schemas.stepNode, stepPayload); } describe("cmdStepShow JSON serialization", () => { diff --git a/packages/cli/src/__tests__/step-timing.test.ts b/packages/cli/src/__tests__/step-timing.test.ts index 763e386..a0b9d98 100644 --- a/packages/cli/src/__tests__/step-timing.test.ts +++ b/packages/cli/src/__tests__/step-timing.test.ts @@ -1,9 +1,9 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { bootstrap, putSchema } from "@ocas/core"; -import { createFsStore } from "@ocas/fs"; +import { openStore } from "@ocas/fs"; import type { CasRef, ThreadId } from "@united-workforce/protocol"; import { STEP_NODE_SCHEMA } from "@united-workforce/protocol"; import { cmdStepList } from "../commands/step.js"; @@ -51,7 +51,7 @@ const DETAIL_SCHEMA = { // ── helpers ────────────────────────────────────────────────────────────────── -async function registerDetailSchemas(store: ReturnType) { +async function registerDetailSchemas(store: Awaited>) { await bootstrap(store); const [turn, detail] = await Promise.all([ putSchema(store, TURN_SCHEMA), @@ -133,18 +133,18 @@ describe("StepNode JSON schema", () => { test("StepNode with timing fields passes CAS validation", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: "placeholder0000" as CasRef, prompt: "test", }); - const outputHash = await store.put(schemas.text, "output text"); + const outputHash = await store.cas.put(schemas.text, "output text"); const detailSchemas = await registerDetailSchemas(store); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "s1", model: "m1", duration: 100, @@ -153,7 +153,7 @@ describe("StepNode JSON schema", () => { }); // Should succeed — valid timing fields - const hash = await store.put(schemas.stepNode, { + const hash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -175,24 +175,24 @@ describe("step list timing", () => { test("step list includes durationMs = completedAtMs - startedAtMs", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: {}, graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "test", }); - const outputHash = await store.put(schemas.text, "output"); - const detailHash = await store.put(detailSchemas.detail, { + const outputHash = await store.cas.put(schemas.text, "output"); + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "s1", model: "m1", duration: 100, @@ -203,7 +203,7 @@ describe("step list timing", () => { const startedAt = 1716600000000; const completedAt = 1716600003500; - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -233,11 +233,11 @@ describe("thread read timing", () => { test("thread read header includes Duration", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -256,28 +256,28 @@ describe("thread read timing", () => { }, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "test task", }); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: "Done.", toolCalls: null, reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "s1", model: "m1", duration: 100, turnCount: 1, turns: [turnHash], }); - const outputHash = await store.put(schemas.text, "output"); + const outputHash = await store.cas.put(schemas.text, "output"); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -299,11 +299,11 @@ describe("thread read timing", () => { test("thread read shows sub-second duration as ms", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -322,28 +322,28 @@ describe("thread read timing", () => { }, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "test", }); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: "Done.", toolCalls: null, reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "s1", model: "m1", duration: 100, turnCount: 1, turns: [turnHash], }); - const outputHash = await store.put(schemas.text, "output"); + const outputHash = await store.cas.put(schemas.text, "output"); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", diff --git a/packages/cli/src/__tests__/store-global-cas.test.ts b/packages/cli/src/__tests__/store-global-cas.test.ts index 7ebdc65..9188782 100644 --- a/packages/cli/src/__tests__/store-global-cas.test.ts +++ b/packages/cli/src/__tests__/store-global-cas.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -113,7 +113,7 @@ describe("Global CAS directory", () => { // Store a node in the first store const testData = { test: "data" }; - const _hash = uwf1.store.put(uwf1.schemas.text, JSON.stringify(testData)); + const _hash = uwf1.store.cas.put(uwf1.schemas.text, JSON.stringify(testData)); // Both stores share the same CAS filesystem directory // Since schemas are registered idempotently, they should have the same hash @@ -133,14 +133,14 @@ describe("Global CAS directory", () => { await mkdir(storageRoot, { recursive: true }); const uwf = await createUwfStore(storageRoot); - const hash = await uwf.store.put(uwf.schemas.text, "registry-test"); + const hash = await uwf.store.cas.put(uwf.schemas.text, "registry-test"); saveWorkflowRegistry(uwf.varStore, "test-workflow", hash); const registry = loadWorkflowRegistry(uwf.varStore); expect(registry["test-workflow"]).toBe(hash); const { access } = await import("node:fs/promises"); - await access(join(globalCasDir, "variables.db")); + await access(join(globalCasDir, "vars")); const registryPath = join(storageRoot, "workflows.yaml"); await expect(access(registryPath)).rejects.toThrow(); @@ -154,7 +154,7 @@ describe("Global CAS directory", () => { await mkdir(storageRoot, { recursive: true }); const uwfSeed = await createUwfStore(storageRoot); - const hash = await uwfSeed.store.put(uwfSeed.schemas.text, "migrated-workflow"); + const hash = await uwfSeed.store.cas.put(uwfSeed.schemas.text, "migrated-workflow"); const registryPath = getRegistryPath(storageRoot); const { writeFile, access, readFile } = await import("node:fs/promises"); @@ -180,7 +180,7 @@ describe("Global CAS directory", () => { const threadId = "01JTEST0000000000000000AB" as ThreadId; const uwfSeed = await createUwfStore(storageRoot); - const headHash = await uwfSeed.store.put(uwfSeed.schemas.text, "migrated-thread-head"); + const headHash = await uwfSeed.store.cas.put(uwfSeed.schemas.text, "migrated-thread-head"); const { writeFile, access, readFile } = await import("node:fs/promises"); const threadsPath = join(storageRoot, "threads.yaml"); await writeFile(threadsPath, `${threadId}: ${headHash}\n`, "utf8"); @@ -204,7 +204,7 @@ describe("Global CAS directory", () => { const threadId = "01JTEST000000000000000123" as ThreadId; const uwfSeed = await createUwfStore(storageRoot); - const headHash = await uwfSeed.store.put(uwfSeed.schemas.text, "hash-456"); + const headHash = await uwfSeed.store.cas.put(uwfSeed.schemas.text, "hash-456"); setThread(uwfSeed.varStore, threadId, createThreadIndexEntry(headHash)); const uwf = await createUwfStore(storageRoot); @@ -225,7 +225,7 @@ describe("Global CAS directory", () => { const uwf = await createUwfStore(storageRoot); const threadId = "thread-123" as ThreadId; - const headHash = await uwf.store.put(uwf.schemas.text, "history-head"); + const headHash = await uwf.store.cas.put(uwf.schemas.text, "history-head"); const { addHistoryEntry, findHistoryEntry } = await import("../store.js"); addHistoryEntry(uwf.varStore, { thread: threadId, @@ -241,7 +241,7 @@ describe("Global CAS directory", () => { expect(entry?.head).toBe(headHash); const { access } = await import("node:fs/promises"); - await access(join(globalCasDir, "variables.db")); + await access(join(globalCasDir, "vars")); const historyPath = join(storageRoot, "history.jsonl"); await expect(access(historyPath)).rejects.toThrow(); @@ -256,8 +256,8 @@ describe("Global CAS directory", () => { const threadId = "01JTEST0000000000000000CD" as ThreadId; const uwfSeed = await createUwfStore(storageRoot); - const workflowHash = await uwfSeed.store.put(uwfSeed.schemas.text, "migrated-workflow"); - const headHash = await uwfSeed.store.put(uwfSeed.schemas.text, "migrated-head"); + const workflowHash = await uwfSeed.store.cas.put(uwfSeed.schemas.text, "migrated-workflow"); + const headHash = await uwfSeed.store.cas.put(uwfSeed.schemas.text, "migrated-head"); const completedAt = 1780410000000; const { writeFile, access, readFile } = await import("node:fs/promises"); const historyPath = join(storageRoot, "history.jsonl"); @@ -301,7 +301,7 @@ describe("Global CAS directory", () => { // Store a CAS node const testPayload = JSON.stringify({ test: "node" }); - const _hash = uwf.store.put(uwf.schemas.text, testPayload); + const _hash = uwf.store.cas.put(uwf.schemas.text, testPayload); // Verify the node is in global CAS directory const { readdir } = await import("node:fs/promises"); diff --git a/packages/cli/src/__tests__/store-storage-root.test.ts b/packages/cli/src/__tests__/store-storage-root.test.ts index b62010f..0842d17 100644 --- a/packages/cli/src/__tests__/store-storage-root.test.ts +++ b/packages/cli/src/__tests__/store-storage-root.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { homedir } from "node:os"; import { join } from "node:path"; import { getDefaultStorageRoot, getGlobalCasDir, resolveStorageRoot } from "../store.js"; diff --git a/packages/cli/src/__tests__/thread-cancel-status.test.ts b/packages/cli/src/__tests__/thread-cancel-status.test.ts index f50940c..ee19b5b 100644 --- a/packages/cli/src/__tests__/thread-cancel-status.test.ts +++ b/packages/cli/src/__tests__/thread-cancel-status.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { mkdir, mkdtemp } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -16,7 +16,7 @@ async function seedHistoryHead( uwf: Awaited>, label: string, ): Promise { - return (await uwf.store.put(uwf.schemas.text, label)) as CasRef; + return (await uwf.store.cas.put(uwf.schemas.text, label)) as CasRef; } describe("thread cancel status", () => { diff --git a/packages/cli/src/__tests__/thread-list-filters.test.ts b/packages/cli/src/__tests__/thread-list-filters.test.ts index 717e97b..bfe0372 100644 --- a/packages/cli/src/__tests__/thread-list-filters.test.ts +++ b/packages/cli/src/__tests__/thread-list-filters.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -39,7 +39,7 @@ async function createTestWorkflow(uwf: UwfStore): Promise { graph: { start: "role1" }, conditions: {}, }; - return await uwf.store.put(uwf.schemas.workflow, workflowPayload); + return await uwf.store.cas.put(uwf.schemas.workflow, workflowPayload); } async function createTestThread( @@ -54,7 +54,7 @@ async function createTestThread( prompt: "test prompt", cwd: storageRoot, }; - const headHash = await uwf.store.put(uwf.schemas.startNode, startPayload); + const headHash = await uwf.store.cas.put(uwf.schemas.startNode, startPayload); setThread(uwf.varStore, threadId, createThreadIndexEntry(headHash)); @@ -494,7 +494,7 @@ describe("edge cases", () => { const uwfIdx = await createUwfStore(tmpDir); const index = loadAllThreads(uwfIdx.varStore); - const placeholderHead = (await uwfIdx.store.put( + const placeholderHead = (await uwfIdx.store.cas.put( uwfIdx.schemas.text, "invalid-ulid-placeholder", )) as CasRef; diff --git a/packages/cli/src/__tests__/thread-location.test.ts b/packages/cli/src/__tests__/thread-location.test.ts index fd8f73f..c9d80c1 100644 --- a/packages/cli/src/__tests__/thread-location.test.ts +++ b/packages/cli/src/__tests__/thread-location.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { mkdir, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -82,7 +82,7 @@ graph: const headHash = getThread(uwf.varStore, result.thread as ThreadId)!.head; expect(headHash).toBeDefined(); - const startNode = uwf.store.get(headHash as CasRef); + const startNode = uwf.store.cas.get(headHash as CasRef); expect(startNode).not.toBe(null); expect(startNode?.type).toBe(uwf.schemas.startNode); @@ -175,7 +175,7 @@ graph: const uwf = await createUwfStore(storageRoot); const headHash = getThread(uwf.varStore, result.thread as ThreadId)!.head; - const startNode = uwf.store.get(headHash as CasRef); + const startNode = uwf.store.cas.get(headHash as CasRef); const startPayload = startNode?.payload as StartNodePayload; // Should default to process.cwd() diff --git a/packages/cli/src/__tests__/thread-read-quota.test.ts b/packages/cli/src/__tests__/thread-read-quota.test.ts index 830e784..bd3dfe0 100644 --- a/packages/cli/src/__tests__/thread-read-quota.test.ts +++ b/packages/cli/src/__tests__/thread-read-quota.test.ts @@ -1,9 +1,9 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { bootstrap, putSchema } from "@ocas/core"; -import { createFsStore } from "@ocas/fs"; +import { openStore } from "@ocas/fs"; import type { CasRef, ThreadId } from "@united-workforce/protocol"; import { cmdThreadRead } from "../commands/thread.js"; import { registerUwfSchemas } from "../schemas.js"; @@ -49,7 +49,7 @@ const DETAIL_SCHEMA = { // ── helpers ─────────────────────────────────────────────────────────────────── -async function registerDetailSchemas(store: ReturnType) { +async function registerDetailSchemas(store: Awaited>) { await bootstrap(store); const [turn, detail] = await Promise.all([ putSchema(store, TURN_SCHEMA), @@ -91,11 +91,11 @@ describe("thread read --quota flag", () => { test("test 1: basic quota enforcement with 3 steps", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -112,12 +112,12 @@ describe("thread read --quota flag", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -129,21 +129,21 @@ describe("thread read --quota flag", () => { const steps: CasRef[] = []; for (let i = 1; i <= 3; i++) { const content = generateContent(500, `Step${i}`); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content, toolCalls: null, reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: `session-${i}`, model: "test-model", duration: 1000, turnCount: 1, turns: [turnHash], }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: steps[i - 2] ?? null, role: "worker", @@ -176,11 +176,11 @@ describe("thread read --quota flag", () => { test("test 2: quota check order - verifies bug is fixed", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -197,12 +197,12 @@ describe("thread read --quota flag", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -212,21 +212,21 @@ describe("thread read --quota flag", () => { // Create 2 steps: first=300 chars, second=600 chars const step1Content = generateContent(300, "First"); - const step1TurnHash = await store.put(detailSchemas.turn, { + const step1TurnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: step1Content, toolCalls: null, reasoning: null, }); - const step1DetailHash = await store.put(detailSchemas.detail, { + const step1DetailHash = await store.cas.put(detailSchemas.detail, { sessionId: "session-1", model: "test-model", duration: 1000, turnCount: 1, turns: [step1TurnHash], }); - const step1Hash = await store.put(schemas.stepNode, { + const step1Hash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -239,21 +239,21 @@ describe("thread read --quota flag", () => { }); const step2Content = generateContent(600, "Second"); - const step2TurnHash = await store.put(detailSchemas.turn, { + const step2TurnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: step2Content, toolCalls: null, reasoning: null, }); - const step2DetailHash = await store.put(detailSchemas.detail, { + const step2DetailHash = await store.cas.put(detailSchemas.detail, { sessionId: "session-2", model: "test-model", duration: 1000, turnCount: 1, turns: [step2TurnHash], }); - const step2Hash = await store.put(schemas.stepNode, { + const step2Hash = await store.cas.put(schemas.stepNode, { start: startHash, prev: step1Hash, role: "worker", @@ -287,11 +287,11 @@ describe("thread read --quota flag", () => { test("test 3: quota with --start section", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -308,12 +308,12 @@ describe("thread read --quota flag", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task with a moderately long prompt to test quota accounting", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -325,21 +325,21 @@ describe("thread read --quota flag", () => { const steps: CasRef[] = []; for (let i = 1; i <= 2; i++) { const content = generateContent(400, `Step${i}`); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content, toolCalls: null, reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: `session-${i}`, model: "test-model", duration: 1000, turnCount: 1, turns: [turnHash], }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: steps[i - 2] ?? null, role: "worker", @@ -370,11 +370,11 @@ describe("thread read --quota flag", () => { test("test 5a: quota edge case - minimal quota", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -391,12 +391,12 @@ describe("thread read --quota flag", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -405,21 +405,21 @@ describe("thread read --quota flag", () => { }); const content = generateContent(500, "Test"); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content, toolCalls: null, reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: "session-1", model: "test-model", duration: 1000, turnCount: 1, turns: [turnHash], }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -445,11 +445,11 @@ describe("thread read --quota flag", () => { test("test 5b: quota edge case - very large quota", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -466,12 +466,12 @@ describe("thread read --quota flag", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -483,21 +483,21 @@ describe("thread read --quota flag", () => { const steps: CasRef[] = []; for (let i = 1; i <= 3; i++) { const content = generateContent(300, `Step${i}`); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content, toolCalls: null, reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: `session-${i}`, model: "test-model", duration: 1000, turnCount: 1, turns: [turnHash], }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: steps[i - 2] ?? null, role: "worker", @@ -527,11 +527,11 @@ describe("thread read --quota flag", () => { test("test 6: quota with --before parameter", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const detailSchemas = await registerDetailSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -548,12 +548,12 @@ describe("thread read --quota flag", () => { graph: {}, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test task", }); - const outputHash = await store.put(schemas.workflow, { + const outputHash = await store.cas.put(schemas.workflow, { name: "out", description: "", roles: {}, @@ -565,21 +565,21 @@ describe("thread read --quota flag", () => { const steps: CasRef[] = []; for (let i = 1; i <= 5; i++) { const content = generateContent(300, `Step${i}`); - const turnHash = await store.put(detailSchemas.turn, { + const turnHash = await store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content, toolCalls: null, reasoning: null, }); - const detailHash = await store.put(detailSchemas.detail, { + const detailHash = await store.cas.put(detailSchemas.detail, { sessionId: `session-${i}`, model: "test-model", duration: 1000, turnCount: 1, turns: [turnHash], }); - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: steps[i - 2] ?? null, role: "worker", diff --git a/packages/cli/src/__tests__/thread-read-xml-tags.test.ts b/packages/cli/src/__tests__/thread-read-xml-tags.test.ts index 905e2f2..9edb226 100644 --- a/packages/cli/src/__tests__/thread-read-xml-tags.test.ts +++ b/packages/cli/src/__tests__/thread-read-xml-tags.test.ts @@ -1,9 +1,8 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; -import { bootstrap, putSchema } from "@ocas/core"; -import type { createFsStore } from "@ocas/fs"; +import { bootstrap, putSchema, type Store } from "@ocas/core"; import type { CasRef, ThreadId } from "@united-workforce/protocol"; import { cmdThreadRead, THREAD_READ_DEFAULT_QUOTA } from "../commands/thread.js"; import type { UwfStore } from "../store.js"; @@ -57,7 +56,7 @@ async function makeUwfStore(storageRoot: string): Promise { return createUwfStore(storageRoot); } -async function registerDetailSchemas(store: ReturnType) { +async function registerDetailSchemas(store: Store) { await bootstrap(store); const [turn, detail] = await Promise.all([ putSchema(store, TURN_SCHEMA), @@ -85,7 +84,7 @@ describe("thread read XML tag isolation", () => { const uwf = await makeUwfStore(tmpDir); const detailSchemas = await registerDetailSchemas(uwf.store); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -102,12 +101,12 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Fix issue #459", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -115,7 +114,7 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const turnHash = await uwf.store.put(detailSchemas.turn, { + const turnHash = await uwf.store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: @@ -123,7 +122,7 @@ describe("thread read XML tag isolation", () => { toolCalls: null, reasoning: null, }); - const detailHash = await uwf.store.put(detailSchemas.detail, { + const detailHash = await uwf.store.cas.put(detailSchemas.detail, { sessionId: "sx", model: "mx", duration: 500, @@ -131,7 +130,7 @@ describe("thread read XML tag isolation", () => { turns: [turnHash], }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "planner", @@ -164,7 +163,7 @@ describe("thread read XML tag isolation", () => { const uwf = await makeUwfStore(tmpDir); const detailSchemas = await registerDetailSchemas(uwf.store); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -181,12 +180,12 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Fix issue", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -194,14 +193,14 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const turnHash = await uwf.store.put(detailSchemas.turn, { + const turnHash = await uwf.store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: "---\nstatus: ready\n---\n\nContent here...", toolCalls: null, reasoning: null, }); - const detailHash = await uwf.store.put(detailSchemas.detail, { + const detailHash = await uwf.store.cas.put(detailSchemas.detail, { sessionId: "sx", model: "mx", duration: 500, @@ -209,7 +208,7 @@ describe("thread read XML tag isolation", () => { turns: [turnHash], }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "planner", @@ -242,7 +241,7 @@ describe("thread read XML tag isolation", () => { test("scenario 3: same role repeated does not show prompt twice", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -259,12 +258,12 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Write something", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -272,7 +271,7 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const step1 = await uwf.store.put(uwf.schemas.stepNode, { + const step1 = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "writer", @@ -284,7 +283,7 @@ describe("thread read XML tag isolation", () => { assembledPrompt: null, }); - const step2 = await uwf.store.put(uwf.schemas.stepNode, { + const step2 = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: step1 as CasRef, role: "writer", @@ -309,7 +308,7 @@ describe("thread read XML tag isolation", () => { test("scenario 4: step with no detail shows no output tags", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -326,12 +325,12 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Do stuff", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -339,7 +338,7 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -370,7 +369,7 @@ describe("thread read XML tag isolation", () => { test("scenario 5: empty content shows no output tags", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: {}, @@ -378,12 +377,12 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Do stuff", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -394,7 +393,7 @@ describe("thread read XML tag isolation", () => { // A detail ref that doesn't exist → extractLastAssistantContent returns null const missingDetailRef = "missingdetail0" as CasRef; - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -419,7 +418,7 @@ describe("thread read XML tag isolation", () => { test("scenario 6: thread read with --start flag shows task section", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -436,12 +435,12 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Initial prompt", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -449,7 +448,7 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "roleA", @@ -478,7 +477,7 @@ describe("thread read XML tag isolation", () => { test("scenario 7: thread read with --before parameter", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -511,12 +510,12 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Initial prompt", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -524,7 +523,7 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const step1 = await uwf.store.put(uwf.schemas.stepNode, { + const step1 = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "roleA", @@ -536,7 +535,7 @@ describe("thread read XML tag isolation", () => { assembledPrompt: null, }); - const step2 = await uwf.store.put(uwf.schemas.stepNode, { + const step2 = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: step1 as CasRef, role: "roleB", @@ -548,7 +547,7 @@ describe("thread read XML tag isolation", () => { assembledPrompt: null, }); - const step3 = await uwf.store.put(uwf.schemas.stepNode, { + const step3 = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: step2 as CasRef, role: "roleC", @@ -584,7 +583,7 @@ describe("thread read XML tag isolation", () => { const uwf = await makeUwfStore(tmpDir); const detailSchemas = await registerDetailSchemas(uwf.store); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -601,12 +600,12 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Write something", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -614,14 +613,14 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const turnHash = await uwf.store.put(detailSchemas.turn, { + const turnHash = await uwf.store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: "Content with & characters > like ", toolCalls: null, reasoning: null, }); - const detailHash = await uwf.store.put(detailSchemas.detail, { + const detailHash = await uwf.store.cas.put(detailSchemas.detail, { sessionId: "sx", model: "mx", duration: 500, @@ -629,7 +628,7 @@ describe("thread read XML tag isolation", () => { turns: [turnHash], }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "writer", @@ -653,7 +652,7 @@ describe("thread read XML tag isolation", () => { test("scenario 10: quota limit with XML tags", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -670,12 +669,12 @@ describe("thread read XML tag isolation", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Initial prompt", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -686,7 +685,7 @@ describe("thread read XML tag isolation", () => { const steps: CasRef[] = []; let prev: CasRef | null = null; for (let i = 0; i < 5; i++) { - const step = (await uwf.store.put(uwf.schemas.stepNode, { + const step = (await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev, role: "roleA", diff --git a/packages/cli/src/__tests__/thread-resume.test.ts b/packages/cli/src/__tests__/thread-resume.test.ts index 1d09aa9..099729e 100644 --- a/packages/cli/src/__tests__/thread-resume.test.ts +++ b/packages/cli/src/__tests__/thread-resume.test.ts @@ -1,10 +1,12 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { execFileSync } from "node:child_process"; import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { putSchema } from "@ocas/core"; -import { createFsStore } from "@ocas/fs"; +import { openStore } from "@ocas/fs"; import type { CasRef, StepNodePayload, ThreadId } from "@united-workforce/protocol"; import { cmdThreadShow } from "../commands/thread.js"; import { registerUwfSchemas } from "../schemas.js"; @@ -43,11 +45,11 @@ async function setupSuspendedThread(mode: MockAgentMode): Promise<{ const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const outputSchemaHash = await putSchema(store, OUTPUT_SCHEMA); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-resume", description: "resume command integration test", roles: { @@ -82,7 +84,7 @@ async function setupSuspendedThread(mode: MockAgentMode): Promise<{ }, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test resume task", cwd: tmpDir, @@ -91,16 +93,16 @@ async function setupSuspendedThread(mode: MockAgentMode): Promise<{ process.env.OCAS_DIR = casDir; await seedThreads(tmpDir, { [THREAD_ID]: startHash }); - const outputHash = await store.put(outputSchemaHash, { + const outputHash = await store.cas.put(outputSchemaHash, { $status: "needs_input", question: "Which API?", }); - const detailHash = await store.put(schemas.text, "mock detail"); + const detailHash = await store.cas.put(schemas.text, "mock detail"); const startedAtMs = 1716600000000; const completedAtMs = 1716600001500; - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -129,11 +131,11 @@ async function setupSuspendedThread(mode: MockAgentMode): Promise<{ mode === "suspend" ? { $status: "needs_input", question: "Which API?" } : { $status: "ok" }; const adapterJson = JSON.stringify({ - stepHash: await store.put(schemas.stepNode, { + stepHash: await store.cas.put(schemas.stepNode, { start: startHash, prev: stepHash, role: "worker", - output: await store.put(outputSchemaHash, frontmatter), + output: await store.cas.put(outputSchemaHash, frontmatter), detail: detailHash, agent: "uwf-mock", edgePrompt: "resume prompt placeholder", @@ -181,9 +183,9 @@ function runUwf( args: string[], casDir: string, ): { stdout: string; stderr: string; status: number } { - const cliPath = join(import.meta.dirname, "..", "cli.js"); + const cliPath = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "dist", "cli.js"); try { - const stdout = execFileSync("bun", ["run", cliPath, ...args], { + const stdout = execFileSync(process.execPath, [cliPath, ...args], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], env: { @@ -213,10 +215,10 @@ describe("uwf thread resume", () => { test("resume non-suspended thread returns error", async () => { const casDir = join(tmpDir, "cas"); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "idle-workflow", description: "idle thread", roles: { @@ -235,7 +237,7 @@ describe("uwf thread resume", () => { }, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "task", cwd: tmpDir, @@ -382,22 +384,22 @@ async function setupOkMockAgent( casDir: string, prevHead: CasRef, ): Promise<{ mockAgentPath: string }> { - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const outputSchemaHash = await putSchema(store, OUTPUT_SCHEMA); - const prevNode = store.get(prevHead); + const prevNode = store.cas.get(prevHead); if (prevNode === null || prevNode.type !== schemas.stepNode) { throw new Error(`expected StepNode at ${prevHead}`); } const prevPayload = prevNode.payload as StepNodePayload; - const outputHash = await store.put(outputSchemaHash, { $status: "ok" }); - const detailHash = await store.put(schemas.text, "ok detail"); + const outputHash = await store.cas.put(outputSchemaHash, { $status: "ok" }); + const detailHash = await store.cas.put(schemas.text, "ok detail"); const startedAtMs = Date.now(); const completedAtMs = startedAtMs + 1; - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: prevPayload.start, prev: prevHead, role: "worker", diff --git a/packages/cli/src/__tests__/thread-show-status.test.ts b/packages/cli/src/__tests__/thread-show-status.test.ts index 4ae35ed..dc42300 100644 --- a/packages/cli/src/__tests__/thread-show-status.test.ts +++ b/packages/cli/src/__tests__/thread-show-status.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { mkdir, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -96,15 +96,15 @@ async function insertStepNode( const head = headEntry.head; const outputSchemaHash = await putSchema(uwf.store, OUTPUT_SCHEMA); - const outputHash = await uwf.store.put(outputSchemaHash, outputPayload); - const detailHash = await uwf.store.put(uwf.schemas.text, "detail-placeholder"); + const outputHash = await uwf.store.cas.put(outputSchemaHash, outputPayload); + const detailHash = await uwf.store.cas.put(uwf.schemas.text, "detail-placeholder"); - const headNode = uwf.store.get(head); + const headNode = uwf.store.cas.get(head); if (headNode === null) throw new Error(`head ${head} not found`); const isStart = headNode.type === uwf.schemas.startNode; const startHash = isStart ? head : (headNode.payload as { start: CasRef }).start; - const stepHash = (await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = (await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: isStart ? null : head, role, diff --git a/packages/cli/src/__tests__/thread-start-cwd-cli.test.ts b/packages/cli/src/__tests__/thread-start-cwd-cli.test.ts index 15a1200..ed515bf 100644 --- a/packages/cli/src/__tests__/thread-start-cwd-cli.test.ts +++ b/packages/cli/src/__tests__/thread-start-cwd-cli.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { execFileSync } from "node:child_process"; import { mkdir, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; @@ -78,7 +78,7 @@ graph: const headHash = entry!.head; expect(headHash).toBeDefined(); - const startNode = uwf.store.get(headHash as CasRef); + const startNode = uwf.store.cas.get(headHash as CasRef); expect(startNode).not.toBe(null); expect(startNode?.type).toBe(uwf.schemas.startNode); @@ -136,14 +136,14 @@ graph: const uwfBin = join(process.cwd(), "dist", "cli.js"); // Register the workflow - execFileSync("bun", [uwfBin, "workflow", "add", workflowPath], { + execFileSync(process.execPath, [uwfBin, "workflow", "add", workflowPath], { env: { ...process.env, UWF_STORAGE_ROOT: storageRoot, OCAS_DIR: casDir }, encoding: "utf8", }); // Verify CLI accepts --cwd option (no error thrown) const output = execFileSync( - "bun", + process.execPath, [uwfBin, "thread", "start", "test-cwd-cli", "-p", "test prompt", "--cwd", testCwd], { env: { ...process.env, UWF_STORAGE_ROOT: storageRoot, OCAS_DIR: casDir }, diff --git a/packages/cli/src/__tests__/thread-step-count.test.ts b/packages/cli/src/__tests__/thread-step-count.test.ts index a4ba092..90c0934 100644 --- a/packages/cli/src/__tests__/thread-step-count.test.ts +++ b/packages/cli/src/__tests__/thread-step-count.test.ts @@ -1,8 +1,10 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { execFileSync } from "node:child_process"; import { join } from "node:path"; -const CLI_PATH = join(import.meta.dirname, "..", "cli.js"); +const CLI_PATH = join(dirname(fileURLToPath(import.meta.url)), "..", "cli.js"); function runCli(args: string[]): { stdout: string; stderr: string; exitCode: number } { try { diff --git a/packages/cli/src/__tests__/thread-suspend-step.test.ts b/packages/cli/src/__tests__/thread-suspend-step.test.ts index 1489baf..b9dc729 100644 --- a/packages/cli/src/__tests__/thread-suspend-step.test.ts +++ b/packages/cli/src/__tests__/thread-suspend-step.test.ts @@ -1,10 +1,12 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { execFileSync } from "node:child_process"; import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { putSchema } from "@ocas/core"; -import { createFsStore } from "@ocas/fs"; +import { openStore } from "@ocas/fs"; import type { CasRef, StepNodePayload, ThreadId } from "@united-workforce/protocol"; import { cmdThreadShow } from "../commands/thread.js"; import { registerUwfSchemas } from "../schemas.js"; @@ -38,12 +40,12 @@ describe("suspend step CAS chain and threads.yaml metadata", () => { process.env.OCAS_DIR = casDir; try { - const store = createFsStore(casDir); + const store = await openStore(casDir); const schemas = await registerUwfSchemas(store); const outputSchemaHash = await putSchema(store, OUTPUT_SCHEMA); - const workflowHash = await store.put(schemas.workflow, { + const workflowHash = await store.cas.put(schemas.workflow, { name: "test-suspend-step", description: "suspend step integration test", roles: { @@ -68,7 +70,7 @@ describe("suspend step CAS chain and threads.yaml metadata", () => { }, }); - const startHash = await store.put(schemas.startNode, { + const startHash = await store.cas.put(schemas.startNode, { workflow: workflowHash, prompt: "Test suspend task", cwd: tmpDir, @@ -77,16 +79,16 @@ describe("suspend step CAS chain and threads.yaml metadata", () => { const threadId = "01SUSPENDSTEPTEST0000000" as ThreadId; await seedThreads(tmpDir, { [threadId]: startHash }); - const outputHash = await store.put(outputSchemaHash, { + const outputHash = await store.cas.put(outputSchemaHash, { $status: "needs_input", question: "Which API?", }); - const detailHash = await store.put(schemas.text, "mock detail"); + const detailHash = await store.cas.put(schemas.text, "mock detail"); const startedAtMs = 1716600000000; const completedAtMs = 1716600001500; - const stepHash = await store.put(schemas.stepNode, { + const stepHash = await store.cas.put(schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -118,10 +120,10 @@ describe("suspend step CAS chain and threads.yaml metadata", () => { `defaultAgent: uwf-hermes\ndefaultModel: test-model\nagentOverrides: null\nagents: {}\nproviders: {}\nmodels: {}\n`, ); - const cliPath = join(import.meta.dirname, "..", "cli.js"); + const cliPath = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "dist", "cli.js"); const stdout = execFileSync( - "bun", - ["run", cliPath, "thread", "exec", threadId, "--agent", mockAgentPath], + process.execPath, + [cliPath, "thread", "exec", threadId, "--agent", mockAgentPath], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], @@ -141,14 +143,14 @@ describe("suspend step CAS chain and threads.yaml metadata", () => { expect(cliOutput.suspendedRole).toBe("worker"); expect(cliOutput.suspendMessage).toBe("Please clarify: Which API?"); - const storeAfter = createFsStore(casDir); - const stepNode = storeAfter.get(cliOutput.head as CasRef); + const storeAfter = await openStore(casDir); + const stepNode = storeAfter.cas.get(cliOutput.head as CasRef); expect(stepNode).not.toBeNull(); const payload = stepNode!.payload as StepNodePayload; expect(payload.role).toBe("worker"); expect(payload.output).toBe(outputHash); - const outputNode = storeAfter.get(outputHash); + const outputNode = storeAfter.cas.get(outputHash); expect(outputNode?.payload).toEqual({ $status: "needs_input", question: "Which API?", diff --git a/packages/cli/src/__tests__/thread-suspended-display.test.ts b/packages/cli/src/__tests__/thread-suspended-display.test.ts index 45ae96b..48659c6 100644 --- a/packages/cli/src/__tests__/thread-suspended-display.test.ts +++ b/packages/cli/src/__tests__/thread-suspended-display.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -41,7 +41,7 @@ describe("suspended thread display", () => { const outputSchemaHash = await putSchema(uwf.store, OUTPUT_SCHEMA); // Create test workflow with suspend capability - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-suspend-display", description: "test suspended display", roles: { @@ -66,7 +66,7 @@ describe("suspended thread display", () => { }, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Test task requiring input", cwd: tmpDir, @@ -74,13 +74,13 @@ describe("suspended thread display", () => { // Create suspended thread const suspendedThreadId = "01SUSPENDEDTHREAD0000000" as ThreadId; - const outputHash = await uwf.store.put(outputSchemaHash, { + const outputHash = await uwf.store.cas.put(outputSchemaHash, { $status: "needs_input", question: "What is the target API?", }); - const detailHash = await uwf.store.put(uwf.schemas.text, "mock detail"); + const detailHash = await uwf.store.cas.put(uwf.schemas.text, "mock detail"); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -103,7 +103,7 @@ describe("suspended thread display", () => { // Create normal (idle) thread const idleThreadId = "01IDLETHREAD00000000000" as ThreadId; - const idleStartHash = await uwf.store.put(uwf.schemas.startNode, { + const idleStartHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Normal task", cwd: tmpDir, @@ -148,7 +148,7 @@ describe("suspended thread display", () => { const uwf = await createUwfStore(tmpDir); const outputSchemaHash = await putSchema(uwf.store, OUTPUT_SCHEMA); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-suspend-show", description: "test suspended show", roles: { @@ -173,20 +173,20 @@ describe("suspended thread display", () => { }, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Test task", cwd: tmpDir, }); const threadId = "01SUSPENDSHOW000000000" as ThreadId; - const outputHash = await uwf.store.put(outputSchemaHash, { + const outputHash = await uwf.store.cas.put(outputSchemaHash, { $status: "needs_input", question: "Which database to use?", }); - const detailHash = await uwf.store.put(uwf.schemas.text, "mock detail"); + const detailHash = await uwf.store.cas.put(uwf.schemas.text, "mock detail"); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -235,7 +235,7 @@ describe("suspended thread display", () => { try { const uwf = await createUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-normal", description: "test normal thread", roles: { @@ -252,7 +252,7 @@ describe("suspended thread display", () => { }, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Normal task", cwd: tmpDir, diff --git a/packages/cli/src/__tests__/thread-test-helpers.ts b/packages/cli/src/__tests__/thread-test-helpers.ts index cd1bdc8..2dc7876 100644 --- a/packages/cli/src/__tests__/thread-test-helpers.ts +++ b/packages/cli/src/__tests__/thread-test-helpers.ts @@ -7,10 +7,10 @@ async function ensureHeadInCas( head: CasRef, threadId: ThreadId, ): Promise { - if (uwf.store.get(head) !== null) { + if (uwf.store.cas.get(head) !== null) { return head; } - return (await uwf.store.put(uwf.schemas.text, `thread-head:${threadId}:${head}`)) as CasRef; + return (await uwf.store.cas.put(uwf.schemas.text, `thread-head:${threadId}:${head}`)) as CasRef; } export async function seedThread( diff --git a/packages/cli/src/__tests__/thread.test.ts b/packages/cli/src/__tests__/thread.test.ts index 2388c85..2374fd4 100644 --- a/packages/cli/src/__tests__/thread.test.ts +++ b/packages/cli/src/__tests__/thread.test.ts @@ -1,9 +1,8 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; -import { bootstrap, putSchema } from "@ocas/core"; -import type { createFsStore } from "@ocas/fs"; +import { bootstrap, putSchema, type Store } from "@ocas/core"; import type { CasRef, ThreadId } from "@united-workforce/protocol"; import { cmdStepList, cmdStepShow } from "../commands/step.js"; import { @@ -62,7 +61,7 @@ async function makeUwfStore(storageRoot: string): Promise { return createUwfStore(storageRoot); } -async function registerDetailSchemas(store: ReturnType) { +async function registerDetailSchemas(store: Store) { await bootstrap(store); const [turn, detail] = await Promise.all([ putSchema(store, TURN_SCHEMA), @@ -90,21 +89,21 @@ describe("extractLastAssistantContent", () => { const uwf = await makeUwfStore(tmpDir); const schemas = await registerDetailSchemas(uwf.store); - const turn1 = await uwf.store.put(schemas.turn, { + const turn1 = await uwf.store.cas.put(schemas.turn, { index: 0, role: "assistant", content: "intermediate", toolCalls: null, reasoning: null, }); - const turn2 = await uwf.store.put(schemas.turn, { + const turn2 = await uwf.store.cas.put(schemas.turn, { index: 1, role: "tool", content: "ok", toolCalls: null, reasoning: null, }); - const turn3 = await uwf.store.put(schemas.turn, { + const turn3 = await uwf.store.cas.put(schemas.turn, { index: 2, role: "assistant", content: "final answer", @@ -112,7 +111,7 @@ describe("extractLastAssistantContent", () => { reasoning: null, }); - const detailHash = await uwf.store.put(schemas.detail, { + const detailHash = await uwf.store.cas.put(schemas.detail, { sessionId: "s1", model: "m1", duration: 1000, @@ -132,7 +131,7 @@ describe("extractLastAssistantContent", () => { const uwf = await makeUwfStore(tmpDir); const schemas = await registerDetailSchemas(uwf.store); - const detailHash = await uwf.store.put(schemas.detail, { + const detailHash = await uwf.store.cas.put(schemas.detail, { sessionId: "s2", model: "m2", duration: 0, @@ -147,7 +146,7 @@ describe("extractLastAssistantContent", () => { const uwf = await makeUwfStore(tmpDir); const schemas = await registerDetailSchemas(uwf.store); - const turn1 = await uwf.store.put(schemas.turn, { + const turn1 = await uwf.store.cas.put(schemas.turn, { index: 0, role: "assistant", content: "", @@ -155,7 +154,7 @@ describe("extractLastAssistantContent", () => { reasoning: null, }); - const detailHash = await uwf.store.put(schemas.detail, { + const detailHash = await uwf.store.cas.put(schemas.detail, { sessionId: "s3", model: "m3", duration: 0, @@ -170,14 +169,14 @@ describe("extractLastAssistantContent", () => { const uwf = await makeUwfStore(tmpDir); const schemas = await registerDetailSchemas(uwf.store); - const turn1 = await uwf.store.put(schemas.turn, { + const turn1 = await uwf.store.cas.put(schemas.turn, { index: 0, role: "assistant", content: "real content", toolCalls: null, reasoning: null, }); - const turn2 = await uwf.store.put(schemas.turn, { + const turn2 = await uwf.store.cas.put(schemas.turn, { index: 1, role: "assistant", content: " ", @@ -185,7 +184,7 @@ describe("extractLastAssistantContent", () => { reasoning: null, }); - const detailHash = await uwf.store.put(schemas.detail, { + const detailHash = await uwf.store.cas.put(schemas.detail, { sessionId: "s4", model: "m4", duration: 0, @@ -204,7 +203,7 @@ describe("cmdThreadRead section", () => { const uwf = await makeUwfStore(tmpDir); const detailSchemas = await registerDetailSchemas(uwf.store); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf", description: "desc", roles: { @@ -221,12 +220,12 @@ describe("cmdThreadRead section", () => { graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Write something", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -234,14 +233,14 @@ describe("cmdThreadRead section", () => { graph: {}, }); - const turnHash = await uwf.store.put(detailSchemas.turn, { + const turnHash = await uwf.store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: "The assistant response text", toolCalls: null, reasoning: null, }); - const detailHash = await uwf.store.put(detailSchemas.detail, { + const detailHash = await uwf.store.cas.put(detailSchemas.detail, { sessionId: "sx", model: "mx", duration: 500, @@ -249,7 +248,7 @@ describe("cmdThreadRead section", () => { turns: [turnHash], }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "writer", @@ -272,18 +271,18 @@ describe("cmdThreadRead section", () => { test("omits tags when detail has no matching assistant turns", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf2", description: "desc", roles: {}, conditions: {}, graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Do stuff", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -294,7 +293,7 @@ describe("cmdThreadRead section", () => { // A detail ref that doesn't exist in the store → extractLastAssistantContent returns null const missingDetailRef = "missingdetail0" as CasRef; - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "worker", @@ -321,18 +320,18 @@ describe("cmdStepShow", () => { const uwf = await makeUwfStore(tmpDir); const detailSchemas = await registerDetailSchemas(uwf.store); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "wf", description: "", roles: {}, conditions: {}, graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "p", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -340,14 +339,14 @@ describe("cmdStepShow", () => { graph: {}, }); - const turnHash = await uwf.store.put(detailSchemas.turn, { + const turnHash = await uwf.store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: "done", toolCalls: null, reasoning: null, }); - const detailHash = await uwf.store.put(detailSchemas.detail, { + const detailHash = await uwf.store.cas.put(detailSchemas.detail, { sessionId: "sess42", model: "gpt-4o", duration: 3000, @@ -355,7 +354,7 @@ describe("cmdStepShow", () => { turns: [turnHash], }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "coder", @@ -400,18 +399,18 @@ describe("cmdThreadRead deduplication", () => { meta: "placeholder00" as CasRef, }; } - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "dedup-wf", description: "desc", roles: roleMap, conditions: {}, graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Start", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -422,7 +421,7 @@ describe("cmdThreadRead deduplication", () => { let prev: string | null = null; let stepHash = ""; for (const role of roles) { - stepHash = await uwf.store.put(uwf.schemas.stepNode, { + stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: prev as CasRef | null, role, @@ -477,7 +476,7 @@ describe("cmdThreadRead start section / before / quota", () => { roles: string[], ): Promise<{ startHash: CasRef; stepHashes: CasRef[] }> { const uniqueRoles = [...new Set(roles)]; - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "simple-wf", description: "desc", roles: Object.fromEntries( @@ -496,11 +495,11 @@ describe("cmdThreadRead start section / before / quota", () => { conditions: {}, graph: {}, }); - const startHash = (await uwf.store.put(uwf.schemas.startNode, { + const startHash = (await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Initial prompt", })) as CasRef; - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -511,7 +510,7 @@ describe("cmdThreadRead start section / before / quota", () => { const stepHashes: CasRef[] = []; let prev: CasRef | null = null; for (const role of roles) { - const stepHash = (await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = (await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev, role, @@ -593,7 +592,7 @@ describe("cmdStepShow (process.exit tests - must be last)", () => { test("before with unknown hash rejects", async () => { const uwfStore = await makeUwfStore(tmpDir); - const workflowHash = await uwfStore.store.put(uwfStore.schemas.workflow, { + const workflowHash = await uwfStore.store.cas.put(uwfStore.schemas.workflow, { name: "wf2", description: "", roles: { @@ -609,18 +608,18 @@ describe("cmdStepShow (process.exit tests - must be last)", () => { conditions: {}, graph: {}, }); - const startHash = await uwfStore.store.put(uwfStore.schemas.startNode, { + const startHash = await uwfStore.store.cas.put(uwfStore.schemas.startNode, { workflow: workflowHash, prompt: "p", }); - const outputHash = await uwfStore.store.put(uwfStore.schemas.workflow, { + const outputHash = await uwfStore.store.cas.put(uwfStore.schemas.workflow, { name: "out", description: "", roles: {}, conditions: {}, graph: {}, }); - const stepHash = await uwfStore.store.put(uwfStore.schemas.stepNode, { + const stepHash = await uwfStore.store.cas.put(uwfStore.schemas.stepNode, { start: startHash, prev: null, role: "roleA", @@ -648,18 +647,18 @@ describe("cmdStepList with completed threads", () => { test("lists steps from active thread", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf-active", description: "desc", roles: {}, conditions: {}, graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Start prompt", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -667,7 +666,7 @@ describe("cmdStepList with completed threads", () => { graph: {}, }); - const step1Hash = await uwf.store.put(uwf.schemas.stepNode, { + const step1Hash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "role1", @@ -675,7 +674,7 @@ describe("cmdStepList with completed threads", () => { detail: null, agent: "uwf-test", }); - const step2Hash = await uwf.store.put(uwf.schemas.stepNode, { + const step2Hash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: step1Hash, role: "role2", @@ -683,7 +682,7 @@ describe("cmdStepList with completed threads", () => { detail: null, agent: "uwf-test", }); - const step3Hash = await uwf.store.put(uwf.schemas.stepNode, { + const step3Hash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: step2Hash, role: "role3", @@ -707,18 +706,18 @@ describe("cmdStepList with completed threads", () => { test("lists steps from completed thread", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf-completed", description: "desc", roles: {}, conditions: {}, graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Start prompt", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -726,7 +725,7 @@ describe("cmdStepList with completed threads", () => { graph: {}, }); - const step1Hash = await uwf.store.put(uwf.schemas.stepNode, { + const step1Hash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "roleA", @@ -734,7 +733,7 @@ describe("cmdStepList with completed threads", () => { detail: null, agent: "uwf-test", }); - const step2Hash = await uwf.store.put(uwf.schemas.stepNode, { + const step2Hash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: step1Hash, role: "roleB", @@ -768,18 +767,18 @@ describe("cmdStepShow with completed threads", () => { const uwf = await makeUwfStore(tmpDir); const detailSchemas = await registerDetailSchemas(uwf.store); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf-step-active", description: "desc", roles: {}, conditions: {}, graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "p", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -787,14 +786,14 @@ describe("cmdStepShow with completed threads", () => { graph: {}, }); - const turnHash = await uwf.store.put(detailSchemas.turn, { + const turnHash = await uwf.store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: "Active thread response", toolCalls: null, reasoning: null, }); - const detailHash = await uwf.store.put(detailSchemas.detail, { + const detailHash = await uwf.store.cas.put(detailSchemas.detail, { sessionId: "sess-active", model: "model-x", duration: 1234, @@ -802,7 +801,7 @@ describe("cmdStepShow with completed threads", () => { turns: [turnHash], }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "coder", @@ -828,18 +827,18 @@ describe("cmdStepShow with completed threads", () => { const uwf = await makeUwfStore(tmpDir); const detailSchemas = await registerDetailSchemas(uwf.store); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf-step-completed", description: "desc", roles: {}, conditions: {}, graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "p", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -847,14 +846,14 @@ describe("cmdStepShow with completed threads", () => { graph: {}, }); - const turnHash = await uwf.store.put(detailSchemas.turn, { + const turnHash = await uwf.store.cas.put(detailSchemas.turn, { index: 0, role: "assistant", content: "Completed thread response", toolCalls: null, reasoning: null, }); - const detailHash = await uwf.store.put(detailSchemas.detail, { + const detailHash = await uwf.store.cas.put(detailSchemas.detail, { sessionId: "sess-completed", model: "model-y", duration: 5678, @@ -862,7 +861,7 @@ describe("cmdStepShow with completed threads", () => { turns: [turnHash], }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "reviewer", @@ -897,7 +896,7 @@ describe("cmdThreadRead with completed threads", () => { test("reads completed thread context", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf-read-completed", description: "desc", roles: { @@ -913,11 +912,11 @@ describe("cmdThreadRead with completed threads", () => { conditions: {}, graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Write something", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -925,7 +924,7 @@ describe("cmdThreadRead with completed threads", () => { graph: {}, }); - const stepHash = await uwf.store.put(uwf.schemas.stepNode, { + const stepHash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "writer", @@ -954,18 +953,18 @@ describe("cmdThreadRead with completed threads", () => { test("reads completed thread with before filter", async () => { const uwf = await makeUwfStore(tmpDir); - const workflowHash = await uwf.store.put(uwf.schemas.workflow, { + const workflowHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "test-wf-read-before", description: "desc", roles: {}, conditions: {}, graph: {}, }); - const startHash = await uwf.store.put(uwf.schemas.startNode, { + const startHash = await uwf.store.cas.put(uwf.schemas.startNode, { workflow: workflowHash, prompt: "Do task", }); - const outputHash = await uwf.store.put(uwf.schemas.workflow, { + const outputHash = await uwf.store.cas.put(uwf.schemas.workflow, { name: "out", description: "", roles: {}, @@ -973,7 +972,7 @@ describe("cmdThreadRead with completed threads", () => { graph: {}, }); - const step1Hash = await uwf.store.put(uwf.schemas.stepNode, { + const step1Hash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: null, role: "roleX", @@ -981,7 +980,7 @@ describe("cmdThreadRead with completed threads", () => { detail: null, agent: "uwf-test", }); - const step2Hash = await uwf.store.put(uwf.schemas.stepNode, { + const step2Hash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: step1Hash, role: "roleY", @@ -989,7 +988,7 @@ describe("cmdThreadRead with completed threads", () => { detail: null, agent: "uwf-test", }); - const step3Hash = await uwf.store.put(uwf.schemas.stepNode, { + const step3Hash = await uwf.store.cas.put(uwf.schemas.stepNode, { start: startHash, prev: step2Hash, role: "roleZ", diff --git a/packages/cli/src/__tests__/validate-semantic.test.ts b/packages/cli/src/__tests__/validate-semantic.test.ts index 6d337ea..28efabb 100644 --- a/packages/cli/src/__tests__/validate-semantic.test.ts +++ b/packages/cli/src/__tests__/validate-semantic.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import type { WorkflowPayload } from "@united-workforce/protocol"; import { validateWorkflow } from "../validate-semantic.js"; diff --git a/packages/cli/src/__tests__/workflow-resolution.test.ts b/packages/cli/src/__tests__/workflow-resolution.test.ts index 84cc38b..e65df27 100644 --- a/packages/cli/src/__tests__/workflow-resolution.test.ts +++ b/packages/cli/src/__tests__/workflow-resolution.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -46,7 +46,7 @@ function makeMinimalPayload(name: string, description: string): WorkflowPayload async function storeWorkflow(uwf: UwfStore, name: string): Promise { const payload = makeMinimalPayload(name, "Test workflow"); - return await uwf.store.put(uwf.schemas.workflow, payload); + return await uwf.store.cas.put(uwf.schemas.workflow, payload); } async function createWorkflowYaml(name: string, version: string | null = null): Promise { @@ -124,7 +124,7 @@ describe("Strategy 2: File Path Resolution", () => { expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/); const uwf = await makeUwfStore(storageRoot); - const node = uwf.store.get(result.workflow); + const node = uwf.store.cas.get(result.workflow); expect(node).not.toBeNull(); if (node !== null) { expect((node.payload as WorkflowPayload).name).toBe("test-workflow"); @@ -187,7 +187,7 @@ describe("Strategy 3: Local Discovery", () => { expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/); const uwf = await makeUwfStore(storageRoot); - const node = uwf.store.get(result.workflow); + const node = uwf.store.cas.get(result.workflow); expect(node).not.toBeNull(); if (node !== null) { expect((node.payload as WorkflowPayload).name).toBe("solve-issue"); @@ -235,7 +235,7 @@ describe("Strategy 3: Local Discovery", () => { const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", projectRoot); const uwf = await makeUwfStore(storageRoot); - const node = uwf.store.get(result.workflow); + const node = uwf.store.cas.get(result.workflow); expect(node).not.toBeNull(); if (node !== null) { expect((node.payload as WorkflowPayload).description).toBe("Test workflow (1)"); @@ -263,7 +263,7 @@ describe("Strategy 3: Local Discovery", () => { expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/); const uwf = await makeUwfStore(storageRoot); - const node = uwf.store.get(result.workflow); + const node = uwf.store.cas.get(result.workflow); expect(node).not.toBeNull(); if (node !== null) { expect((node.payload as WorkflowPayload).name).toBe("solve-issue"); @@ -289,7 +289,7 @@ describe("Strategy 3: Local Discovery", () => { const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", projectRoot); const uwf = await makeUwfStore(storageRoot); - const node = uwf.store.get(result.workflow); + const node = uwf.store.cas.get(result.workflow); expect(node).not.toBeNull(); if (node !== null) { expect((node.payload as WorkflowPayload).description).toBe("Test workflow (flat)"); @@ -341,7 +341,7 @@ describe("Resolution Priority", () => { const result = await cmdThreadStart(storageRoot, explicitPath, "prompt", projectRoot); const uwf = await makeUwfStore(storageRoot); - const node = uwf.store.get(result.workflow); + const node = uwf.store.cas.get(result.workflow); expect(node).not.toBeNull(); if (node !== null) { expect((node.payload as WorkflowPayload).description).toBe("Test workflow (explicit)"); @@ -364,7 +364,7 @@ describe("Resolution Priority", () => { const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", projectRoot); const uwf2 = await makeUwfStore(storageRoot); - const node = uwf2.store.get(result.workflow); + const node = uwf2.store.cas.get(result.workflow); expect(node).not.toBeNull(); if (node !== null) { expect((node.payload as WorkflowPayload).description).toBe("Test workflow (local)"); diff --git a/packages/cli/src/commands/setup.ts b/packages/cli/src/commands/setup.ts index f7efe5e..5c8b04b 100644 --- a/packages/cli/src/commands/setup.ts +++ b/packages/cli/src/commands/setup.ts @@ -175,13 +175,11 @@ export async function _discoverAgents(): Promise { async function _tryWhichDiscovery(): Promise { try { - const proc = Bun.spawn(["which", "-a", "uwf-hermes", "uwf-claude-code", "uwf-cursor"], { - stdout: "pipe", - stderr: "pipe", + const { execFileSync } = await import("node:child_process"); + const text = execFileSync("which", ["-a", "uwf-hermes", "uwf-claude-code", "uwf-cursor"], { + encoding: "utf-8", + stdio: ["pipe", "pipe", "pipe"], }); - const text = await new Response(proc.stdout).text(); - await proc.exited; - if (proc.exitCode !== 0) return null; return _parseWhichOutput(text); } catch { return null; diff --git a/packages/cli/src/commands/shared.ts b/packages/cli/src/commands/shared.ts index 5da7dca..872521f 100644 --- a/packages/cli/src/commands/shared.ts +++ b/packages/cli/src/commands/shared.ts @@ -27,7 +27,7 @@ function fail(message: string): never { } function walkChain(uwf: UwfStore, headHash: CasRef): ChainState { - const headNode = uwf.store.get(headHash); + const headNode = uwf.store.cas.get(headHash); if (headNode === null) { fail(`CAS node not found: ${headHash}`); } @@ -49,7 +49,7 @@ function walkChain(uwf: UwfStore, headHash: CasRef): ChainState { let hash: CasRef | null = headHash; while (hash !== null) { - const node = uwf.store.get(hash); + const node = uwf.store.cas.get(hash); if (node === null) { fail(`CAS node not found while walking chain: ${hash}`); } @@ -66,7 +66,7 @@ function walkChain(uwf: UwfStore, headHash: CasRef): ChainState { fail(`empty step chain at head ${headHash}`); } - const startNode = uwf.store.get(newest.start); + const startNode = uwf.store.cas.get(newest.start); if (startNode === null || startNode.type !== uwf.schemas.startNode) { fail(`StartNode not found: ${newest.start}`); } @@ -80,7 +80,7 @@ function walkChain(uwf: UwfStore, headHash: CasRef): ChainState { } function expandOutput(uwf: UwfStore, outputRef: CasRef): unknown { - const node = uwf.store.get(outputRef); + const node = uwf.store.cas.get(outputRef); if (node === null) { return {}; } @@ -96,7 +96,7 @@ function expandDeep(store: CasStore, hash: CasRef, visited?: Set): unkno if (seen.has(hash)) return hash; // cycle guard seen.add(hash); - const node = store.get(hash); + const node = store.cas.get(hash); if (node === null) return hash; const schema = getSchema(store, node.type); @@ -177,7 +177,7 @@ function collectOrderedSteps( let hash: CasRef | null = headHash; const hashToNode = new Map(); while (hash !== null) { - const node = uwf.store.get(hash); + const node = uwf.store.cas.get(hash); if (node === null || node.type !== uwf.schemas.stepNode) { break; } diff --git a/packages/cli/src/commands/step.ts b/packages/cli/src/commands/step.ts index d1e5afa..dd5f50f 100644 --- a/packages/cli/src/commands/step.ts +++ b/packages/cli/src/commands/step.ts @@ -1,4 +1,4 @@ -import type { BootstrapCapableStore } from "@ocas/core"; +import type { CasStore } from "@ocas/core"; import type { CasRef, StartEntry, @@ -42,7 +42,7 @@ export async function cmdStepList( const uwf = await createUwfStore(storageRoot); const chain = walkChain(uwf, headHash); - const startNode = uwf.store.get(chain.startHash); + const startNode = uwf.store.cas.get(chain.startHash); if (startNode === null) { fail(`StartNode not found: ${chain.startHash}`); } @@ -81,7 +81,7 @@ export async function cmdStepList( */ export async function cmdStepShow(storageRoot: string, stepHash: CasRef): Promise { const uwf = await createUwfStore(storageRoot); - const node = uwf.store.get(stepHash); + const node = uwf.store.cas.get(stepHash); if (node === null) { fail(`CAS node not found: ${stepHash}`); } @@ -103,7 +103,7 @@ export async function cmdStepFork( stepHash: CasRef, ): Promise { const uwf = await createUwfStore(storageRoot); - const node = uwf.store.get(stepHash); + const node = uwf.store.cas.get(stepHash); if (node === null) { fail(`CAS node not found: ${stepHash}`); } @@ -129,7 +129,7 @@ export async function cmdStepFork( /** * Load and validate step detail node from CAS store */ -function loadStepDetail(store: BootstrapCapableStore, detailRef: CasRef): Record { +function loadStepDetail(store: CasStore, detailRef: CasRef): Record { const detailNode = store.get(detailRef); if (detailNode === null) { fail(`detail node not found: ${detailRef}`); @@ -178,7 +178,7 @@ function formatTurnBody(turn: TurnData): string { } function parseSingleTurn( - store: BootstrapCapableStore, + store: CasStore, turnRef: unknown, fallbackIndex: number, ): TurnData | null { @@ -206,7 +206,7 @@ function parseSingleTurn( /** * Load all turn nodes from CAS store and extract display fields */ -function loadTurnData(store: BootstrapCapableStore, turns: unknown): TurnData[] { +function loadTurnData(store: CasStore, turns: unknown): TurnData[] { if (!Array.isArray(turns) || turns.length === 0) { return []; } @@ -294,7 +294,7 @@ export async function cmdStepRead( showPrompt: boolean, ): Promise { const uwf = await createUwfStore(storageRoot); - const node = uwf.store.get(stepHash); + const node = uwf.store.cas.get(stepHash); if (node === null) { fail(`CAS node not found: ${stepHash}`); } @@ -309,7 +309,7 @@ export async function cmdStepRead( if (typeof promptRef !== "string") { return `# Step ${stepHash}\n\n_Prompt not recorded (legacy step)._`; } - const promptNode = uwf.store.get(promptRef as CasRef); + const promptNode = uwf.store.cas.get(promptRef as CasRef); if (promptNode === null) { return `# Step ${stepHash}\n\n_Prompt CAS node not found: ${promptRef}_`; } @@ -324,8 +324,8 @@ export async function cmdStepRead( return formatStepMarkdown(stepHash, payload.role, payload.agent, [], []); } - const detail = loadStepDetail(uwf.store, payload.detail); - const turnData = loadTurnData(uwf.store, detail.turns); + const detail = loadStepDetail(uwf.store.cas, payload.detail); + const turnData = loadTurnData(uwf.store.cas, detail.turns); if (turnData.length === 0) { return formatStepMarkdown(stepHash, payload.role, payload.agent, [], []); diff --git a/packages/cli/src/commands/thread.ts b/packages/cli/src/commands/thread.ts index 21f4ca2..68b59ca 100644 --- a/packages/cli/src/commands/thread.ts +++ b/packages/cli/src/commands/thread.ts @@ -1,7 +1,7 @@ import { execFileSync, spawn } from "node:child_process"; import { access, readFile } from "node:fs/promises"; import { dirname, isAbsolute, resolve as resolvePath } from "node:path"; -import type { VariableStore } from "@ocas/core"; +import type { VarStore } from "@ocas/core"; import { validate } from "@ocas/core"; import type { AgentAlias, @@ -139,7 +139,7 @@ function resolveSuspendFieldsForShow( } async function ensureThreadSuspendMetadata( - varStore: VariableStore, + varStore: VarStore, threadId: ThreadId, entry: ThreadIndexEntry, suspendedRole: string, @@ -352,8 +352,8 @@ async function materializeLocalWorkflow(uwf: UwfStore, filePath: string): Promis } const materialized = await materializeWorkflowPayload(uwf, payload); - const hash = await uwf.store.put(uwf.schemas.workflow, materialized); - const stored = uwf.store.get(hash); + const hash = await uwf.store.cas.put(uwf.schemas.workflow, materialized); + const stored = uwf.store.cas.get(hash); if (stored === null || !validate(uwf.store, stored)) { fail("stored local workflow failed schema validation"); } @@ -374,7 +374,7 @@ async function resolveWorkflowCasRef( // Strategy 1: Direct CAS hash if (isCasRef(trimmed)) { - const node = uwf.store.get(trimmed); + const node = uwf.store.cas.get(trimmed); if (node === null) { fail(`CAS node not found: ${trimmed}`); } @@ -402,7 +402,7 @@ async function resolveWorkflowCasRef( if (!isCasRef(hash)) { fail(`workflow not found: ${trimmed}`); } - const node = uwf.store.get(hash); + const node = uwf.store.cas.get(hash); if (node === null) { fail(`CAS node not found: ${hash}`); } @@ -413,7 +413,7 @@ async function resolveWorkflowCasRef( } function resolveWorkflowFromHead(uwf: UwfStore, head: CasRef): CasRef | null { - const node = uwf.store.get(head); + const node = uwf.store.cas.get(head); if (node === null) { return null; } @@ -428,7 +428,7 @@ function resolveWorkflowFromHead(uwf: UwfStore, head: CasRef): CasRef | null { return null; } - const startNode = uwf.store.get(payload.start); + const startNode = uwf.store.cas.get(payload.start); if (startNode === null || startNode.type !== uwf.schemas.startNode) { return null; } @@ -462,8 +462,8 @@ export async function cmdThreadStart( cwd, }; - const headHash = await uwf.store.put(uwf.schemas.startNode, startPayload); - const node = uwf.store.get(headHash); + const headHash = await uwf.store.cas.put(uwf.schemas.startNode, startPayload); + const node = uwf.store.cas.get(headHash); if (node === null || !validate(uwf.store, node)) { fail("stored StartNode failed schema validation"); } @@ -594,7 +594,7 @@ async function collectActiveThreads( } function collectCompletedThreads( - varStore: VariableStore, + varStore: VarStore, activeIds: Set, ): ThreadListItemWithStatus[] { const items: ThreadListItemWithStatus[] = []; @@ -691,7 +691,7 @@ export async function cmdThreadList( } export function extractLastAssistantContent(uwf: UwfStore, detailRef: CasRef): string | null { - const detailNode = uwf.store.get(detailRef); + const detailNode = uwf.store.cas.get(detailRef); if (detailNode === null) { return null; } @@ -705,7 +705,7 @@ export function extractLastAssistantContent(uwf: UwfStore, detailRef: CasRef): s if (typeof turnRef !== "string") { continue; } - const turnNode = uwf.store.get(turnRef as CasRef); + const turnNode = uwf.store.cas.get(turnRef as CasRef); if (turnNode === null) { continue; } @@ -940,7 +940,7 @@ function resolveEvaluateArgs( } function loadWorkflowPayload(uwf: UwfStore, workflowRef: CasRef): WorkflowPayload { - const node = uwf.store.get(workflowRef); + const node = uwf.store.cas.get(workflowRef); if (node === null) { fail(`workflow CAS node not found: ${workflowRef}`); } @@ -1436,7 +1436,7 @@ async function cmdThreadStepOnce( plog.log(PL_AGENT_DONE, `agent returned head=${newHead}`, null); const uwfAfter = await createUwfStore(storageRoot); - const newNode = uwfAfter.store.get(newHead); + const newNode = uwfAfter.store.cas.get(newHead); if (newNode === null || newNode.type !== uwfAfter.schemas.stepNode) { failStep(plog, `agent returned hash that is not a StepNode: ${newHead}`); } diff --git a/packages/cli/src/commands/workflow.ts b/packages/cli/src/commands/workflow.ts index 81e0762..6087972 100644 --- a/packages/cli/src/commands/workflow.ts +++ b/packages/cli/src/commands/workflow.ts @@ -150,8 +150,8 @@ export async function cmdWorkflowAdd( const uwf = await createUwfStore(storageRoot); const materialized = await materializeWorkflowPayload(uwf, payload); - const hash = await uwf.store.put(uwf.schemas.workflow, materialized); - const node = uwf.store.get(hash); + const hash = await uwf.store.cas.put(uwf.schemas.workflow, materialized); + const node = uwf.store.cas.get(hash); if (node === null || !validate(uwf.store, node)) { fail("stored workflow failed schema validation"); } @@ -169,7 +169,7 @@ export async function cmdWorkflowShow( const registry = loadWorkflowRegistry(uwf.varStore); const hash = resolveWorkflowHash(registry, id); - const node = uwf.store.get(hash); + const node = uwf.store.cas.get(hash); if (node === null) { fail(`CAS node not found: ${hash}`); } diff --git a/packages/cli/src/moderator/__tests__/evaluate.test.ts b/packages/cli/src/moderator/__tests__/evaluate.test.ts index 53d6285..a60617b 100644 --- a/packages/cli/src/moderator/__tests__/evaluate.test.ts +++ b/packages/cli/src/moderator/__tests__/evaluate.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { evaluate } from "../evaluate.js"; import { isSuspendResult } from "../types.js"; diff --git a/packages/cli/src/store.ts b/packages/cli/src/store.ts index 941664d..1850d89 100644 --- a/packages/cli/src/store.ts +++ b/packages/cli/src/store.ts @@ -4,9 +4,8 @@ import { access, mkdir, readdir, readFile, rename } from "node:fs/promises"; import { homedir } from "node:os"; import { join } from "node:path"; -import type { BootstrapCapableStore, Hash } from "@ocas/core"; -import { createVariableStore, type VariableStore } from "@ocas/core"; -import { createFsStore } from "@ocas/fs"; +import { bootstrap, type Hash, type Store, type VarStore } from "@ocas/core"; +import { createFsStore, createSqliteVarStore } from "@ocas/fs"; import type { CasRef, ThreadId, @@ -168,17 +167,19 @@ export type ThreadHistoryLine = ThreadListItem & { export type UwfStore = { storageRoot: string; - store: BootstrapCapableStore; + store: Store; schemas: UwfSchemaHashes; - varStore: VariableStore; + varStore: VarStore; }; export async function createUwfStore(storageRoot: string): Promise { const casDir = getGlobalCasDir(); await mkdir(casDir, { recursive: true }); - const store = createFsStore(casDir); + const cas = createFsStore(casDir); + const { var: varStore, tag } = createSqliteVarStore(join(casDir, "vars"), cas); + const store: Store = { cas, var: varStore, tag }; + bootstrap(store); const schemas = await registerUwfSchemas(store); - const varStore = createVariableStore(join(casDir, "variables.db"), store); await migrateWorkflowRegistryIfNeeded(storageRoot, varStore); await migrateThreadsIndexIfNeeded(storageRoot, varStore); await migrateHistoryIfNeeded(storageRoot, varStore); @@ -204,7 +205,7 @@ async function loadWorkflowRegistryFromYaml(storageRoot: string): Promise { const path = getRegistryPath(storageRoot); if (!existsSync(path)) { @@ -219,7 +220,7 @@ export async function migrateWorkflowRegistryIfNeeded( await rename(path, `${path}.migrated`); } -export function loadWorkflowRegistry(varStore: VariableStore): WorkflowRegistry { +export function loadWorkflowRegistry(varStore: VarStore): WorkflowRegistry { const vars = varStore.list({ namePrefix: REGISTRY_VAR_PREFIX }); const registry: WorkflowRegistry = {}; for (const v of vars) { @@ -229,7 +230,7 @@ export function loadWorkflowRegistry(varStore: VariableStore): WorkflowRegistry return registry; } -export function saveWorkflowRegistry(varStore: VariableStore, name: string, hash: CasRef): void { +export function saveWorkflowRegistry(varStore: VarStore, name: string, hash: CasRef): void { varStore.set(`${REGISTRY_VAR_PREFIX}${name}`, hash); } @@ -280,7 +281,7 @@ async function loadThreadsIndexFromYaml(storageRoot: string): Promise { const path = getThreadsPath(storageRoot); if (!existsSync(path)) { @@ -308,7 +309,7 @@ function entryFromVariable(v: { value: string; tags: Record }): } /** Load all active threads (equivalent to legacy `loadThreadsIndex`). */ -export function loadAllThreads(varStore: VariableStore): ThreadsIndex { +export function loadAllThreads(varStore: VarStore): ThreadsIndex { const vars = varStore.list({ namePrefix: THREAD_VAR_PREFIX }); const index: ThreadsIndex = {}; for (const v of vars) { @@ -319,7 +320,7 @@ export function loadAllThreads(varStore: VariableStore): ThreadsIndex { } /** Get a single active thread entry, or null if not found. */ -export function getThread(varStore: VariableStore, threadId: ThreadId): ThreadIndexEntry | null { +export function getThread(varStore: VarStore, threadId: ThreadId): ThreadIndexEntry | null { const vars = varStore.list({ exactName: threadVarName(threadId) }); const v = vars[0]; if (v === undefined) { @@ -330,7 +331,7 @@ export function getThread(varStore: VariableStore, threadId: ThreadId): ThreadIn /** Set or update a single active thread entry. */ export function setThread( - varStore: VariableStore, + varStore: VarStore, threadId: ThreadId, entry: ThreadIndexEntry, ): void { @@ -348,7 +349,7 @@ export function setThread( } /** Remove an active thread entry (on complete/cancel). */ -export function deleteThread(varStore: VariableStore, threadId: ThreadId): void { +export function deleteThread(varStore: VarStore, threadId: ThreadId): void { varStore.remove(threadVarName(threadId)); } @@ -389,7 +390,7 @@ function parseHistoryJsonlLine(trimmed: string): ThreadHistoryLine | null { /** One-time migration: `~/.uwf/history.jsonl` → `@uwf/history/*` variables. */ export async function migrateHistoryIfNeeded( storageRoot: string, - varStore: VariableStore, + varStore: VarStore, ): Promise { const path = join(storageRoot, "history.jsonl"); if (!existsSync(path)) { @@ -411,7 +412,7 @@ export async function migrateHistoryIfNeeded( await rename(path, `${path}.migrated`); } -export function loadAllHistory(varStore: VariableStore): ThreadHistoryLine[] { +export function loadAllHistory(varStore: VarStore): ThreadHistoryLine[] { const vars = varStore.list({ namePrefix: HISTORY_VAR_PREFIX }); return vars.map((v) => ({ thread: v.name.slice(HISTORY_VAR_PREFIX.length) as ThreadId, @@ -423,7 +424,7 @@ export function loadAllHistory(varStore: VariableStore): ThreadHistoryLine[] { } export function findHistoryEntry( - varStore: VariableStore, + varStore: VarStore, threadId: ThreadId, ): ThreadHistoryLine | null { const vars = varStore.list({ namePrefix: `${HISTORY_VAR_PREFIX}${threadId}` }); @@ -440,7 +441,7 @@ export function findHistoryEntry( }; } -export function addHistoryEntry(varStore: VariableStore, entry: ThreadHistoryLine): void { +export function addHistoryEntry(varStore: VarStore, entry: ThreadHistoryLine): void { varStore.set(`${HISTORY_VAR_PREFIX}${entry.thread}`, entry.head, { tags: { workflow: entry.workflow, diff --git a/packages/dashboard/package.json b/packages/dashboard/package.json index d832247..eb8e8cd 100644 --- a/packages/dashboard/package.json +++ b/packages/dashboard/package.json @@ -4,10 +4,10 @@ "private": true, "type": "module", "scripts": { - "dev": "bun server.ts", + "dev": "npx tsx server.ts", "build": "vite build", - "test": "bun test src/", - "test:ci": "bun test src/" + "test": "vitest run src/", + "test:ci": "vitest run src/" }, "dependencies": { "@base-ui/react": "^1.5.0", @@ -29,12 +29,12 @@ }, "devDependencies": { "@tailwindcss/vite": "^4.3.0", - "@types/bun": "^1.2.14", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.2", "tailwindcss": "^4.2.4", "typescript": "^5.8.3", - "vite": "^8.0.13" + "vite": "^8.0.13", + "@types/node": "^25.7.0" } } diff --git a/packages/dashboard/src/editor/layout/__tests__/layout.test.ts b/packages/dashboard/src/editor/layout/__tests__/layout.test.ts index f6ead88..3a6dbe3 100644 --- a/packages/dashboard/src/editor/layout/__tests__/layout.test.ts +++ b/packages/dashboard/src/editor/layout/__tests__/layout.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "bun:test"; +import { describe, expect, it } from 'vitest'; import type { Edge, Node } from "@xyflow/react"; import { LayoutLR } from "../index.js"; diff --git a/packages/dashboard/src/editor/trans/__tests__/trans-in.test.ts b/packages/dashboard/src/editor/trans/__tests__/trans-in.test.ts index 75a700b..0471456 100644 --- a/packages/dashboard/src/editor/trans/__tests__/trans-in.test.ts +++ b/packages/dashboard/src/editor/trans/__tests__/trans-in.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "bun:test"; +import { describe, expect, it } from 'vitest'; import { transIn } from "../trans-in.js"; import type { WorkFlowStep } from "../type.js"; diff --git a/packages/dashboard/src/editor/trans/__tests__/validate.test.ts b/packages/dashboard/src/editor/trans/__tests__/validate.test.ts index bb2794c..560be8c 100644 --- a/packages/dashboard/src/editor/trans/__tests__/validate.test.ts +++ b/packages/dashboard/src/editor/trans/__tests__/validate.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "bun:test"; +import { describe, expect, it } from 'vitest'; import type { AnyWorkEdge, AnyWorkNode } from "../../type.js"; import { validate } from "../validate.js"; diff --git a/packages/dashboard/tsconfig.json b/packages/dashboard/tsconfig.json index 06649e8..009d45b 100644 --- a/packages/dashboard/tsconfig.json +++ b/packages/dashboard/tsconfig.json @@ -13,7 +13,7 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "types": ["bun-types"], + "types": ["node"], "paths": { "@/*": ["./src/*"] } diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 9d7bf80..cabe3be 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -9,19 +9,18 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "types": "./dist/index.d.ts", "import": "./dist/index.js" } }, "scripts": { - "prepublishOnly": "echo 'Use bun run release from repo root' && exit 1", - "test": "bun test src/__tests__/", - "test:ci": "bun test src/__tests__/" + "prepublishOnly": "echo 'Use pnpm run release from repo root' && exit 1", + "test": "vitest run src/__tests__/", + "test:ci": "vitest run src/__tests__/" }, "dependencies": { - "@ocas/core": "^0.1.1", - "@ocas/fs": "^0.1.1" + "@ocas/core": "^0.2.2", + "@ocas/fs": "^0.2.2" }, "devDependencies": { "typescript": "^5.8.3" diff --git a/packages/protocol/src/__tests__/thread-index.test.ts b/packages/protocol/src/__tests__/thread-index.test.ts index 2631935..044aa79 100644 --- a/packages/protocol/src/__tests__/thread-index.test.ts +++ b/packages/protocol/src/__tests__/thread-index.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import { createThreadIndexEntry, markThreadSuspended, diff --git a/packages/protocol/src/__tests__/types.test.ts b/packages/protocol/src/__tests__/types.test.ts index bd9060f..ed3e8e3 100644 --- a/packages/protocol/src/__tests__/types.test.ts +++ b/packages/protocol/src/__tests__/types.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import type { StartNodePayload, StepRecord, Target } from "../types.js"; describe("Protocol types for thread/edge location", () => { diff --git a/packages/util-agent/__tests__/adapter-retry.test.ts b/packages/util-agent/__tests__/adapter-retry.test.ts index 10f83e6..3e855d3 100644 --- a/packages/util-agent/__tests__/adapter-retry.test.ts +++ b/packages/util-agent/__tests__/adapter-retry.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, test } from "bun:test"; -import { createMemoryStore, putSchema } from "@ocas/core"; +import { describe, expect, test } from 'vitest'; +import { createMemoryStore, putSchema, bootstrap } from "@ocas/core"; import { tryFrontmatterFastPath } from "../src/frontmatter.js"; @@ -18,6 +18,7 @@ const PLANNER_SCHEMA = { describe("adapter-stdout: A4 retry loop survives JSON output", () => { test("A4. first extraction fails, second succeeds — final result has correct data", async () => { const store = createMemoryStore(); + bootstrap(store); const schemaHash = await putSchema(store, PLANNER_SCHEMA); // Simulate the retry loop from createAgent (run.ts lines 163-173): @@ -56,6 +57,7 @@ describe("adapter-stdout: A4 retry loop survives JSON output", () => { test("A4. all retries fail — extraction returns null on every attempt", async () => { const store = createMemoryStore(); + bootstrap(store); const schemaHash = await putSchema(store, PLANNER_SCHEMA); const MAX_RETRIES = 2; diff --git a/packages/util-agent/__tests__/adapter-stdout.test.ts b/packages/util-agent/__tests__/adapter-stdout.test.ts index 343c2de..dad9e7e 100644 --- a/packages/util-agent/__tests__/adapter-stdout.test.ts +++ b/packages/util-agent/__tests__/adapter-stdout.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, test } from "bun:test"; -import { createMemoryStore, putSchema } from "@ocas/core"; +import { describe, expect, test } from 'vitest'; +import { createMemoryStore, putSchema, bootstrap } from "@ocas/core"; import { tryFrontmatterFastPath } from "../src/frontmatter.js"; @@ -31,6 +31,7 @@ const FRONTMATTER_SCHEMA = { describe("adapter-stdout: FrontmatterFastPathResult includes frontmatter", () => { test("A2. frontmatter field contains the parsed YAML frontmatter object", async () => { const store = createMemoryStore(); + bootstrap(store); const schemaHash = await putSchema(store, PLANNER_SCHEMA); const raw = `---\n$status: ready\nplan: abc123\n---\nSome body text`; @@ -42,6 +43,7 @@ describe("adapter-stdout: FrontmatterFastPathResult includes frontmatter", () => test("A3. body field contains the markdown body after frontmatter", async () => { const store = createMemoryStore(); + bootstrap(store); const schemaHash = await putSchema(store, PLANNER_SCHEMA); const raw = `---\n$status: ready\nplan: hash123\n---\nHere is the body.\n\nWith multiple paragraphs.`; @@ -53,6 +55,7 @@ describe("adapter-stdout: FrontmatterFastPathResult includes frontmatter", () => test("A1. result contains outputHash as valid CasRef", async () => { const store = createMemoryStore(); + bootstrap(store); const schemaHash = await putSchema(store, FRONTMATTER_SCHEMA); const raw = `---\nstatus: done\nnext: null\nconfidence: 0.9\nartifacts: []\nscope: test\n---\nBody`; diff --git a/packages/util-agent/__tests__/build-continuation-prompt.test.ts b/packages/util-agent/__tests__/build-continuation-prompt.test.ts index cbc6ac1..e2d4521 100644 --- a/packages/util-agent/__tests__/build-continuation-prompt.test.ts +++ b/packages/util-agent/__tests__/build-continuation-prompt.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import type { StepContext } from "@united-workforce/protocol"; import { buildContinuationPrompt } from "../src/build-continuation-prompt.js"; diff --git a/packages/util-agent/__tests__/build-output-format-instruction.test.ts b/packages/util-agent/__tests__/build-output-format-instruction.test.ts index 45efc35..70e5515 100644 --- a/packages/util-agent/__tests__/build-output-format-instruction.test.ts +++ b/packages/util-agent/__tests__/build-output-format-instruction.test.ts @@ -1,5 +1,4 @@ -import { describe, expect, test } from "bun:test"; - +import { describe, expect, test } from 'vitest'; import { buildOutputFormatInstruction } from "../src/build-output-format-instruction.js"; const PLANNER_SCHEMA = { diff --git a/packages/util-agent/__tests__/build-role-prompt.test.ts b/packages/util-agent/__tests__/build-role-prompt.test.ts index b340a5d..61ccd9d 100644 --- a/packages/util-agent/__tests__/build-role-prompt.test.ts +++ b/packages/util-agent/__tests__/build-role-prompt.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import type { RoleDefinition } from "@united-workforce/protocol"; import { buildRolePrompt } from "../src/build-role-prompt.js"; diff --git a/packages/util-agent/__tests__/context.test.ts b/packages/util-agent/__tests__/context.test.ts index dfab360..6cb6276 100644 --- a/packages/util-agent/__tests__/context.test.ts +++ b/packages/util-agent/__tests__/context.test.ts @@ -1,5 +1,4 @@ -import { describe, expect, test } from "bun:test"; - +import { describe, expect, test } from 'vitest'; // We need to test buildHistory indirectly through buildContext // since buildHistory is not exported. For now, we'll test the integration // through the public API in a separate integration test. diff --git a/packages/util-agent/__tests__/frontmatter-fast-path.test.ts b/packages/util-agent/__tests__/frontmatter-fast-path.test.ts index 61cc6c8..bfca445 100644 --- a/packages/util-agent/__tests__/frontmatter-fast-path.test.ts +++ b/packages/util-agent/__tests__/frontmatter-fast-path.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, test } from "bun:test"; -import { createMemoryStore, putSchema } from "@ocas/core"; +import { describe, expect, test } from 'vitest'; +import { createMemoryStore, putSchema, bootstrap } from "@ocas/core"; import { tryFrontmatterFastPath } from "../src/frontmatter.js"; @@ -48,6 +48,7 @@ const PLANNER_SCHEMA = { async function makeStoreWithSchema(schema: Record) { const store = createMemoryStore(); + bootstrap(store); const schemaHash = await putSchema(store, schema); return { store, schemaHash }; } @@ -68,7 +69,7 @@ describe("STANDARD_KEYS contains only status", () => { const result = await tryFrontmatterFastPath(raw, schemaHash, store); expect(result).not.toBeNull(); - const node = store.get(result!.outputHash); + const node = store.cas.get(result!.outputHash); expect(node).not.toBeNull(); const payload = node!.payload as Record; expect(payload.status).toBe("done"); @@ -106,7 +107,7 @@ describe("tryFrontmatterFastPath — happy path", () => { const result = await tryFrontmatterFastPath(raw, schemaHash, store); expect(result).not.toBeNull(); - const node = store.get(result!.outputHash); + const node = store.cas.get(result!.outputHash); expect(node).not.toBeNull(); const payload = node!.payload as Record; expect(payload.status).toBe("done"); @@ -126,7 +127,7 @@ describe("tryFrontmatterFastPath — legacy fields ignored", () => { const result = await tryFrontmatterFastPath(raw, schemaHash, store); expect(result).not.toBeNull(); - const node = store.get(result!.outputHash); + const node = store.cas.get(result!.outputHash); const payload = node!.payload as Record; expect(payload.status).toBe("done"); expect(payload.next).toBeUndefined(); @@ -176,7 +177,7 @@ describe("tryFrontmatterFastPath — role-specific fields", () => { const result = await tryFrontmatterFastPath(raw, schemaHash, store); expect(result).not.toBeNull(); - const node = store.get(result!.outputHash); + const node = store.cas.get(result!.outputHash); expect(node).not.toBeNull(); const payload = node!.payload as Record; expect(payload).toEqual({ approved: true }); @@ -192,7 +193,7 @@ describe("tryFrontmatterFastPath — role-specific fields", () => { const result = await tryFrontmatterFastPath(raw, schemaHash, store); expect(result).not.toBeNull(); - const node = store.get(result!.outputHash); + const node = store.cas.get(result!.outputHash); expect(node).not.toBeNull(); const payload = node!.payload as Record; expect(payload.status).toBe("ready"); diff --git a/packages/util-agent/__tests__/resolve-extract-model.test.ts b/packages/util-agent/__tests__/resolve-extract-model.test.ts index 5b24e5e..6117cb2 100644 --- a/packages/util-agent/__tests__/resolve-extract-model.test.ts +++ b/packages/util-agent/__tests__/resolve-extract-model.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, test } from 'vitest'; import type { WorkflowConfig } from "@united-workforce/protocol"; import { resolveExtractModelAlias } from "../src/extract.js"; diff --git a/packages/util-agent/__tests__/session-cache.test.ts b/packages/util-agent/__tests__/session-cache.test.ts index 908fc99..8f6cc62 100644 --- a/packages/util-agent/__tests__/session-cache.test.ts +++ b/packages/util-agent/__tests__/session-cache.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import { mkdir, readdir, readFile, rm, stat, writeFile } from "node:fs/promises"; import { dirname, join } from "node:path"; import type { ThreadId } from "@united-workforce/protocol"; diff --git a/packages/util-agent/package.json b/packages/util-agent/package.json index e607203..461a11f 100644 --- a/packages/util-agent/package.json +++ b/packages/util-agent/package.json @@ -9,19 +9,18 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "types": "./dist/index.d.ts", "import": "./dist/index.js" } }, "scripts": { - "prepublishOnly": "echo 'Use bun run release from repo root' && exit 1", - "test": "bun test __tests__/ src/__tests__/", - "test:ci": "bun test __tests__/ src/__tests__/" + "prepublishOnly": "echo 'Use pnpm run release from repo root' && exit 1", + "test": "vitest run __tests__/ src/__tests__/", + "test:ci": "vitest run __tests__/ src/__tests__/" }, "dependencies": { - "@ocas/core": "^0.1.1", - "@ocas/fs": "^0.1.1", + "@ocas/core": "^0.2.2", + "@ocas/fs": "^0.2.2", "@united-workforce/protocol": "workspace:^", "@united-workforce/util": "workspace:^", "dotenv": "^16.6.1", diff --git a/packages/util-agent/src/__tests__/parseArgv.test.ts b/packages/util-agent/src/__tests__/parseArgv.test.ts index ec5dddc..f09700b 100644 --- a/packages/util-agent/src/__tests__/parseArgv.test.ts +++ b/packages/util-agent/src/__tests__/parseArgv.test.ts @@ -1,5 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; - +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; describe("parseArgv empty prompt error message", () => { let stderrOutput: string; let _exitCode: number | null; diff --git a/packages/util-agent/src/context.ts b/packages/util-agent/src/context.ts index 7301f4d..133627b 100644 --- a/packages/util-agent/src/context.ts +++ b/packages/util-agent/src/context.ts @@ -22,7 +22,7 @@ function fail(message: string): never { } function walkChain(store: Store, schemas: AgentStore["schemas"], headHash: CasRef): ChainState { - const headNode = store.get(headHash); + const headNode = store.cas.get(headHash); if (headNode === null) { fail(`CAS node not found: ${headHash}`); } @@ -44,7 +44,7 @@ function walkChain(store: Store, schemas: AgentStore["schemas"], headHash: CasRe let hash: CasRef | null = headHash; while (hash !== null) { - const node = store.get(hash); + const node = store.cas.get(hash); if (node === null) { fail(`CAS node not found while walking chain: ${hash}`); } @@ -61,7 +61,7 @@ function walkChain(store: Store, schemas: AgentStore["schemas"], headHash: CasRe fail(`empty step chain at head ${headHash}`); } - const startNode = store.get(newest.start); + const startNode = store.cas.get(newest.start); if (startNode === null || startNode.type !== schemas.startNode) { fail(`StartNode not found: ${newest.start}`); } @@ -75,7 +75,7 @@ function walkChain(store: Store, schemas: AgentStore["schemas"], headHash: CasRe } function expandOutput(store: Store, outputRef: CasRef): unknown { - const node = store.get(outputRef); + const node = store.cas.get(outputRef); if (node === null) { return {}; } @@ -83,7 +83,7 @@ function expandOutput(store: Store, outputRef: CasRef): unknown { } function extractStepContent(store: Store, detailRef: CasRef): string | null { - const detailNode = store.get(detailRef); + const detailNode = store.cas.get(detailRef); if (detailNode === null) { return null; } @@ -98,7 +98,7 @@ function extractStepContent(store: Store, detailRef: CasRef): string | null { if (typeof turnRef !== "string") { continue; } - const turnNode = store.get(turnRef as CasRef); + const turnNode = store.cas.get(turnRef as CasRef); if (turnNode === null) { continue; } @@ -139,7 +139,7 @@ async function buildHistory( } async function loadWorkflow(store: Store, schemas: AgentStore["schemas"], workflowRef: CasRef) { - const node = store.get(workflowRef); + const node = store.cas.get(workflowRef); if (node === null) { fail(`workflow CAS node not found: ${workflowRef}`); } diff --git a/packages/util-agent/src/extract.ts b/packages/util-agent/src/extract.ts index 1275bc6..4afb8d7 100644 --- a/packages/util-agent/src/extract.ts +++ b/packages/util-agent/src/extract.ts @@ -169,8 +169,8 @@ export async function extract( throw new Error(`failed to parse extracted JSON: ${message}`); } - const outputHash = await store.put(outputSchema, structured); - const node = store.get(outputHash); + const outputHash = await store.cas.put(outputSchema, structured); + const node = store.cas.get(outputHash); if (node === null || !validate(store, node)) { throw new Error("extracted output failed JSON Schema validation"); } diff --git a/packages/util-agent/src/frontmatter.ts b/packages/util-agent/src/frontmatter.ts index 328f3f5..c4ca7ef 100644 --- a/packages/util-agent/src/frontmatter.ts +++ b/packages/util-agent/src/frontmatter.ts @@ -162,13 +162,13 @@ export async function tryFrontmatterFastPath( const candidate = buildCandidate(frontmatter, rawFields, schemaFields); let outputHash: CasRef; - let node: ReturnType; + let node: ReturnType; try { - outputHash = await store.put(outputSchema, candidate); - node = store.get(outputHash); - } catch { - log("2KMQT7NR", "failed to store frontmatter candidate in CAS"); + outputHash = await store.cas.put(outputSchema, candidate); + node = store.cas.get(outputHash); + } catch (e) { + log("2KMQT7NR", `failed to store frontmatter candidate in CAS: ${e}`); return null; } diff --git a/packages/util-agent/src/run.ts b/packages/util-agent/src/run.ts index ab4377a..c056e64 100644 --- a/packages/util-agent/src/run.ts +++ b/packages/util-agent/src/run.ts @@ -79,8 +79,8 @@ async function writeStepNode(options: { cwd: process.cwd(), assembledPrompt: options.assembledPromptHash, }; - const hash = await options.store.put(options.schemas.stepNode, payload); - const node = options.store.get(hash); + const hash = await options.store.cas.put(options.schemas.stepNode, payload); + const node = options.store.cas.get(hash); if (node === null || !validate(options.store, node)) { fail("stored StepNode failed schema validation"); } @@ -189,10 +189,14 @@ export function createAgent(options: AgentOptions): () => Promise { // Store the assembled prompt in CAS for later inspection via `step read --prompt` const promptText = agentResult.assembledPrompt; - const assembledPromptHash = - promptText !== "" - ? await ctx.meta.store.put(ctx.meta.schemas.text, promptText).catch(() => null) - : null; + let assembledPromptHash: CasRef | null = null; + if (promptText !== "") { + try { + assembledPromptHash = ctx.meta.store.cas.put(ctx.meta.schemas.text, promptText); + } catch { + assembledPromptHash = null; + } + } const stepHash = await persistStep({ ctx, diff --git a/packages/util-agent/src/storage.ts b/packages/util-agent/src/storage.ts index 9a9abf3..8b963f1 100644 --- a/packages/util-agent/src/storage.ts +++ b/packages/util-agent/src/storage.ts @@ -2,8 +2,8 @@ import { readFile } from "node:fs/promises"; import { homedir } from "node:os"; import { join } from "node:path"; -import { createVariableStore, type Store } from "@ocas/core"; -import { createFsStore } from "@ocas/fs"; +import { bootstrap, type Store } from "@ocas/core"; +import { createFsStore, createSqliteVarStore } from "@ocas/fs"; import type { AgentAlias, AgentConfig, @@ -79,8 +79,8 @@ export async function getActiveThreadEntry( threadId: ThreadId, ): Promise { const casDir = getGlobalCasDir(); - const store = createFsStore(casDir); - const varStore = createVariableStore(join(casDir, "variables.db"), store); + const cas = createFsStore(casDir); + const { var: varStore } = createSqliteVarStore(join(casDir, "vars"), cas); const vars = varStore.list({ exactName: threadVarName(threadId) }); const v = vars[0]; if (v === undefined) { @@ -100,7 +100,11 @@ export type AgentStore = { }; export async function createAgentStore(storageRoot: string): Promise { - const store = createFsStore(getGlobalCasDir()); + const casDir = getGlobalCasDir(); + const cas = createFsStore(casDir); + const { var: varSub, tag } = createSqliteVarStore(join(casDir, "vars"), cas); + const store: Store = { cas, var: varSub, tag }; + bootstrap(store); const schemas = await registerAgentSchemas(store); return { storageRoot, store, schemas }; } diff --git a/packages/util/__tests__/env.test.ts b/packages/util/__tests__/env.test.ts index dd2f9ac..101aac1 100644 --- a/packages/util/__tests__/env.test.ts +++ b/packages/util/__tests__/env.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "bun:test"; +import { describe, expect, it } from 'vitest'; import { env } from "../src/env.js"; describe("env", () => { diff --git a/packages/util/__tests__/frontmatter-markdown.test.ts b/packages/util/__tests__/frontmatter-markdown.test.ts index 9509ba1..b94d21e 100644 --- a/packages/util/__tests__/frontmatter-markdown.test.ts +++ b/packages/util/__tests__/frontmatter-markdown.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "bun:test"; +import { describe, expect, it } from 'vitest'; import type { AgentFrontmatter } from "../src/index.js"; import { parseFrontmatterMarkdown, validateFrontmatter } from "../src/index.js"; diff --git a/packages/util/__tests__/process-logger.test.ts b/packages/util/__tests__/process-logger.test.ts index 2772046..1d26246 100644 --- a/packages/util/__tests__/process-logger.test.ts +++ b/packages/util/__tests__/process-logger.test.ts @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, test } from "bun:test"; +import { afterEach, describe, expect, test } from 'vitest'; import { mkdirSync, mkdtempSync, readFileSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; diff --git a/packages/util/package.json b/packages/util/package.json index 98eda74..82aa860 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -9,15 +9,14 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "types": "./dist/index.d.ts", "import": "./dist/index.js" } }, "scripts": { - "prepublishOnly": "echo 'Use bun run release from repo root' && exit 1", - "test": "bun test __tests__/ src/__tests__/", - "test:ci": "bun test __tests__/ src/__tests__/" + "prepublishOnly": "echo 'Use pnpm run release from repo root' && exit 1", + "test": "vitest run __tests__/ src/__tests__/", + "test:ci": "vitest run __tests__/ src/__tests__/" }, "dependencies": {}, "devDependencies": { diff --git a/packages/util/src/__tests__/ulid-timestamp.test.ts b/packages/util/src/__tests__/ulid-timestamp.test.ts index 7e25cf3..751b273 100644 --- a/packages/util/src/__tests__/ulid-timestamp.test.ts +++ b/packages/util/src/__tests__/ulid-timestamp.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "bun:test"; +import { describe, expect, it } from 'vitest'; import { extractUlidTimestamp, generateUlid } from "../ulid.js"; describe("extractUlidTimestamp", () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..8f11731 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6019 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@agentclientprotocol/sdk': + specifier: ^0.22.1 + version: 0.22.1(zod@3.25.76) + '@biomejs/biome': + specifier: ^2.4.14 + version: 2.4.16 + '@changesets/cli': + specifier: ^2.31.0 + version: 2.31.0(@types/node@25.9.1) + '@types/node': + specifier: ^25.7.0 + version: 25.9.1 + '@types/xxhashjs': + specifier: ^0.2.4 + version: 0.2.4 + '@united-workforce/agent-hermes': + specifier: workspace:* + version: link:packages/agent-hermes + typescript: + specifier: ^5.8.3 + version: 5.9.3 + vitest: + specifier: ^3.2.1 + version: 3.2.6(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(yaml@2.9.0) + yaml: + specifier: ^2.9.0 + version: 2.9.0 + + packages/agent-builtin: + dependencies: + '@ocas/core': + specifier: ^0.2.2 + version: 0.2.2 + '@united-workforce/util': + specifier: workspace:^ + version: link:../util + '@united-workforce/util-agent': + specifier: workspace:^ + version: link:../util-agent + devDependencies: + typescript: + specifier: ^5.8.3 + version: 5.9.3 + + packages/agent-claude-code: + dependencies: + '@ocas/core': + specifier: ^0.2.2 + version: 0.2.2 + '@united-workforce/util': + specifier: workspace:^ + version: link:../util + '@united-workforce/util-agent': + specifier: workspace:^ + version: link:../util-agent + devDependencies: + typescript: + specifier: ^5.8.3 + version: 5.9.3 + + packages/agent-hermes: + dependencies: + '@ocas/core': + specifier: ^0.2.2 + version: 0.2.2 + '@united-workforce/protocol': + specifier: workspace:^ + version: link:../protocol + '@united-workforce/util': + specifier: workspace:^ + version: link:../util + '@united-workforce/util-agent': + specifier: workspace:^ + version: link:../util-agent + better-sqlite3: + specifier: ^12.10.0 + version: 12.10.0 + devDependencies: + '@types/better-sqlite3': + specifier: ^7.6.13 + version: 7.6.13 + typescript: + specifier: ^5.8.3 + version: 5.9.3 + + packages/cli: + dependencies: + '@ocas/core': + specifier: ^0.2.2 + version: 0.2.2 + '@ocas/fs': + specifier: ^0.2.2 + version: 0.2.2 + '@united-workforce/protocol': + specifier: workspace:^ + version: link:../protocol + '@united-workforce/util': + specifier: workspace:^ + version: link:../util + '@united-workforce/util-agent': + specifier: workspace:^ + version: link:../util-agent + commander: + specifier: ^14.0.3 + version: 14.0.3 + dotenv: + specifier: ^16.6.1 + version: 16.6.1 + mustache: + specifier: ^4.2.0 + version: 4.2.0 + yaml: + specifier: ^2.8.4 + version: 2.9.0 + devDependencies: + '@types/mustache': + specifier: ^4.2.6 + version: 4.2.6 + + packages/dashboard: + dependencies: + '@base-ui/react': + specifier: ^1.5.0 + version: 1.5.0(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@fontsource-variable/geist': + specifier: ^5.2.9 + version: 5.2.9 + '@united-workforce/protocol': + specifier: workspace:* + version: link:../protocol + '@xyflow/react': + specifier: ^12.10.2 + version: 12.11.0(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(immer@11.1.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + elysia: + specifier: ^1.4.28 + version: 1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.2)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@5.9.3) + immer: + specifier: ^11.1.8 + version: 11.1.8 + lucide-react: + specifier: ^1.16.0 + version: 1.17.0(react@19.2.7) + react: + specifier: ^19.2.6 + version: 19.2.7 + react-dom: + specifier: ^19.2.6 + version: 19.2.7(react@19.2.7) + react-router: + specifier: ^7.15.1 + version: 7.16.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + shadcn: + specifier: ^4.8.0 + version: 4.10.0(@types/node@25.9.1)(typescript@5.9.3) + tailwind-merge: + specifier: ^3.6.0 + version: 3.6.0 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + yaml: + specifier: ^2.9.0 + version: 2.9.0 + devDependencies: + '@tailwindcss/vite': + specifier: ^4.3.0 + version: 4.3.0(vite@8.0.16(@types/node@25.9.1)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0)) + '@types/node': + specifier: ^25.7.0 + version: 25.9.1 + '@types/react': + specifier: ^19.2.14 + version: 19.2.16 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.16) + '@vitejs/plugin-react': + specifier: ^6.0.2 + version: 6.0.2(vite@8.0.16(@types/node@25.9.1)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0)) + tailwindcss: + specifier: ^4.2.4 + version: 4.3.0 + typescript: + specifier: ^5.8.3 + version: 5.9.3 + vite: + specifier: ^8.0.13 + version: 8.0.16(@types/node@25.9.1)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0) + + packages/protocol: + dependencies: + '@ocas/core': + specifier: ^0.2.2 + version: 0.2.2 + '@ocas/fs': + specifier: ^0.2.2 + version: 0.2.2 + devDependencies: + typescript: + specifier: ^5.8.3 + version: 5.9.3 + + packages/util: + devDependencies: + typescript: + specifier: ^5.8.3 + version: 5.9.3 + + packages/util-agent: + dependencies: + '@ocas/core': + specifier: ^0.2.2 + version: 0.2.2 + '@ocas/fs': + specifier: ^0.2.2 + version: 0.2.2 + '@united-workforce/protocol': + specifier: workspace:^ + version: link:../protocol + '@united-workforce/util': + specifier: workspace:^ + version: link:../util + dotenv: + specifier: ^16.6.1 + version: 16.6.1 + yaml: + specifier: ^2.8.4 + version: 2.9.0 + devDependencies: + typescript: + specifier: ^5.8.3 + version: 5.9.3 + +packages: + + '@agentclientprotocol/sdk@0.22.1': + resolution: {integrity: sha512-DfqXtl/8gO9NImq094MTaCXEU2vkhh6v7q/kT+9UjZxUqj8hYaya2OjLVIqn16MzNHcXEpShTR2RIauLSYeDQQ==} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@base-ui/react@1.5.0': + resolution: {integrity: sha512-z1gSAlced1yY+iM+mHDEtIkD8UI3Ebs52MuBPxvV6f5hRutk+xvCH/wuB7hDqDzK9JG5FoMz5nhrqtSs1wjt1A==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@date-fns/tz': ^1.2.0 + '@types/react': ^17 || ^18 || ^19 + date-fns: ^4.0.0 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@date-fns/tz': + optional: true + '@types/react': + optional: true + date-fns: + optional: true + + '@base-ui/utils@0.2.9': + resolution: {integrity: sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw==} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + + '@biomejs/biome@2.4.16': + resolution: {integrity: sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.4.16': + resolution: {integrity: sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.4.16': + resolution: {integrity: sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.4.16': + resolution: {integrity: sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.4.16': + resolution: {integrity: sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.4.16': + resolution: {integrity: sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.4.16': + resolution: {integrity: sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.4.16': + resolution: {integrity: sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.4.16': + resolution: {integrity: sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} + + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.31.0': + resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==} + hasBin: true + + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} + + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + + '@dotenvx/dotenvx@1.71.0': + resolution: {integrity: sha512-KEUw/mGu+EDRhYWRTNGHIimVCs9NvMFaIXOGrHSXoCteKLE5EsJnmPjOPpYorjXVg/0xG0fbdVw720azw1z4ag==} + hasBin: true + + '@ecies/ciphers@0.2.6': + resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} + engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@fontsource-variable/geist@5.2.9': + resolution: {integrity: sha512-TP+QSBG3wxKGPE33CbMy/L0Nu3qvJ6Fy81Yc4LnQ95xH+i+cfEp8fyU8/kfV14YwszxIFPhnoMTbjL71waVpyQ==} + + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@mswjs/interceptors@0.41.9': + resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} + engines: {node: '>=18'} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@ocas/core@0.2.2': + resolution: {integrity: sha512-+7ft1bvbp545r2RS/sngx2XqlhYPt7aWLvzDzrAu1XsRV7DksaDnagDTb5tllMOFALKW3ZrvooJcbVUPPxxHBg==} + + '@ocas/fs@0.2.2': + resolution: {integrity: sha512-Xs/i4n1bFBQTcGWwkHnPHmXZYZVlSuSkUWM2R+ua84F17DS1u2L1dQ2tlrIBQRWil6NTcl+XJEkoaywpFklvAw==} + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/deferred-promise@3.0.0': + resolution: {integrity: sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/rollup-android-arm-eabi@4.61.0': + resolution: {integrity: sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.61.0': + resolution: {integrity: sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.61.0': + resolution: {integrity: sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.61.0': + resolution: {integrity: sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.61.0': + resolution: {integrity: sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.61.0': + resolution: {integrity: sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': + resolution: {integrity: sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.61.0': + resolution: {integrity: sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.61.0': + resolution: {integrity: sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.61.0': + resolution: {integrity: sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.61.0': + resolution: {integrity: sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.61.0': + resolution: {integrity: sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.61.0': + resolution: {integrity: sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.61.0': + resolution: {integrity: sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.61.0': + resolution: {integrity: sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.61.0': + resolution: {integrity: sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.61.0': + resolution: {integrity: sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.61.0': + resolution: {integrity: sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.61.0': + resolution: {integrity: sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.61.0': + resolution: {integrity: sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.61.0': + resolution: {integrity: sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.61.0': + resolution: {integrity: sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.61.0': + resolution: {integrity: sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.61.0': + resolution: {integrity: sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.61.0': + resolution: {integrity: sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw==} + cpu: [x64] + os: [win32] + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sinclair/typebox@0.34.49': + resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@ts-morph/common@0.27.0': + resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/better-sqlite3@7.6.13': + resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/mustache@4.2.6': + resolution: {integrity: sha512-t+8/QWTAhOFlrF1IVZqKnMRJi84EgkIK5Kh0p2JV4OLywUvCwJPFxbJAl7XAow7DVIHsF+xW9f1MVzg0L6Szjw==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.16': + resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} + + '@types/set-cookie-parser@2.4.10': + resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} + + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + + '@types/validate-npm-package-name@4.0.2': + resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} + + '@types/xxhashjs@0.2.4': + resolution: {integrity: sha512-E2+ZoJY2JjmVPN0iQM5gJvZkk98O2PYXSi6HrciEk3EKF34+mauEk/HgwTeCz+2r8HXHMKpucrwy4qTT12OPaQ==} + + '@vitejs/plugin-react@6.0.2': + resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + + '@vitest/expect@3.2.6': + resolution: {integrity: sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==} + + '@vitest/mocker@3.2.6': + resolution: {integrity: sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.6': + resolution: {integrity: sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==} + + '@vitest/runner@3.2.6': + resolution: {integrity: sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==} + + '@vitest/snapshot@3.2.6': + resolution: {integrity: sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==} + + '@vitest/spy@3.2.6': + resolution: {integrity: sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==} + + '@vitest/utils@3.2.6': + resolution: {integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==} + + '@xyflow/react@12.11.0': + resolution: {integrity: sha512-na4IO33FSs2OS72hASgZDmTYwFAkef7Z74uBUVrong3ARmQQHfnRUVaCFn1kTt5LbS6pK03TbYjCPGLjLFfziA==} + peerDependencies: + '@types/react': '>=17' + '@types/react-dom': '>=17' + react: '>=17' + react-dom: '>=17' + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@xyflow/system@0.0.77': + resolution: {integrity: sha512-qCDCMCQAAgUu8yHnhloHG9F5mwPX5E+Wl8McpYIOPSSXfzFJJoZcwOcsDiAjitVKIg2de1WmJbCHfpcvxprsgg==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.10.33: + resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==} + engines: {node: '>=6.0.0'} + hasBin: true + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + better-sqlite3@12.10.0: + resolution: {integrity: sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==} + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + + cborg@4.5.8: + resolution: {integrity: sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==} + hasBin: true + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + classcat@5.0.5: + resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + 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'} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eciesjs@0.4.18: + resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.366: + resolution: {integrity: sha512-OlRuhb688YTCzzU3gXPLn6nGyd+F+53INE1qaKKlu6kETErE8FYsyDh0XqXEU+uBRn0MpCzz2vfNwORhkap8qg==} + + elysia@1.4.28: + resolution: {integrity: sha512-Vrx8sBnvq8squS/3yNBzR1jBXI+SgmnmvwawPjNuEHndUe5l1jV2Gp6JJ4ulDkEB8On6bWmmuyPpA+bq4t+WYg==} + peerDependencies: + '@sinclair/typebox': '>= 0.34.0 < 1' + '@types/bun': '>= 1.2.0' + exact-mirror: '>= 0.0.9' + file-type: '>= 20.0.0' + openapi-types: '>= 12.0.0' + typescript: '>= 5.0.0' + peerDependenciesMeta: + '@types/bun': + optional: true + typescript: + optional: true + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enhanced-resolve@5.22.1: + resolution: {integrity: sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==} + engines: {node: '>=10.13.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventsource-parser@3.1.0: + resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + exact-mirror@1.0.2: + resolution: {integrity: sha512-iO5nPgJ8jQf774WpxcHTMPCYl6PuMP4RcpWhekO1pCtuZ8EV7cGmwmKKK3/vofnMmPWos2WOJm78Gag2lSnzsg==} + peerDependencies: + typebox: '>= 1.1.0' + peerDependenciesMeta: + typebox: + optional: true + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + express-rate-limit@8.5.2: + resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-type@22.0.1: + resolution: {integrity: sha512-ww5Mhre0EE+jmBvOXTmXAbEMuZE7uX4a3+oRCQFNj8w++g3ev913N6tXQz0XTXbueQ5TWQfm6BdaViEHHn8bhA==} + engines: {node: '>=22'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@11.3.5: + resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + fuzzysort@3.1.0: + resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphql@16.14.1: + resolution: {integrity: sha512-cQOsSMS/IrDz82PVyRDvf/Q1F/bRbBVjJlh+xYOkI1qw2bWRvWGiWc+m2O0d6l4Bt1fyY+8kzJ8JFWGJqNeDBg==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + headers-polyfill@5.0.1: + resolution: {integrity: sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==} + + hono@4.12.23: + resolution: {integrity: sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==} + engines: {node: '>=16.9.0'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + hasBin: true + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immer@11.1.8: + resolution: {integrity: sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + liquidjs@10.27.0: + resolution: {integrity: sha512-tw/OA59K7aIBlMKIrKlumr37fiZUheShVHXY8cVctWisgY1p9mc5hreOvlreoS0wTiwlWk14Ya7305c2a/Cg5w==} + engines: {node: '>=16'} + hasBin: true + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@1.17.0: + resolution: {integrity: sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memoirist@0.4.0: + resolution: {integrity: sha512-zxTgA0mSYELa66DimuNQDvyLq36AwDlTuVRbnQtB+VuTcKWm5Qc4z3WkSpgsFWHNhexqkIooqpv4hdcqrX5Nmg==} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msw@2.14.6: + resolution: {integrity: sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-abi@3.92.0: + resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==} + engines: {node: '>=10'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.47: + resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + engines: {node: '>=18'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. + hasBin: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} + peerDependencies: + react: ^19.2.7 + + react-router@7.16.0: + resolution: {integrity: sha512-wArC8lVyJb3+jM9OpDyW6hLCizACWkvQR/sSGqSs+o5uEXEtGlqdZ4v8hENR3Jad6i+LRkK93q/+bQAcvl6V1A==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} + engines: {node: '>=0.10.0'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + reselect@5.2.0: + resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + rettime@0.11.11: + resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.61.0: + resolution: {integrity: sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + set-cookie-parser@3.1.0: + resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shadcn@4.10.0: + resolution: {integrity: sha512-84IJhUsK0xqSCRJx3QxyZe2NpUXj2Nwk8Vc8Ow/tCOND3yz4CT6uU4655vqicNXhzG9Q1cyUt+TBl2SiCJwNgg==} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} + + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tldts-core@7.4.2: + resolution: {integrity: sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==} + + tldts@7.4.2: + resolution: {integrity: sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==} + hasBin: true + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} + engines: {node: '>=16'} + + ts-morph@26.0.0: + resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + type-fest@5.7.0: + resolution: {integrity: sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==} + engines: {node: '>=20'} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + until-async@3.0.2: + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.3.5: + resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@8.0.16: + resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.6: + resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.6 + '@vitest/ui': 3.2.6 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-spinner@1.2.0: + resolution: {integrity: sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw==} + engines: {node: '>=18.19'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zustand@4.5.7: + resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + +snapshots: + + '@agentclientprotocol/sdk@0.22.1(zod@3.25.76)': + dependencies: + zod: 3.25.76 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.29.7': {} + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@base-ui/react@1.5.0(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@base-ui/utils': 0.2.9(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@floating-ui/utils': 0.2.11 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + use-sync-external-store: 1.6.0(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + + '@base-ui/utils@0.2.9(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@floating-ui/utils': 0.2.11 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + reselect: 5.2.0 + use-sync-external-store: 1.6.0(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + + '@biomejs/biome@2.4.16': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.4.16 + '@biomejs/cli-darwin-x64': 2.4.16 + '@biomejs/cli-linux-arm64': 2.4.16 + '@biomejs/cli-linux-arm64-musl': 2.4.16 + '@biomejs/cli-linux-x64': 2.4.16 + '@biomejs/cli-linux-x64-musl': 2.4.16 + '@biomejs/cli-win32-arm64': 2.4.16 + '@biomejs/cli-win32-x64': 2.4.16 + + '@biomejs/cli-darwin-arm64@2.4.16': + optional: true + + '@biomejs/cli-darwin-x64@2.4.16': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.4.16': + optional: true + + '@biomejs/cli-linux-arm64@2.4.16': + optional: true + + '@biomejs/cli-linux-x64-musl@2.4.16': + optional: true + + '@biomejs/cli-linux-x64@2.4.16': + optional: true + + '@biomejs/cli-win32-arm64@2.4.16': + optional: true + + '@biomejs/cli-win32-x64@2.4.16': + optional: true + + '@borewit/text-codec@0.2.2': {} + + '@changesets/apply-release-plan@7.1.1': + dependencies: + '@changesets/config': 3.1.4 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.8.1 + + '@changesets/assemble-release-plan@6.0.10': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.8.1 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.31.0(@types/node@25.9.1)': + dependencies: + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.4 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@25.9.1) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.8.1 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.4': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.8.1 + + '@changesets/get-release-plan@4.0.16': + dependencies: + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.3': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.2.0 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.7': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.3 + prettier: 2.8.8 + + '@dotenvx/dotenvx@1.71.0': + dependencies: + commander: 11.1.0 + dotenv: 17.4.2 + eciesjs: 0.4.18 + enquirer: 2.4.1 + execa: 5.1.1 + fdir: 6.5.0(picomatch@4.0.4) + ignore: 5.3.2 + object-treeify: 1.1.33 + picomatch: 4.0.4 + which: 4.0.0 + yocto-spinner: 1.2.0 + + '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@floating-ui/utils@0.2.11': {} + + '@fontsource-variable/geist@5.2.9': {} + + '@hono/node-server@1.19.14(hono@4.12.23)': + dependencies: + hono: 4.12.23 + + '@inquirer/ansi@2.0.7': {} + + '@inquirer/confirm@6.1.1(@types/node@25.9.1)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) + optionalDependencies: + '@types/node': 25.9.1 + + '@inquirer/core@11.2.1(@types/node@25.9.1)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 25.9.1 + + '@inquirer/external-editor@1.0.3(@types/node@25.9.1)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 25.9.1 + + '@inquirer/figures@2.0.7': {} + + '@inquirer/type@4.0.7(@types/node@25.9.1)': + optionalDependencies: + '@types/node': 25.9.1 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.29.7 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.29.7 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.14(hono@4.12.23) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.0 + express: 5.2.1 + express-rate-limit: 8.5.2(express@5.2.1) + hono: 4.12.23 + jose: 6.2.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@mswjs/interceptors@0.41.9': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@ocas/core@0.2.2': + dependencies: + ajv: 8.20.0 + cborg: 4.5.8 + liquidjs: 10.27.0 + xxhash-wasm: 1.1.0 + + '@ocas/fs@0.2.2': + dependencies: + '@ocas/core': 0.2.2 + better-sqlite3: 12.10.0 + cborg: 4.5.8 + + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/deferred-promise@3.0.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + + '@oxc-project/types@0.133.0': {} + + '@rolldown/binding-android-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-x64@1.0.3': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.3': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.3': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.3': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.3': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.3': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.3': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/rollup-android-arm-eabi@4.61.0': + optional: true + + '@rollup/rollup-android-arm64@4.61.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.61.0': + optional: true + + '@rollup/rollup-darwin-x64@4.61.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.61.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.61.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.61.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.61.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.61.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.61.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.61.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.61.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.61.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.61.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.61.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.61.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.61.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.61.0': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + + '@sinclair/typebox@0.34.49': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.22.1 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/vite@4.3.0(vite@8.0.16(@types/node@25.9.1)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 8.0.16(@types/node@25.9.1)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0) + + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + + '@ts-morph/common@0.27.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 10.2.5 + path-browserify: 1.0.1 + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/better-sqlite3@7.6.13': + dependencies: + '@types/node': 25.9.1 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/d3-color@3.1.3': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/mustache@4.2.6': {} + + '@types/node@12.20.55': {} + + '@types/node@25.9.1': + dependencies: + undici-types: 7.24.6 + + '@types/react-dom@19.2.3(@types/react@19.2.16)': + dependencies: + '@types/react': 19.2.16 + + '@types/react@19.2.16': + dependencies: + csstype: 3.2.3 + + '@types/set-cookie-parser@2.4.10': + dependencies: + '@types/node': 25.9.1 + + '@types/statuses@2.0.6': {} + + '@types/validate-npm-package-name@4.0.2': {} + + '@types/xxhashjs@0.2.4': + dependencies: + '@types/node': 25.9.1 + + '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@25.9.1)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.0.16(@types/node@25.9.1)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0) + + '@vitest/expect@3.2.6': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.6 + '@vitest/utils': 3.2.6 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.6(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.5(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 3.2.6 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.14.6(@types/node@25.9.1)(typescript@5.9.3) + vite: 7.3.5(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + + '@vitest/pretty-format@3.2.6': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.6': + dependencies: + '@vitest/utils': 3.2.6 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.6': + dependencies: + '@vitest/pretty-format': 3.2.6 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.6': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.6': + dependencies: + '@vitest/pretty-format': 3.2.6 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + '@xyflow/react@12.11.0(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(immer@11.1.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@xyflow/system': 0.0.77 + classcat: 5.0.5 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + zustand: 4.5.7(@types/react@19.2.16)(immer@11.1.8)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + transitivePeerDependencies: + - immer + + '@xyflow/system@0.0.77': + dependencies: + '@types/d3-drag': 3.0.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + agent-base@7.1.4: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + assertion-error@2.0.1: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + balanced-match@4.0.4: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.10.33: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + better-sqlite3@12.10.0: + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.3 + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.15.2 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.33 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.366 + node-releases: 2.0.47 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001793: {} + + cborg@4.5.8: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk@5.6.2: {} + + chardet@2.1.1: {} + + check-error@2.1.3: {} + + chownr@1.1.4: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + classcat@5.0.5: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + code-block-writer@13.0.3: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@10.0.1: {} + + commander@11.1.0: {} + + commander@14.0.3: {} + + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + content-type@2.0.0: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cookie@1.1.1: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@9.0.1(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.2.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + d3-color@3.1.0: {} + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-ease@3.0.1: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-selection@3.0.0: {} + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + data-uri-to-buffer@4.0.1: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + dedent@1.7.2: {} + + deep-eql@5.0.2: {} + + deep-extend@0.6.0: {} + + deepmerge@4.3.1: {} + + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + + depd@2.0.0: {} + + detect-indent@6.1.0: {} + + detect-libc@2.1.2: {} + + diff@8.0.4: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dotenv@16.6.1: {} + + dotenv@17.4.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eciesjs@0.4.18: + dependencies: + '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.366: {} + + elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.2)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@5.9.3): + dependencies: + '@sinclair/typebox': 0.34.49 + cookie: 1.1.1 + exact-mirror: 1.0.2 + fast-decode-uri-component: 1.0.1 + file-type: 22.0.1 + memoirist: 0.4.0 + openapi-types: 12.1.3 + optionalDependencies: + typescript: 5.9.3 + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.22.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + esprima@4.0.1: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + etag@1.8.1: {} + + eventsource-parser@3.1.0: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.0 + + exact-mirror@1.0.2: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + expand-template@2.0.3: {} + + expect-type@1.3.0: {} + + express-rate-limit@8.5.2(express@5.2.1): + dependencies: + express: 5.2.1 + ip-address: 10.2.0 + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.2 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extendable-error@0.1.7: {} + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-uri@3.1.2: {} + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-type@22.0.1: + dependencies: + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.5 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs-constants@1.0.0: {} + + fs-extra@11.3.5: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + fuzzysort@3.1.0: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.6.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-own-enumerable-keys@1.0.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + github-from-package@0.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphql@16.14.1: {} + + has-symbols@1.1.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + headers-polyfill@5.0.1: + dependencies: + '@types/set-cookie-parser': 2.4.10 + set-cookie-parser: 3.1.0 + + hono@4.12.23: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-id@4.1.3: {} + + human-signals@2.1.0: {} + + human-signals@8.0.1: {} + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immer@11.1.8: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ip-address@10.2.0: {} + + ipaddr.js@1.9.1: {} + + is-arrayish@0.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-in-ssh@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@2.0.0: {} + + is-node-process@1.2.0: {} + + is-number@7.0.0: {} + + is-obj@3.0.0: {} + + is-plain-obj@4.1.0: {} + + is-promise@4.0.0: {} + + is-regexp@3.1.0: {} + + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + + is-windows@1.0.2: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + isexe@3.1.5: {} + + jiti@2.7.0: {} + + jose@6.2.3: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lines-and-columns@1.2.4: {} + + liquidjs@10.27.0: + dependencies: + commander: 10.0.1 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.startcase@4.4.0: {} + + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + + loupe@3.2.1: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@1.17.0(react@19.2.7): + dependencies: + react: 19.2.7 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + media-typer@1.1.0: {} + + memoirist@0.4.0: {} + + merge-descriptors@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.54.0: {} + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mimic-fn@2.1.0: {} + + mimic-function@5.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minimist@1.2.8: {} + + mkdirp-classic@0.5.3: {} + + mri@1.2.0: {} + + ms@2.1.3: {} + + msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3): + dependencies: + '@inquirer/confirm': 6.1.1(@types/node@25.9.1) + '@mswjs/interceptors': 0.41.9 + '@open-draft/deferred-promise': 3.0.0 + '@types/statuses': 2.0.6 + cookie: 1.1.1 + graphql: 16.14.1 + headers-polyfill: 5.0.1 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.11.11 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.1 + type-fest: 5.7.0 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + + mustache@4.2.0: {} + + mute-stream@3.0.0: {} + + nanoid@3.3.12: {} + + napi-build-utils@2.0.0: {} + + negotiator@1.0.0: {} + + node-abi@3.92.0: + dependencies: + semver: 7.8.1 + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-releases@2.0.47: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-treeify@1.1.33: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@11.0.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + + openapi-types@12.1.3: {} + + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + outdent@0.5.0: {} + + outvariant@1.4.3: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@4.0.0: {} + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-to-regexp@6.3.0: {} + + path-to-regexp@8.4.2: {} + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pify@4.0.1: {} + + pkce-challenge@5.0.1: {} + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + powershell-utils@0.1.0: {} + + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.1.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.92.0 + pump: 3.0.4 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.4 + tunnel-agent: 0.6.0 + + prettier@2.8.8: {} + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + qs@6.15.2: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dom@19.2.7(react@19.2.7): + dependencies: + react: 19.2.7 + scheduler: 0.27.0 + + react-router@7.16.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + cookie: 1.1.1 + react: 19.2.7 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.7(react@19.2.7) + + react@19.2.7: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.2 + pify: 4.0.1 + strip-bom: 3.0.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + reselect@5.2.0: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rettime@0.11.11: {} + + reusify@1.1.0: {} + + rolldown@1.0.3: + dependencies: + '@oxc-project/types': 0.133.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 + + rollup@4.61.0: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.61.0 + '@rollup/rollup-android-arm64': 4.61.0 + '@rollup/rollup-darwin-arm64': 4.61.0 + '@rollup/rollup-darwin-x64': 4.61.0 + '@rollup/rollup-freebsd-arm64': 4.61.0 + '@rollup/rollup-freebsd-x64': 4.61.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.0 + '@rollup/rollup-linux-arm-musleabihf': 4.61.0 + '@rollup/rollup-linux-arm64-gnu': 4.61.0 + '@rollup/rollup-linux-arm64-musl': 4.61.0 + '@rollup/rollup-linux-loong64-gnu': 4.61.0 + '@rollup/rollup-linux-loong64-musl': 4.61.0 + '@rollup/rollup-linux-ppc64-gnu': 4.61.0 + '@rollup/rollup-linux-ppc64-musl': 4.61.0 + '@rollup/rollup-linux-riscv64-gnu': 4.61.0 + '@rollup/rollup-linux-riscv64-musl': 4.61.0 + '@rollup/rollup-linux-s390x-gnu': 4.61.0 + '@rollup/rollup-linux-x64-gnu': 4.61.0 + '@rollup/rollup-linux-x64-musl': 4.61.0 + '@rollup/rollup-openbsd-x64': 4.61.0 + '@rollup/rollup-openharmony-arm64': 4.61.0 + '@rollup/rollup-win32-arm64-msvc': 4.61.0 + '@rollup/rollup-win32-ia32-msvc': 4.61.0 + '@rollup/rollup-win32-x64-gnu': 4.61.0 + '@rollup/rollup-win32-x64-msvc': 4.61.0 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.8.1: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.2: {} + + set-cookie-parser@3.1.0: {} + + setprototypeof@1.2.0: {} + + shadcn@4.10.0(@types/node@25.9.1)(typescript@5.9.3): + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@dotenvx/dotenvx': 1.71.0 + '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) + '@types/validate-npm-package-name': 4.0.2 + browserslist: 4.28.2 + commander: 14.0.3 + cosmiconfig: 9.0.1(typescript@5.9.3) + dedent: 1.7.2 + deepmerge: 4.3.1 + diff: 8.0.4 + execa: 9.6.1 + fast-glob: 3.3.3 + fs-extra: 11.3.5 + fuzzysort: 3.1.0 + https-proxy-agent: 7.0.6 + kleur: 4.1.5 + msw: 2.14.6(@types/node@25.9.1)(typescript@5.9.3) + node-fetch: 3.3.2 + open: 11.0.0 + ora: 8.2.0 + postcss: 8.5.15 + postcss-selector-parser: 7.1.1 + prompts: 2.4.2 + recast: 0.23.11 + stringify-object: 5.0.0 + tailwind-merge: 3.6.0 + ts-morph: 26.0.0 + tsconfig-paths: 4.2.0 + validate-npm-package-name: 7.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@types/node' + - babel-plugin-macros + - supports-color + - typescript + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + statuses@2.0.2: {} + + std-env@3.10.0: {} + + stdin-discarder@0.2.2: {} + + strict-event-emitter@0.5.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-bom@3.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@4.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + strtok3@10.3.5: + dependencies: + '@tokenizer/token': 0.3.0 + + tagged-tag@1.0.0: {} + + tailwind-merge@3.6.0: {} + + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + + tar-fs@2.1.4: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.4 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + term-size@2.2.1: {} + + tiny-invariant@1.3.3: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + + tldts-core@7.4.2: {} + + tldts@7.4.2: + dependencies: + tldts-core: 7.4.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + tough-cookie@6.0.1: + dependencies: + tldts: 7.4.2 + + ts-morph@26.0.0: + dependencies: + '@ts-morph/common': 0.27.0 + code-block-writer: 13.0.3 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tw-animate-css@1.4.0: {} + + type-fest@5.7.0: + dependencies: + tagged-tag: 1.0.0 + + type-is@2.1.0: + dependencies: + content-type: 2.0.0 + media-typer: 1.1.0 + mime-types: 3.0.2 + + typescript@5.9.3: {} + + uint8array-extras@1.5.0: {} + + undici-types@7.24.6: {} + + unicorn-magic@0.3.0: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + until-async@3.0.2: {} + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-sync-external-store@1.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + + util-deprecate@1.0.2: {} + + validate-npm-package-name@7.0.2: {} + + vary@1.1.2: {} + + vite-node@3.2.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.3.5(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.3.5(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): + dependencies: + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.61.0 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 25.9.1 + fsevents: 2.3.3 + jiti: 2.7.0 + lightningcss: 1.32.0 + yaml: 2.9.0 + + vite@8.0.16(@types/node@25.9.1)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 25.9.1 + esbuild: 0.27.7 + fsevents: 2.3.3 + jiti: 2.7.0 + yaml: 2.9.0 + + vitest@3.2.6(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(yaml@2.9.0): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.6 + '@vitest/mocker': 3.2.6(msw@2.14.6(@types/node@25.9.1)(typescript@5.9.3))(vite@7.3.5(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + '@vitest/pretty-format': 3.2.6 + '@vitest/runner': 3.2.6 + '@vitest/snapshot': 3.2.6 + '@vitest/spy': 3.2.6 + '@vitest/utils': 3.2.6 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.5(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.9.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + web-streams-polyfill@3.3.3: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.5 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.1.0 + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.9.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-spinner@1.2.0: + dependencies: + yoctocolors: 2.1.2 + + yoctocolors@2.1.2: {} + + zod-to-json-schema@3.25.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.25.76: {} + + zustand@4.5.7(@types/react@19.2.16)(immer@11.1.8)(react@19.2.7): + dependencies: + use-sync-external-store: 1.6.0(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + immer: 11.1.8 + react: 19.2.7 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..18ec407 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'packages/*' diff --git a/tsconfig.json b/tsconfig.json index 474cc6f..1547e16 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,7 @@ "sourceMap": true, "composite": true, "outDir": "dist", - "types": ["bun-types", "node"] + "types": ["node"] }, "references": [ { "path": "packages/util" },