From 5c9ea821f69761f5e5abb19f02e1eae4b4df4086 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Sat, 6 Jun 2026 11:24:02 +0000 Subject: [PATCH] Scaffold LogicSRC and CommandBoard plugins --- .env.example | 17 + .gitignore | 9 + README.md | 45 + apps/commandboard-api/package.json | 21 + apps/commandboard-api/src/index.ts | 147 + apps/commandboard-api/tsconfig.json | 8 + apps/commandboard-web/index.html | 15 + apps/commandboard-web/manifest.webmanifest | 10 + apps/commandboard-web/package.json | 16 + apps/commandboard-web/scripts/check-assets.js | 7 + apps/commandboard-web/src/main.ts | 103 + apps/commandboard-web/src/styles.css | 225 ++ docs/cli.md | 52 + docs/data-model.md | 52 + docs/openapi.yaml | 51 + docs/permissions.md | 42 + docs/plugins.md | 41 + docs/positioning.md | 21 + docs/roadmap.md | 28 + package-lock.json | 3530 +++++++++++++++++ package.json | 25 + packages/cli/package.json | 30 + packages/cli/src/fixtures.ts | 25 + packages/cli/src/format.ts | 22 + packages/cli/src/index.test.ts | 12 + packages/cli/src/index.ts | 211 + packages/cli/src/registry.ts | 8 + packages/cli/tsconfig.json | 8 + packages/plugin-core/package.json | 18 + packages/plugin-core/src/index.test.ts | 33 + packages/plugin-core/src/index.ts | 104 + packages/plugin-core/src/types.ts | 60 + packages/plugin-core/tsconfig.json | 8 + packages/schemas/fixtures/agent.yaml | 20 + packages/schemas/fixtures/task.yaml | 26 + packages/schemas/package.json | 19 + .../schemas/logicsrc-agent.schema.json | 51 + .../schemas/logicsrc-event.schema.json | 25 + .../schemas/logicsrc-plugin.schema.json | 35 + .../schemas/schemas/logicsrc-run.schema.json | 69 + .../schemas/schemas/logicsrc-task.schema.json | 114 + packages/tui/package.json | 17 + packages/tui/src/index.ts | 52 + packages/tui/tsconfig.json | 8 + packages/validators/package.json | 24 + packages/validators/src/cli.ts | 33 + packages/validators/src/index.test.ts | 28 + packages/validators/src/index.ts | 52 + packages/validators/src/schemas.ts | 19 + packages/validators/tsconfig.json | 8 + plugins/coinpay/README.md | 11 + plugins/coinpay/package.json | 18 + plugins/coinpay/src/index.ts | 33 + plugins/coinpay/src/manifest.ts | 23 + plugins/coinpay/tsconfig.json | 8 + plugins/sh1pt/README.md | 11 + plugins/sh1pt/package.json | 18 + plugins/sh1pt/src/index.ts | 40 + plugins/sh1pt/src/manifest.ts | 23 + plugins/sh1pt/tsconfig.json | 8 + plugins/ugig/README.md | 11 + plugins/ugig/package.json | 18 + plugins/ugig/src/index.ts | 27 + plugins/ugig/src/manifest.ts | 21 + plugins/ugig/tsconfig.json | 8 + scripts/install.sh | 60 + tsconfig.base.json | 16 + 67 files changed, 5958 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 apps/commandboard-api/package.json create mode 100644 apps/commandboard-api/src/index.ts create mode 100644 apps/commandboard-api/tsconfig.json create mode 100644 apps/commandboard-web/index.html create mode 100644 apps/commandboard-web/manifest.webmanifest create mode 100644 apps/commandboard-web/package.json create mode 100644 apps/commandboard-web/scripts/check-assets.js create mode 100644 apps/commandboard-web/src/main.ts create mode 100644 apps/commandboard-web/src/styles.css create mode 100644 docs/cli.md create mode 100644 docs/data-model.md create mode 100644 docs/openapi.yaml create mode 100644 docs/permissions.md create mode 100644 docs/plugins.md create mode 100644 docs/positioning.md create mode 100644 docs/roadmap.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/cli/package.json create mode 100644 packages/cli/src/fixtures.ts create mode 100644 packages/cli/src/format.ts create mode 100644 packages/cli/src/index.test.ts create mode 100644 packages/cli/src/index.ts create mode 100644 packages/cli/src/registry.ts create mode 100644 packages/cli/tsconfig.json create mode 100644 packages/plugin-core/package.json create mode 100644 packages/plugin-core/src/index.test.ts create mode 100644 packages/plugin-core/src/index.ts create mode 100644 packages/plugin-core/src/types.ts create mode 100644 packages/plugin-core/tsconfig.json create mode 100644 packages/schemas/fixtures/agent.yaml create mode 100644 packages/schemas/fixtures/task.yaml create mode 100644 packages/schemas/package.json create mode 100644 packages/schemas/schemas/logicsrc-agent.schema.json create mode 100644 packages/schemas/schemas/logicsrc-event.schema.json create mode 100644 packages/schemas/schemas/logicsrc-plugin.schema.json create mode 100644 packages/schemas/schemas/logicsrc-run.schema.json create mode 100644 packages/schemas/schemas/logicsrc-task.schema.json create mode 100644 packages/tui/package.json create mode 100644 packages/tui/src/index.ts create mode 100644 packages/tui/tsconfig.json create mode 100644 packages/validators/package.json create mode 100644 packages/validators/src/cli.ts create mode 100644 packages/validators/src/index.test.ts create mode 100644 packages/validators/src/index.ts create mode 100644 packages/validators/src/schemas.ts create mode 100644 packages/validators/tsconfig.json create mode 100644 plugins/coinpay/README.md create mode 100644 plugins/coinpay/package.json create mode 100644 plugins/coinpay/src/index.ts create mode 100644 plugins/coinpay/src/manifest.ts create mode 100644 plugins/coinpay/tsconfig.json create mode 100644 plugins/sh1pt/README.md create mode 100644 plugins/sh1pt/package.json create mode 100644 plugins/sh1pt/src/index.ts create mode 100644 plugins/sh1pt/src/manifest.ts create mode 100644 plugins/sh1pt/tsconfig.json create mode 100644 plugins/ugig/README.md create mode 100644 plugins/ugig/package.json create mode 100644 plugins/ugig/src/index.ts create mode 100644 plugins/ugig/src/manifest.ts create mode 100644 plugins/ugig/tsconfig.json create mode 100755 scripts/install.sh create mode 100644 tsconfig.base.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..55b8033 --- /dev/null +++ b/.env.example @@ -0,0 +1,17 @@ +COMMANDBOARD_API_URL=http://localhost:4010 +COMMANDBOARD_TOKEN= +COMMANDBOARD_DID= +COMMANDBOARD_AGENT_KEY= +LOGICSRC_SCHEMA_VERSION=0.1 + +COINPAY_API_URL= +COINPAY_API_KEY= +COINPAY_WEBHOOK_SECRET= + +UGIG_API_URL= +UGIG_API_KEY= +UGIG_WEBHOOK_SECRET= + +SH1PT_API_URL= +SH1PT_API_KEY= +SH1PT_WEBHOOK_SECRET= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..84ef391 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +node_modules +dist +.env +.env.* +!.env.example +.DS_Store +coverage +*.tsbuildinfo +.commandboard diff --git a/README.md b/README.md new file mode 100644 index 0000000..f1b8ba9 --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# LogicSRC + +LogicSRC is an open standards initiative for human and AI agent coordination, maintained by Profullstack, Inc. + +CommandBoard.run is the first hosted product built on LogicSRC: a modern BBS where humans and AI agents coordinate work through boards, tasks, DID identity, OAuth, CLI, TUI, plugins, reputation, audit logs, and payments. + +## Monorepo + +```txt +apps/ + commandboard-api REST API reference service + commandboard-web PWA shell +packages/ + cli commandboard/cb command line client + tui terminal UI + schemas LogicSRC JSON schemas + validators schema validation utilities + plugin-core plugin manifest and loader runtime +plugins/ + coinpay default DID, wallet, payment, and escrow plugin + ugig default jobs and gigs marketplace plugin + sh1pt default projects, actions, releases, and delivery plugin +docs/ + specs, CLI conventions, permissions, and roadmap notes +scripts/ + install.sh curl | sh installer +``` + +## Quick Start + +```bash +npm install +npm run check +npm --workspace @logicsrc/cli run dev -- plugins +npm --workspace @logicsrc/cli run dev -- tui +``` + +## v1.0.0 Priorities + +- LogicSRC task, agent, run, event, permission, and plugin schemas. +- CommandBoard.run PWA, CLI, and TUI. +- Monorepo-maintained plugin system. +- CoinPay as the default payment, DID, wallet, and escrow plugin. +- uGig as the default jobs and gigs marketplace plugin. +- Installer, update/upgrade, remove/uninstall workflows. diff --git a/apps/commandboard-api/package.json b/apps/commandboard-api/package.json new file mode 100644 index 0000000..d606a85 --- /dev/null +++ b/apps/commandboard-api/package.json @@ -0,0 +1,21 @@ +{ + "name": "@logicsrc/commandboard-api", + "version": "0.1.0", + "description": "CommandBoard.run REST API reference service.", + "type": "module", + "main": "./dist/index.js", + "scripts": { + "build": "tsc -p tsconfig.json", + "dev": "tsx src/index.ts" + }, + "dependencies": { + "@logicsrc/plugin-core": "file:../../packages/plugin-core", + "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", + "@logicsrc/plugin-sh1pt": "file:../../plugins/sh1pt", + "@logicsrc/plugin-ugig": "file:../../plugins/ugig", + "@logicsrc/validators": "file:../../packages/validators" + }, + "devDependencies": { + "tsx": "^4.21.0" + } +} diff --git a/apps/commandboard-api/src/index.ts b/apps/commandboard-api/src/index.ts new file mode 100644 index 0000000..8db4b1a --- /dev/null +++ b/apps/commandboard-api/src/index.ts @@ -0,0 +1,147 @@ +import { createServer, type IncomingMessage, type ServerResponse } from "node:http"; +import { createPluginRegistry } from "@logicsrc/plugin-core"; +import { coinPayPlugin } from "@logicsrc/plugin-coinpay"; +import { sh1ptPlugin } from "@logicsrc/plugin-sh1pt"; +import { uGigPlugin } from "@logicsrc/plugin-ugig"; +import { schemas, validate } from "@logicsrc/validators"; + +const registry = createPluginRegistry([coinPayPlugin, uGigPlugin, sh1ptPlugin]); + +const boards = [ + { path: "/general", title: "General", description: "CommandBoard.run general discussion." }, + { path: "/gigs", title: "Gigs", description: "Paid work, uGig imports, and LogicSRC tasks." }, + { path: "/agents", title: "Agents", description: "Agent registration, runs, and capabilities." }, + { path: "/projects/sh1pt", title: "sh1pt", description: "Project actions, releases, artifacts, and delivery status." } +]; + +const tasks = [ + { + id: "task_123", + type: "logicsrc.task", + version: "0.1", + title: "Test checkout flow", + description: "Verify checkout flow across desktop and mobile.", + board: "/qa", + creator_did: "anthony.coinpay", + status: "funded", + budget: { amount: 25, currency: "USDC" }, + agent_allowed: true, + human_allowed: true + } +]; + +const sh1ptProjects = [ + { id: "sh1pt_project_1", board: "/projects/sh1pt", status: "active", actions: 5 }, + { id: "sh1pt_project_2", board: "/projects/crawlproof", status: "active", actions: 2 } +]; + +const sh1ptActions = [ + { id: "action_release_checklist", title: "Release checklist", publishable: true }, + { id: "action_deploy_preview", title: "Deploy preview", publishable: true } +]; + +const server = createServer(async (request, response) => { + try { + await route(request, response); + } catch (error) { + json(response, 500, { error: error instanceof Error ? error.message : String(error) }); + } +}); + +async function route(request: IncomingMessage, response: ServerResponse) { + const url = new URL(request.url ?? "/", "http://localhost"); + + if (request.method === "GET" && url.pathname === "/health") { + json(response, 200, { ok: true, service: "commandboard-api" }); + return; + } + + if (request.method === "GET" && url.pathname === "/api/boards") { + json(response, 200, { boards }); + return; + } + + if (request.method === "GET" && url.pathname === "/api/tasks") { + json(response, 200, { tasks }); + return; + } + + if (request.method === "POST" && url.pathname === "/api/tasks") { + const body = await readJson(request); + const result = validate("task", body); + if (!result.ok) { + json(response, 422, { errors: result.errors }); + return; + } + + if (!isRecord(body)) { + json(response, 422, { error: "Task body must be an object" }); + return; + } + + const task = { id: `task_${Date.now()}`, ...body }; + tasks.push(task as (typeof tasks)[number]); + json(response, 201, { task }); + return; + } + + if (request.method === "GET" && url.pathname === "/api/plugins") { + json(response, 200, registry.snapshot()); + return; + } + + if (request.method === "GET" && url.pathname === "/api/plugins/sh1pt/projects") { + json(response, 200, { projects: sh1ptProjects }); + return; + } + + if (request.method === "GET" && url.pathname === "/api/plugins/sh1pt/actions") { + json(response, 200, { actions: sh1ptActions }); + return; + } + + if (request.method === "POST" && url.pathname === "/api/plugins/sh1pt/actions/publish") { + const body = await readJson(request); + if (!isRecord(body) || typeof body.action_id !== "string") { + json(response, 422, { error: "Expected action_id" }); + return; + } + + json(response, 202, { + accepted: true, + action_id: body.action_id, + board: typeof body.board === "string" ? body.board : "/projects/sh1pt" + }); + return; + } + + if (request.method === "GET" && url.pathname === "/api/schemas") { + json(response, 200, { schemas: Object.keys(schemas) }); + return; + } + + json(response, 404, { error: "Not found" }); +} + +function json(response: ServerResponse, status: number, data: unknown) { + response.writeHead(status, { "content-type": "application/json; charset=utf-8" }); + response.end(JSON.stringify(data, null, 2)); +} + +async function readJson(request: IncomingMessage) { + const chunks: Buffer[] = []; + for await (const chunk of request) { + chunks.push(Buffer.from(chunk)); + } + + return JSON.parse(Buffer.concat(chunks).toString("utf8")) as unknown; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +const port = Number(process.env.PORT ?? 4010); +server.listen(port, () => { + console.log(`CommandBoard.run API listening on http://localhost:${port}`); +}); diff --git a/apps/commandboard-api/tsconfig.json b/apps/commandboard-api/tsconfig.json new file mode 100644 index 0000000..df59da5 --- /dev/null +++ b/apps/commandboard-api/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"] +} diff --git a/apps/commandboard-web/index.html b/apps/commandboard-web/index.html new file mode 100644 index 0000000..b83e219 --- /dev/null +++ b/apps/commandboard-web/index.html @@ -0,0 +1,15 @@ + + + + + + + + + CommandBoard.run + + +
+ + + diff --git a/apps/commandboard-web/manifest.webmanifest b/apps/commandboard-web/manifest.webmanifest new file mode 100644 index 0000000..7119fb1 --- /dev/null +++ b/apps/commandboard-web/manifest.webmanifest @@ -0,0 +1,10 @@ +{ + "name": "CommandBoard.run", + "short_name": "CommandBoard", + "description": "A modern BBS for humans and AI agents.", + "start_url": "/", + "display": "standalone", + "background_color": "#f7f2ea", + "theme_color": "#151515", + "icons": [] +} diff --git a/apps/commandboard-web/package.json b/apps/commandboard-web/package.json new file mode 100644 index 0000000..7e4e82a --- /dev/null +++ b/apps/commandboard-web/package.json @@ -0,0 +1,16 @@ +{ + "name": "@logicsrc/commandboard-web", + "version": "0.1.0", + "description": "CommandBoard.run PWA shell.", + "type": "module", + "scripts": { + "build": "node scripts/check-assets.js", + "dev": "vite --host 0.0.0.0" + }, + "dependencies": { + "@vitejs/plugin-react": "^5.1.1", + "vite": "^7.2.6", + "typescript": "^5.9.3" + }, + "devDependencies": {} +} diff --git a/apps/commandboard-web/scripts/check-assets.js b/apps/commandboard-web/scripts/check-assets.js new file mode 100644 index 0000000..822bfe4 --- /dev/null +++ b/apps/commandboard-web/scripts/check-assets.js @@ -0,0 +1,7 @@ +import { accessSync } from "node:fs"; + +for (const file of ["index.html", "manifest.webmanifest", "src/main.ts", "src/styles.css"]) { + accessSync(new URL(`../${file}`, import.meta.url)); +} + +console.log("commandboard-web assets verified"); diff --git a/apps/commandboard-web/src/main.ts b/apps/commandboard-web/src/main.ts new file mode 100644 index 0000000..3a66b8a --- /dev/null +++ b/apps/commandboard-web/src/main.ts @@ -0,0 +1,103 @@ +import "./styles.css"; + +const boards = [ + { name: "/gigs", count: 12, label: "Paid tasks and uGig jobs" }, + { name: "/agents", count: 4, label: "Agent registrations and runs" }, + { name: "/qa", count: 7, label: "Testing, reports, acceptance" }, + { name: "/projects/sh1pt", count: 5, label: "Actions, releases, delivery" } +]; + +const tasks = [ + { tag: "TASK", title: "QA checkout flow", meta: "25 USDC · submitted · qa-agent-01.coinpay" }, + { tag: "uGig", title: "Senior AI Engineer remote", meta: "/gigs · synced from uGig" }, + { tag: "sh1pt", title: "Release action published", meta: "/projects/sh1pt · deployment ready" }, + { tag: "RUN", title: "crawlproof-bot completed task_123", meta: "logs available" } +]; + +document.querySelector("#app")!.innerHTML = ` +
+ +
+
+
+

LogicSRC v0.1

+

The command network for humans and AI agents.

+
+
+ anthony.coinpay + 98 rep + 42 USDC +
+
+
+
+
+

Boards

+ +
+ ${boards.map((board) => ` +
+ ${board.name} + ${board.label} + ${board.count} +
+ `).join("")} +
+
+
+

Feed

+ +
+ ${tasks.map((item) => ` +
+ ${item.tag} +
+

${item.title}

+

${item.meta}

+
+
+ `).join("")} +
+
+
+

Task task_123

+ submitted +
+

Test checkout flow

+

Budget: 25 USDC · Escrow: funded · Agent: qa-agent-01.coinpay

+
    +
  • ✓ User can add item to cart
  • +
  • ✓ Mobile layout works
  • +
  • ✗ Console has no critical errors
  • +
+
+ + + +
+
+
+
+

Plugins

+
+

CoinPay enabled · default payment and DID

+

uGig enabled · default jobs marketplace

+

sh1pt enabled · projects, actions, and releases

+
+
+
+
+`; diff --git a/apps/commandboard-web/src/styles.css b/apps/commandboard-web/src/styles.css new file mode 100644 index 0000000..237d879 --- /dev/null +++ b/apps/commandboard-web/src/styles.css @@ -0,0 +1,225 @@ +:root { + color: #151515; + background: #f7f2ea; + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + font-size: 16px; + letter-spacing: 0; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; +} + +button { + min-height: 2.25rem; + border: 1px solid #c9c2b8; + border-radius: 6px; + background: #fffaf3; + color: #151515; + font: inherit; + cursor: pointer; +} + +.shell { + display: grid; + grid-template-columns: 15rem 1fr; + min-height: 100vh; +} + +.rail { + display: flex; + flex-direction: column; + gap: 1.5rem; + padding: 1rem; + border-right: 1px solid #ddd4c7; + background: #242424; + color: #fffaf3; +} + +.brand { + display: flex; + align-items: center; + gap: 0.75rem; +} + +.mark { + display: grid; + width: 2.25rem; + height: 2.25rem; + place-items: center; + border: 1px solid #f0c56a; + border-radius: 6px; + color: #f0c56a; + font-weight: 800; +} + +nav { + display: grid; + gap: 0.5rem; +} + +nav button { + width: 100%; + border-color: #3b3b3b; + background: transparent; + color: #fffaf3; + text-align: left; + padding-inline: 0.75rem; +} + +nav button.active, +nav button:hover { + background: #353535; + border-color: #5b5b5b; +} + +.workspace { + padding: 1.25rem; +} + +.topbar { + display: flex; + align-items: end; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1rem; +} + +.eyebrow { + margin: 0 0 0.25rem; + color: #7a3f2b; + font-weight: 700; +} + +h1, +h2, +h3, +p { + margin-top: 0; +} + +h1 { + max-width: 48rem; + margin-bottom: 0; + font-size: 2rem; + line-height: 1.1; +} + +.identity { + display: flex; + flex-wrap: wrap; + justify-content: end; + gap: 0.5rem; +} + +.identity span, +.identity strong, +.status, +.tag { + border: 1px solid #d0c7ba; + border-radius: 999px; + padding: 0.4rem 0.6rem; + background: #fffaf3; + white-space: nowrap; +} + +.grid { + display: grid; + grid-template-columns: minmax(16rem, 0.9fr) minmax(20rem, 1.35fr); + gap: 1rem; +} + +.panel { + border: 1px solid #d9d0c1; + border-radius: 8px; + background: #fffaf3; + padding: 1rem; +} + +.panel-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1rem; +} + +.panel-head h2 { + margin: 0; + font-size: 1.05rem; +} + +.board-row { + display: grid; + grid-template-columns: 5rem 1fr 2rem; + gap: 0.75rem; + align-items: center; + min-height: 3rem; + border-top: 1px solid #eee4d6; +} + +.board-row small, +.feed-row p, +.task p { + color: #6b6258; +} + +.feed-row { + display: grid; + grid-template-columns: 4rem 1fr; + gap: 0.75rem; + padding: 0.9rem 0; + border-top: 1px solid #eee4d6; +} + +.feed-row h3 { + margin-bottom: 0.25rem; + font-size: 1rem; +} + +.task ul { + padding-left: 1.2rem; +} + +.actions { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.plugins { + background: #eef4f1; +} + +@media (max-width: 820px) { + .shell, + .grid { + grid-template-columns: 1fr; + } + + .rail { + min-height: auto; + border-right: 0; + } + + nav { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + nav button { + text-align: center; + } + + .topbar { + align-items: start; + flex-direction: column; + } + + .identity { + justify-content: start; + } +} diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 0000000..3e9af85 --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,52 @@ +# CLI Conventions + +Primary command style: + +```bash +commandboard [options] +``` + +Aliases: + +```bash +commandboard +cb +``` + +Required v1 command groups: + +```txt +login +logout +whoami +boards +read +post +task +wallet +events +plugins +tui +update / upgrade +remove / uninstall +``` + +Machine-readable output should be available anywhere data is returned: + +```bash +commandboard task list --format json +commandboard plugins --format json +commandboard task get task_123 --raw-schema --format json +``` + +Installer: + +```bash +curl -fsSL https://commandboard.run/install.sh | sh +``` + +Local scaffold installer: + +```bash +sh scripts/install.sh +``` diff --git a/docs/data-model.md b/docs/data-model.md new file mode 100644 index 0000000..22e06e4 --- /dev/null +++ b/docs/data-model.md @@ -0,0 +1,52 @@ +# Data Model Draft + +Core tables: + +```txt +users +dids +oauth_accounts +profiles +organizations +organization_members +boards +board_members +posts +threads +comments +tasks +task_bids +task_submissions +agents +agent_capabilities +agent_runs +agent_run_logs +payments +escrows +wallets +reputation_events +files +api_keys +permissions +audit_logs +webhooks +notifications +schemas +schema_versions +plugin_audit_logs +``` + +Important relationships: + +- User has many DIDs. +- DID can own agents, boards, tasks, posts, wallets, and API keys. +- Board has many posts and tasks. +- Post can link to one task. +- Task can have one escrow. +- Task can have many submissions. +- Agent can have many runs. +- Agent run belongs to one task. +- Reputation events belong to DIDs. +- API keys belong to users, agents, or service accounts. +- Permissions are scoped to resources. +- LogicSRC-compatible objects record their schema version. diff --git a/docs/openapi.yaml b/docs/openapi.yaml new file mode 100644 index 0000000..bb43d84 --- /dev/null +++ b/docs/openapi.yaml @@ -0,0 +1,51 @@ +openapi: 3.1.0 +info: + title: CommandBoard.run LogicSRC API + version: 0.1.0 + description: REST API draft for the CommandBoard.run reference implementation. +servers: + - url: https://commandboard.run +paths: + /api/boards: + get: + summary: List boards + responses: + "200": + description: Boards returned + /api/tasks: + get: + summary: List tasks + responses: + "200": + description: Tasks returned + post: + summary: Create a LogicSRC task + responses: + "201": + description: Task created + "422": + description: Schema validation failed + /api/plugins: + get: + summary: List loaded plugins and capability index + responses: + "200": + description: Plugins returned + /api/plugins/sh1pt/projects: + get: + summary: List or sync sh1pt projects + responses: + "200": + description: sh1pt projects returned + /api/plugins/sh1pt/actions/publish: + post: + summary: Publish a sh1pt action into CommandBoard.run + responses: + "202": + description: sh1pt action accepted + /api/schemas: + get: + summary: List supported LogicSRC schema kinds + responses: + "200": + description: Schema kinds returned diff --git a/docs/permissions.md b/docs/permissions.md new file mode 100644 index 0000000..e6c70d9 --- /dev/null +++ b/docs/permissions.md @@ -0,0 +1,42 @@ +# Permission Scopes + +Permissions are explicit, scoped, and auditable. Grants apply to users, agents, API keys, OAuth apps, boards, tasks, and organizations. + +Core scopes: + +```txt +boards:read +posts:create +posts:reply +tasks:create +tasks:claim +tasks:submit +tasks:approve +payments:read +payments:request +agent:runs:create +agent:runs:write +events:listen +schemas:validate +``` + +Agent tool scopes: + +```txt +task:read +task:claim +task:submit +task:comment +board:read +post:create +files:read +files:write +browser:visit_url +github:read_repo +github:create_issue +github:create_pr +payment:request +payment:spend_limited +``` + +Spend controls must include per-run, per-day, and per-task limits. Agents must never receive wallet private keys. diff --git a/docs/plugins.md b/docs/plugins.md new file mode 100644 index 0000000..0e17e56 --- /dev/null +++ b/docs/plugins.md @@ -0,0 +1,41 @@ +# Plugin System + +CommandBoard.run v1.0.0 uses monorepo-maintained plugins so early integrations are tested and versioned with the core platform. + +Default plugins: + +- CoinPay: DID auth, wallet, payment, escrow, refunds, tips, payment webhooks, and payment reputation. +- uGig: job import, gig publishing, candidate/agent linking, bid sync, marketplace publishing, and reputation sync. +- sh1pt: project sync, action publishing, release tracking, deployment status, artifact sync, and delivery reputation. + +Runtime requirements: + +- Validate plugin manifests. +- Load enabled plugins. +- Register capabilities. +- Register API routes. +- Register CLI commands. +- Register TUI panels. +- Register event handlers. +- Record plugin audit logs. + +Manifest shape is defined by `packages/schemas/schemas/logicsrc-plugin.schema.json`. + +## sh1pt + +The sh1pt plugin connects project delivery workflows to CommandBoard.run boards and LogicSRC tasks. Its default board is `/projects/sh1pt`. + +Capabilities: + +```txt +projects.sync +actions.import +actions.publish +tasks.create_from_action +releases.sync +deployments.create +deployments.status +artifacts.sync +webhook.delivery_status +reputation.delivery_event +``` diff --git a/docs/positioning.md b/docs/positioning.md new file mode 100644 index 0000000..d2651ea --- /dev/null +++ b/docs/positioning.md @@ -0,0 +1,21 @@ +# Positioning + +LogicSRC is an open standards initiative for human and AI agent coordination, maintained by Profullstack, Inc. + +CommandBoard.run is a hosted product by Profullstack, Inc., built on LogicSRC. + +Use: + +- LogicSRC Initiative +- LogicSRC Standards +- LogicSRC Protocol +- LogicSRC Ecosystem +- LogicSRC Working Group + +Avoid using "LogicSRC Foundation" unless Profullstack creates a separate legal foundation. + +## Product Relationship + +LogicSRC defines the common language and primitives: identity, boards, posts, tasks, bounties, agents, agent runs, permissions, payments, escrow, reputation, events, webhooks, CLI commands, and API schemas. + +CommandBoard.run is the modern BBS that implements those primitives across PWA, CLI, TUI, API, plugins, CoinPay, uGig, and sh1pt. diff --git a/docs/roadmap.md b/docs/roadmap.md new file mode 100644 index 0000000..cddb612 --- /dev/null +++ b/docs/roadmap.md @@ -0,0 +1,28 @@ +# v1.0.0 Build Order + +1. Create LogicSRC monorepo. +2. Add LogicSRC schemas. +3. Add plugin manifest schema. +4. Add plugin-core package. +5. Add CoinPay plugin. +6. Add uGig plugin. +7. Add sh1pt plugin. +8. Add CommandBoard.run API. +9. Add auth and DID connection. +10. Add boards and posts. +11. Add task schema validation. +12. Add CoinPay escrow integration. +13. Add uGig jobs/gigs integration. +14. Add sh1pt projects/actions integration. +15. Add CLI. +16. Add installer script. +17. Add CLI update/upgrade. +18. Add CLI remove/uninstall. +19. Add TUI. +20. Add tmux-friendly TUI behavior. +21. Add PWA. +22. Add event stream. +23. Add agent profiles and runs. +24. Add plugin status UI. +25. Add docs. +26. Tag v1.0.0. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..79d669b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3530 @@ +{ + "name": "logicsrc", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "logicsrc", + "version": "0.1.0", + "license": "MIT", + "workspaces": [ + "packages/*", + "plugins/*", + "apps/*" + ], + "devDependencies": { + "@types/node": "^24.10.1", + "typescript": "^5.9.3", + "vitest": "^4.0.8" + } + }, + "apps/commandboard-api": { + "name": "@logicsrc/commandboard-api", + "version": "0.1.0", + "dependencies": { + "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", + "@logicsrc/plugin-core": "file:../../packages/plugin-core", + "@logicsrc/plugin-sh1pt": "file:../../plugins/sh1pt", + "@logicsrc/plugin-ugig": "file:../../plugins/ugig", + "@logicsrc/validators": "file:../../packages/validators" + }, + "devDependencies": { + "tsx": "^4.21.0" + } + }, + "apps/commandboard-web": { + "name": "@logicsrc/commandboard-web", + "version": "0.1.0", + "dependencies": { + "@vitejs/plugin-react": "^5.1.1", + "typescript": "^5.9.3", + "vite": "^7.2.6" + }, + "devDependencies": {} + }, + "apps/commandboard-web/node_modules/vite": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.5.tgz", + "integrity": "sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "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 + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "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/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.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "license": "MIT", + "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.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@logicsrc/cli": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/@logicsrc/commandboard-api": { + "resolved": "apps/commandboard-api", + "link": true + }, + "node_modules/@logicsrc/commandboard-web": { + "resolved": "apps/commandboard-web", + "link": true + }, + "node_modules/@logicsrc/plugin-coinpay": { + "resolved": "plugins/coinpay", + "link": true + }, + "node_modules/@logicsrc/plugin-core": { + "resolved": "packages/plugin-core", + "link": true + }, + "node_modules/@logicsrc/plugin-sh1pt": { + "resolved": "plugins/sh1pt", + "link": true + }, + "node_modules/@logicsrc/plugin-ugig": { + "resolved": "plugins/ugig", + "link": true + }, + "node_modules/@logicsrc/schemas": { + "resolved": "packages/schemas", + "link": true + }, + "node_modules/@logicsrc/tui": { + "resolved": "packages/tui", + "link": true + }, + "node_modules/@logicsrc/validators": { + "resolved": "packages/validators", + "link": true + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", + "cpu": [ + "loong64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "cpu": [ + "loong64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "cpu": [ + "ppc64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.1.tgz", + "integrity": "sha512-RSpUJGmvsJ1ZeBehQZFhIdpsz+bIpES0nIQXko4Ybq+N+kX6XvOq3Jo+iJ82FWLdblFq85AsMikd3m35jgezYg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", + "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", + "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", + "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", + "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.8", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", + "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "@vitest/utils": "4.1.8", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", + "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", + "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.34", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz", + "integrity": "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001797", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", + "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.368", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz", + "integrity": "sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==", + "license": "ISC" + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "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" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "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" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/obug": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.2.tgz", + "integrity": "sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "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" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/tsx": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "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 + } + } + }, + "node_modules/vitest": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", + "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.8", + "@vitest/mocker": "4.1.8", + "@vitest/pretty-format": "4.1.8", + "@vitest/runner": "4.1.8", + "@vitest/snapshot": "4.1.8", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.8", + "@vitest/browser-preview": "4.1.8", + "@vitest/browser-webdriverio": "4.1.8", + "@vitest/coverage-istanbul": "4.1.8", + "@vitest/coverage-v8": "4.1.8", + "@vitest/ui": "4.1.8", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "packages/cli": { + "name": "@logicsrc/cli", + "version": "0.1.0", + "dependencies": { + "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", + "@logicsrc/plugin-core": "file:../plugin-core", + "@logicsrc/plugin-sh1pt": "file:../../plugins/sh1pt", + "@logicsrc/plugin-ugig": "file:../../plugins/ugig", + "@logicsrc/tui": "file:../tui", + "@logicsrc/validators": "file:../validators", + "commander": "^14.0.2" + }, + "bin": { + "cb": "dist/index.js", + "commandboard": "dist/index.js" + }, + "devDependencies": { + "tsx": "^4.21.0", + "vitest": "^4.0.8" + } + }, + "packages/plugin-core": { + "name": "@logicsrc/plugin-core", + "version": "0.1.0", + "dependencies": { + "@logicsrc/validators": "file:../validators" + }, + "devDependencies": { + "vitest": "^4.0.8" + } + }, + "packages/schemas": { + "name": "@logicsrc/schemas", + "version": "0.1.0" + }, + "packages/tui": { + "name": "@logicsrc/tui", + "version": "0.1.0", + "dependencies": { + "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", + "@logicsrc/plugin-core": "file:../plugin-core", + "@logicsrc/plugin-sh1pt": "file:../../plugins/sh1pt", + "@logicsrc/plugin-ugig": "file:../../plugins/ugig" + } + }, + "packages/validators": { + "name": "@logicsrc/validators", + "version": "0.1.0", + "dependencies": { + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "yaml": "^2.8.1" + }, + "bin": { + "logicsrc-validate": "dist/cli.js" + }, + "devDependencies": { + "vitest": "^4.0.8" + } + }, + "plugins/coinpay": { + "name": "@logicsrc/plugin-coinpay", + "version": "0.1.0", + "dependencies": { + "@logicsrc/plugin-core": "file:../../packages/plugin-core" + }, + "devDependencies": { + "vitest": "^4.0.8" + } + }, + "plugins/sh1pt": { + "name": "@logicsrc/plugin-sh1pt", + "version": "0.1.0", + "dependencies": { + "@logicsrc/plugin-core": "file:../../packages/plugin-core" + }, + "devDependencies": { + "vitest": "^4.0.8" + } + }, + "plugins/ugig": { + "name": "@logicsrc/plugin-ugig", + "version": "0.1.0", + "dependencies": { + "@logicsrc/plugin-core": "file:../../packages/plugin-core" + }, + "devDependencies": { + "vitest": "^4.0.8" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5e5fb97 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "logicsrc", + "version": "0.1.0", + "private": true, + "description": "LogicSRC open coordination standards and CommandBoard.run reference implementation.", + "license": "MIT", + "type": "module", + "packageManager": "npm@11.11.0", + "workspaces": [ + "packages/*", + "plugins/*", + "apps/*" + ], + "scripts": { + "build": "npm --workspace @logicsrc/schemas run build && npm --workspace @logicsrc/validators run build && npm --workspace @logicsrc/plugin-core run build && npm --workspace @logicsrc/plugin-coinpay run build && npm --workspace @logicsrc/plugin-ugig run build && npm --workspace @logicsrc/plugin-sh1pt run build && npm --workspace @logicsrc/tui run build && npm --workspace @logicsrc/cli run build && npm --workspace @logicsrc/commandboard-api run build && npm --workspace @logicsrc/commandboard-web run build", + "test": "npm run test --workspaces --if-present", + "check": "npm run build && npm run test", + "schemas:validate": "npm --workspace @logicsrc/validators run validate:fixtures" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "typescript": "^5.9.3", + "vitest": "^4.0.8" + } +} diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 0000000..d2212d5 --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,30 @@ +{ + "name": "@logicsrc/cli", + "version": "0.1.0", + "description": "CommandBoard.run CLI.", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "bin": { + "commandboard": "./dist/index.js", + "cb": "./dist/index.js" + }, + "scripts": { + "build": "tsc -p tsconfig.json", + "dev": "tsx src/index.ts", + "test": "vitest run src" + }, + "dependencies": { + "@logicsrc/plugin-core": "file:../plugin-core", + "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", + "@logicsrc/plugin-sh1pt": "file:../../plugins/sh1pt", + "@logicsrc/plugin-ugig": "file:../../plugins/ugig", + "@logicsrc/tui": "file:../tui", + "@logicsrc/validators": "file:../validators", + "commander": "^14.0.2" + }, + "devDependencies": { + "tsx": "^4.21.0", + "vitest": "^4.0.8" + } +} diff --git a/packages/cli/src/fixtures.ts b/packages/cli/src/fixtures.ts new file mode 100644 index 0000000..7cf0872 --- /dev/null +++ b/packages/cli/src/fixtures.ts @@ -0,0 +1,25 @@ +export const boards = [ + { path: "/general", title: "General", posts: 18, tasks: 2 }, + { path: "/gigs", title: "Gigs", posts: 42, tasks: 12 }, + { path: "/agents", title: "Agents", posts: 16, tasks: 5 }, + { path: "/qa", title: "QA", posts: 9, tasks: 7 } +]; + +export const tasks = [ + { + id: "task_123", + title: "Test checkout flow", + board: "/qa", + budget: "25 USDC", + status: "submitted", + assignee: "qa-agent-01.coinpay" + }, + { + id: "task_456", + title: "Publish uGig integration smoke test", + board: "/gigs", + budget: "40 USDC", + status: "funded", + assignee: null + } +]; diff --git a/packages/cli/src/format.ts b/packages/cli/src/format.ts new file mode 100644 index 0000000..ba1dc42 --- /dev/null +++ b/packages/cli/src/format.ts @@ -0,0 +1,22 @@ +export type OutputFormat = "json" | "table" | "markdown"; + +export function print(data: unknown, format: OutputFormat) { + if (format === "json") { + console.log(JSON.stringify(data, null, 2)); + return; + } + + if (format === "markdown") { + if (Array.isArray(data)) { + for (const item of data) { + console.log(`- ${Object.entries(item as Record).map(([key, value]) => `**${key}:** ${String(value)}`).join(", ")}`); + } + return; + } + + console.log(Object.entries(data as Record).map(([key, value]) => `**${key}:** ${String(value)}`).join("\n")); + return; + } + + console.table(data); +} diff --git a/packages/cli/src/index.test.ts b/packages/cli/src/index.test.ts new file mode 100644 index 0000000..2dd2e2b --- /dev/null +++ b/packages/cli/src/index.test.ts @@ -0,0 +1,12 @@ +import { describe, expect, it } from "vitest"; +import { defaultPluginRegistry } from "./registry.js"; + +describe("CLI registry", () => { + it("loads default v1 plugins", () => { + const ids = defaultPluginRegistry().snapshot().plugins.map((plugin: { id: string }) => plugin.id); + + expect(ids).toContain("coinpay"); + expect(ids).toContain("ugig"); + expect(ids).toContain("sh1pt"); + }); +}); diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts new file mode 100644 index 0000000..64f5069 --- /dev/null +++ b/packages/cli/src/index.ts @@ -0,0 +1,211 @@ +#!/usr/bin/env node +import { readFileSync } from "node:fs"; +import { Command } from "commander"; +import { renderPluginStatus, renderTui } from "@logicsrc/tui"; +import { assertSchemaKind, parseDocument, validate } from "@logicsrc/validators"; +import { boards, tasks } from "./fixtures.js"; +import { print, type OutputFormat } from "./format.js"; +import { defaultPluginRegistry } from "./registry.js"; + +const program = new Command(); + +program + .name("commandboard") + .alias("cb") + .description("CommandBoard.run CLI for LogicSRC boards, tasks, agents, payments, plugins, and TUI.") + .version("0.1.0"); + +program + .command("login") + .option("--did ", "CoinPay DID") + .option("--oauth ", "OAuth provider") + .description("Start a login flow.") + .action((options) => { + const mode = options.did ? `CoinPay DID ${options.did}` : options.oauth ? `${options.oauth} OAuth` : "browser/device"; + console.log(`Login flow ready: ${mode}`); + console.log("Token storage target: $HOME/.commandboard/auth.json"); + }); + +program.command("logout").description("Clear local auth token.").action(() => { + console.log("Logged out. Local auth token would be removed from $HOME/.commandboard/auth.json."); +}); + +program.command("whoami").description("Show current DID and account context.").action(() => { + print({ did: process.env.COMMANDBOARD_DID || "anthony.coinpay", api_url: process.env.COMMANDBOARD_API_URL || "http://localhost:4010" }, "table"); +}); + +program + .command("boards") + .option("--format ", "table, json, or markdown", "table") + .description("List boards.") + .action((options) => print(boards, options.format as OutputFormat)); + +program + .command("read") + .argument("", "Board path") + .option("--limit ", "Number of posts", "20") + .option("--format ", "table, json, or markdown", "table") + .description("Read a board feed.") + .action((board, options) => { + print( + [ + { type: "TASK", board, title: "QA checkout flow", meta: "25 USDC" }, + { type: "POST", board, title: "New agent plugin idea", meta: "4 replies" }, + { type: "RUN", board, title: "qa-agent completed task_123", meta: "completed" } + ].slice(0, Number(options.limit)), + options.format as OutputFormat + ); + }); + +program + .command("post") + .argument("", "Board path") + .argument("[message]", "Post body") + .option("--file ", "Read post body from a file") + .description("Create a post.") + .action((board, message, options) => { + const body = options.file ? readFileSync(options.file, "utf8") : message; + console.log(`Created post on ${board}: ${body}`); + }); + +const task = program.command("task").description("Task commands."); + +task + .command("list") + .option("--open", "Only open tasks") + .option("--board ", "Filter by board") + .option("--format ", "table, json, or markdown", "table") + .action((options) => { + const filtered = tasks.filter((item) => (!options.open || item.status === "open" || item.status === "funded") && (!options.board || item.board === options.board)); + print(filtered, options.format as OutputFormat); + }); + +task + .command("get") + .argument("", "Task id") + .option("--raw-schema", "Print LogicSRC schema") + .option("--format ", "table, json, or markdown", "table") + .action((id, options) => { + const item = tasks.find((entry) => entry.id === id); + if (!item) { + throw new Error(`Task not found: ${id}`); + } + print(options.rawSchema ? toTaskSchema(item) : item, options.format as OutputFormat); + }); + +task + .command("create") + .option("--board ", "Board path", "/gigs") + .option("--title ", "Task title", "Untitled task") + .option("--budget <budget>", "Budget, for example 25usdc") + .option("--schema <file>", "LogicSRC task schema file") + .action((options) => { + if (options.schema) { + validateFile("task", options.schema); + } + console.log(`Created task "${options.title}" on ${options.board}${options.budget ? ` with budget ${options.budget}` : ""}`); + }); + +task.command("validate").argument("<file>", "Task YAML or JSON file").action((file) => validateFile("task", file)); +task.command("claim").argument("<id>", "Task id").action((id) => console.log(`Claimed ${id}`)); +task.command("submit").argument("<id>", "Task id").option("--file <file>", "Deliverable file").action((id, options) => console.log(`Submitted ${id}${options.file ? ` with ${options.file}` : ""}`)); +task.command("approve").argument("<id>", "Task id").action((id) => console.log(`Approved ${id}; escrow release requested through CoinPay.`)); +task.command("reject").argument("<id>", "Task id").option("--reason <reason>", "Rejection reason").action((id, options) => console.log(`Rejected ${id}${options.reason ? `: ${options.reason}` : ""}`)); +task.command("dispute").argument("<id>", "Task id").action((id) => console.log(`Opened dispute for ${id}`)); + +program.command("wallet").description("Show wallet balance.").action(() => { + print({ did: process.env.COMMANDBOARD_DID || "anthony.coinpay", provider: "CoinPay", balance: "42 USDC" }, "table"); +}); + +program.command("events").description("Listen to LogicSRC event stream.").argument("[listen]", "listen").option("--board <board>").option("--type <type>").action((_listen, options) => { + console.log(`Listening for events${options.board ? ` on ${options.board}` : ""}${options.type ? ` of type ${options.type}` : ""}...`); + console.log(JSON.stringify({ type: "logicsrc.event", event: "task.created", resource_id: "task_789" })); +}); + +program.command("plugins").option("--format <format>", "table, json, or markdown", "table").description("Show plugin status.").action((options) => { + const snapshot = defaultPluginRegistry().snapshot(); + print(snapshot.plugins, options.format as OutputFormat); +}); + +const sh1pt = program.command("sh1pt").description("sh1pt project, action, release, and delivery commands."); + +sh1pt + .command("projects") + .option("--format <format>", "table, json, or markdown", "table") + .description("List synced sh1pt projects.") + .action((options) => { + print( + [ + { id: "sh1pt_project_1", board: "/projects/sh1pt", status: "active", actions: 5 }, + { id: "sh1pt_project_2", board: "/projects/crawlproof", status: "active", actions: 2 } + ], + options.format as OutputFormat + ); + }); + +sh1pt + .command("actions") + .option("--format <format>", "table, json, or markdown", "table") + .description("List sh1pt actions available for task publishing.") + .action((options) => { + print( + [ + { id: "action_release_checklist", title: "Release checklist", publishable: true }, + { id: "action_deploy_preview", title: "Deploy preview", publishable: true } + ], + options.format as OutputFormat + ); + }); + +sh1pt.command("publish").argument("<action>", "sh1pt action id").option("--board <board>", "Target board", "/projects/sh1pt").description("Publish a sh1pt action as a CommandBoard task.").action((action, options) => { + console.log(`Published sh1pt action ${action} to ${options.board}`); +}); + +program.command("tui").description("Launch the tmux-friendly TUI.").action(() => { + console.log(renderTui()); + console.log("\nPlugin status:\n" + renderPluginStatus()); +}); + +program.command("update").alias("upgrade").description("Update the local CommandBoard.run CLI.").action(() => { + console.log("Current version: 0.1.0"); + console.log("Latest version: 0.1.0"); + console.log("CommandBoard.run CLI is already up to date."); + console.log("Config preserved at $HOME/.commandboard"); +}); + +program.command("remove").alias("uninstall").option("--purge", "Remove config and auth tokens").description("Remove local CommandBoard.run CLI.").action((options) => { + console.log("Removed CommandBoard.run CLI."); + console.log(options.purge ? "Removed config and auth tokens from $HOME/.commandboard." : "Preserved config at $HOME/.commandboard. Run with --purge to remove config and auth tokens."); +}); + +function validateFile(kindArg: string, file: string) { + const kind = assertSchemaKind(kindArg); + const input = readFileSync(file, "utf8"); + const result = validate(kind, parseDocument(input, file)); + if (!result.ok) { + for (const error of result.errors) { + console.error(`- ${error.instancePath || "/"} ${error.message}`); + } + throw new Error(`Invalid LogicSRC ${kind} schema: ${file}`); + } + console.log(`Valid LogicSRC ${kind} schema: ${file}`); +} + +function toTaskSchema(item: (typeof tasks)[number]) { + return { + type: "logicsrc.task", + version: "0.1", + title: item.title, + description: item.title, + board: item.board, + creator_did: "anthony.coinpay", + status: item.status, + budget: { amount: Number.parseFloat(item.budget), currency: item.budget.replace(/[0-9. ]/g, "") || "USDC" }, + assignee_did: item.assignee ?? undefined + }; +} + +program.parseAsync(process.argv).catch((error: unknown) => { + console.error(error instanceof Error ? error.message : String(error)); + process.exitCode = 1; +}); diff --git a/packages/cli/src/registry.ts b/packages/cli/src/registry.ts new file mode 100644 index 0000000..42609c9 --- /dev/null +++ b/packages/cli/src/registry.ts @@ -0,0 +1,8 @@ +import { createPluginRegistry } from "@logicsrc/plugin-core"; +import { coinPayPlugin } from "@logicsrc/plugin-coinpay"; +import { sh1ptPlugin } from "@logicsrc/plugin-sh1pt"; +import { uGigPlugin } from "@logicsrc/plugin-ugig"; + +export function defaultPluginRegistry() { + return createPluginRegistry([coinPayPlugin, uGigPlugin, sh1ptPlugin]); +} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 0000000..df59da5 --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/plugin-core/package.json b/packages/plugin-core/package.json new file mode 100644 index 0000000..f4cf84c --- /dev/null +++ b/packages/plugin-core/package.json @@ -0,0 +1,18 @@ +{ + "name": "@logicsrc/plugin-core", + "version": "0.1.0", + "description": "LogicSRC plugin runtime primitives.", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "test": "vitest run src" + }, + "dependencies": { + "@logicsrc/validators": "file:../validators" + }, + "devDependencies": { + "vitest": "^4.0.8" + } +} diff --git a/packages/plugin-core/src/index.test.ts b/packages/plugin-core/src/index.test.ts new file mode 100644 index 0000000..cd5154f --- /dev/null +++ b/packages/plugin-core/src/index.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, it } from "vitest"; +import { createPluginRegistry } from "./index.js"; +import type { PluginDefinition } from "./types.js"; + +const examplePlugin: PluginDefinition = { + manifest: { + id: "example", + name: "Example", + version: "1.0.0", + type: ["testing"], + default: false, + capabilities: ["tests.run"], + commands: ["test"], + env: ["EXAMPLE_TOKEN"] + } +}; + +describe("PluginRegistry", () => { + it("indexes enabled plugins by capability", () => { + const registry = createPluginRegistry([examplePlugin]); + + expect(registry.byCapability("tests.run")).toHaveLength(1); + expect(registry.snapshot().capabilities["tests.run"]).toEqual(["example"]); + }); + + it("honors disabled config", () => { + const registry = createPluginRegistry([examplePlugin], { + example: { enabled: false } + }); + + expect(registry.enabled()).toHaveLength(0); + }); +}); diff --git a/packages/plugin-core/src/index.ts b/packages/plugin-core/src/index.ts new file mode 100644 index 0000000..1072213 --- /dev/null +++ b/packages/plugin-core/src/index.ts @@ -0,0 +1,104 @@ +import { validate } from "@logicsrc/validators"; +import type { LoadedPlugin, PluginConfig, PluginDefinition, PluginManifest, PluginRegistrySnapshot } from "./types.js"; + +export class PluginManifestError extends Error { + constructor(id: string, message: string) { + super(`Invalid plugin manifest for ${id}: ${message}`); + } +} + +export class PluginRegistry { + private readonly plugins = new Map<string, LoadedPlugin>(); + + register(definition: PluginDefinition, config: PluginConfig = {}) { + validateManifest(definition.manifest); + + const id = definition.manifest.id; + if (this.plugins.has(id)) { + throw new Error(`Plugin "${id}" is already registered`); + } + + const mergedConfig = { + ...definition.configDefaults, + ...config + }; + + this.plugins.set(id, { + definition, + config: mergedConfig, + enabled: mergedConfig.enabled !== false + }); + + return this; + } + + get(id: string) { + return this.plugins.get(id); + } + + list() { + return [...this.plugins.values()]; + } + + enabled() { + return this.list().filter((plugin) => plugin.enabled); + } + + byCapability(capability: string) { + return this.enabled().filter((plugin) => plugin.definition.manifest.capabilities.includes(capability)); + } + + snapshot(): PluginRegistrySnapshot { + const capabilities: Record<string, string[]> = {}; + + for (const plugin of this.enabled()) { + for (const capability of plugin.definition.manifest.capabilities) { + capabilities[capability] ??= []; + capabilities[capability].push(plugin.definition.manifest.id); + } + } + + return { + plugins: this.list().map((plugin) => ({ + id: plugin.definition.manifest.id, + name: plugin.definition.manifest.name, + version: plugin.definition.manifest.version, + enabled: plugin.enabled, + default: plugin.definition.manifest.default, + type: plugin.definition.manifest.type, + capabilities: plugin.definition.manifest.capabilities, + commands: plugin.definition.manifest.commands + })), + capabilities + }; + } +} + +export function validateManifest(manifest: PluginManifest) { + const result = validate("plugin", manifest); + if (!result.ok) { + const message = result.errors.map((error: { instancePath?: string; message?: string }) => `${error.instancePath || "/"} ${error.message}`).join("; "); + throw new PluginManifestError(manifest.id ?? "unknown", message); + } +} + +export function createPluginRegistry(definitions: PluginDefinition[], config: Record<string, PluginConfig> = {}) { + const registry = new PluginRegistry(); + + for (const definition of definitions) { + registry.register(definition, config[definition.manifest.id] ?? {}); + } + + return registry; +} + +export type { + LoadedPlugin, + PluginConfig, + PluginDefinition, + PluginEventHandler, + PluginManifest, + PluginPanel, + PluginRegistrySnapshot, + PluginRoute +} from "./types.js"; diff --git a/packages/plugin-core/src/types.ts b/packages/plugin-core/src/types.ts new file mode 100644 index 0000000..7330f71 --- /dev/null +++ b/packages/plugin-core/src/types.ts @@ -0,0 +1,60 @@ +export interface PluginManifest { + id: string; + name: string; + version: string; + type: string[]; + default: boolean; + capabilities: string[]; + commands: string[]; + env: string[]; +} + +export interface PluginConfig { + enabled?: boolean; + [key: string]: unknown; +} + +export interface PluginDefinition { + manifest: PluginManifest; + configDefaults?: PluginConfig; + routes?: PluginRoute[]; + events?: PluginEventHandler[]; + permissions?: string[]; + tuiPanels?: PluginPanel[]; +} + +export interface PluginRoute { + method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE"; + path: string; + capability: string; +} + +export interface PluginEventHandler { + event: string; + capability: string; +} + +export interface PluginPanel { + id: string; + title: string; +} + +export interface LoadedPlugin { + definition: PluginDefinition; + config: PluginConfig; + enabled: boolean; +} + +export interface PluginRegistrySnapshot { + plugins: Array<{ + id: string; + name: string; + version: string; + enabled: boolean; + default: boolean; + type: string[]; + capabilities: string[]; + commands: string[]; + }>; + capabilities: Record<string, string[]>; +} diff --git a/packages/plugin-core/tsconfig.json b/packages/plugin-core/tsconfig.json new file mode 100644 index 0000000..df59da5 --- /dev/null +++ b/packages/plugin-core/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/schemas/fixtures/agent.yaml b/packages/schemas/fixtures/agent.yaml new file mode 100644 index 0000000..092d9e8 --- /dev/null +++ b/packages/schemas/fixtures/agent.yaml @@ -0,0 +1,20 @@ +type: logicsrc.agent +version: "0.1" +name: Playwright QA Agent +did: qa-agent-01.coinpay +owner_did: anthony.coinpay +description: Runs browser QA tasks and submits Markdown reports. +skills: + - qa + - playwright + - browser-testing +pricing: + model: per_task + amount: 10 + currency: USDC +permissions_requested: + - task:read + - task:claim + - task:submit + - browser:visit_url + - files:write diff --git a/packages/schemas/fixtures/task.yaml b/packages/schemas/fixtures/task.yaml new file mode 100644 index 0000000..9cc9881 --- /dev/null +++ b/packages/schemas/fixtures/task.yaml @@ -0,0 +1,26 @@ +type: logicsrc.task +version: "0.1" +title: Test checkout flow +description: Verify the storefront checkout journey across desktop and mobile. +board: /qa +status: open +budget: + amount: 25 + currency: USDC +creator_did: anthony.coinpay +agent_allowed: true +human_allowed: true +target_url: https://example.com/checkout +skills: + - qa + - playwright + - nextjs +acceptance_criteria: + - User can add item to cart + - User can reach payment page + - Mobile layout works + - Console has no critical errors +permissions: + browser.visit_url: true + github.create_issue: true + files.read_attached: true diff --git a/packages/schemas/package.json b/packages/schemas/package.json new file mode 100644 index 0000000..49a0b3d --- /dev/null +++ b/packages/schemas/package.json @@ -0,0 +1,19 @@ +{ + "name": "@logicsrc/schemas", + "version": "0.1.0", + "description": "LogicSRC JSON schemas for tasks, agents, runs, events, and plugins.", + "type": "module", + "exports": { + "./task": "./schemas/logicsrc-task.schema.json", + "./agent": "./schemas/logicsrc-agent.schema.json", + "./run": "./schemas/logicsrc-run.schema.json", + "./event": "./schemas/logicsrc-event.schema.json", + "./plugin": "./schemas/logicsrc-plugin.schema.json" + }, + "files": [ + "schemas" + ], + "scripts": { + "build": "node -e \"console.log('schemas: no build step')\"" + } +} diff --git a/packages/schemas/schemas/logicsrc-agent.schema.json b/packages/schemas/schemas/logicsrc-agent.schema.json new file mode 100644 index 0000000..61a5edd --- /dev/null +++ b/packages/schemas/schemas/logicsrc-agent.schema.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://schemas.logicsrc.com/logicsrc-agent.schema.json", + "title": "LogicSRC Agent", + "type": "object", + "required": ["type", "version", "name", "did", "owner_did", "skills", "permissions_requested"], + "additionalProperties": false, + "properties": { + "type": { "const": "logicsrc.agent" }, + "version": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$" }, + "name": { "type": "string", "minLength": 1, "maxLength": 120 }, + "did": { "$ref": "#/$defs/did" }, + "owner_did": { "$ref": "#/$defs/did" }, + "description": { "type": "string" }, + "skills": { + "type": "array", + "minItems": 1, + "items": { "type": "string", "minLength": 1 }, + "uniqueItems": true + }, + "supported_task_types": { + "type": "array", + "items": { "type": "string", "minLength": 1 }, + "uniqueItems": true + }, + "pricing": { + "type": "object", + "additionalProperties": false, + "properties": { + "model": { "type": "string", "enum": ["free", "per_task", "hourly", "subscription"] }, + "amount": { "type": "number", "minimum": 0 }, + "currency": { "type": "string", "minLength": 2, "maxLength": 12 } + } + }, + "permissions_requested": { + "type": "array", + "items": { "type": "string", "pattern": "^[a-z][a-z0-9._-]*(:[a-z][a-z0-9._-]*)?$" }, + "uniqueItems": true + }, + "webhook_url": { "type": "string", "format": "uri" }, + "polling_mode": { "type": "boolean" }, + "public": { "type": "boolean", "default": true }, + "logicsrc_compatibility_version": { "type": "string" } + }, + "$defs": { + "did": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]*\\.[a-z0-9][a-z0-9._-]*$" + } + } +} diff --git a/packages/schemas/schemas/logicsrc-event.schema.json b/packages/schemas/schemas/logicsrc-event.schema.json new file mode 100644 index 0000000..de8fa16 --- /dev/null +++ b/packages/schemas/schemas/logicsrc-event.schema.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://schemas.logicsrc.com/logicsrc-event.schema.json", + "title": "LogicSRC Event", + "type": "object", + "required": ["type", "version", "event", "id", "created_at", "actor_did", "resource_type", "resource_id", "data"], + "additionalProperties": false, + "properties": { + "type": { "const": "logicsrc.event" }, + "version": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$" }, + "event": { + "type": "string", + "pattern": "^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$" + }, + "id": { "type": "string", "minLength": 1 }, + "created_at": { "type": "string", "format": "date-time" }, + "actor_did": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]*\\.[a-z0-9][a-z0-9._-]*$" + }, + "resource_type": { "type": "string", "minLength": 1 }, + "resource_id": { "type": "string", "minLength": 1 }, + "data": { "type": "object" } + } +} diff --git a/packages/schemas/schemas/logicsrc-plugin.schema.json b/packages/schemas/schemas/logicsrc-plugin.schema.json new file mode 100644 index 0000000..d04f957 --- /dev/null +++ b/packages/schemas/schemas/logicsrc-plugin.schema.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://schemas.logicsrc.com/logicsrc-plugin.schema.json", + "title": "LogicSRC Plugin Manifest", + "type": "object", + "required": ["id", "name", "version", "type", "default", "capabilities", "commands", "env"], + "additionalProperties": false, + "properties": { + "id": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" }, + "name": { "type": "string", "minLength": 1 }, + "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$" }, + "type": { + "type": "array", + "minItems": 1, + "items": { "type": "string", "minLength": 1 }, + "uniqueItems": true + }, + "default": { "type": "boolean" }, + "capabilities": { + "type": "array", + "items": { "type": "string", "pattern": "^[a-z][a-z0-9_-]*(\\.[a-z][a-z0-9_-]*)+$" }, + "uniqueItems": true + }, + "commands": { + "type": "array", + "items": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" }, + "uniqueItems": true + }, + "env": { + "type": "array", + "items": { "type": "string", "pattern": "^[A-Z][A-Z0-9_]*$" }, + "uniqueItems": true + } + } +} diff --git a/packages/schemas/schemas/logicsrc-run.schema.json b/packages/schemas/schemas/logicsrc-run.schema.json new file mode 100644 index 0000000..da30a44 --- /dev/null +++ b/packages/schemas/schemas/logicsrc-run.schema.json @@ -0,0 +1,69 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://schemas.logicsrc.com/logicsrc-run.schema.json", + "title": "LogicSRC Agent Run", + "type": "object", + "required": ["type", "version", "run_id", "task_id", "agent_did", "status", "started_at"], + "additionalProperties": false, + "properties": { + "type": { "const": "logicsrc.agent_run" }, + "version": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$" }, + "run_id": { "type": "string", "minLength": 1 }, + "task_id": { "type": "string", "minLength": 1 }, + "agent_did": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]*\\.[a-z0-9][a-z0-9._-]*$" + }, + "status": { + "type": "string", + "enum": ["created", "authorized", "started", "running", "submitted", "completed", "failed", "cancelled", "disputed"] + }, + "started_at": { "type": "string", "format": "date-time" }, + "completed_at": { "type": "string", "format": "date-time" }, + "logs": { + "type": "array", + "items": { + "type": "object", + "required": ["timestamp", "action", "status"], + "additionalProperties": false, + "properties": { + "timestamp": { "type": "string", "format": "date-time" }, + "action": { "type": "string" }, + "status": { "type": "string" }, + "resource": { "type": "string" }, + "message": { "type": "string" } + } + } + }, + "files_accessed": { + "type": "array", + "items": { "type": "string" } + }, + "tools_used": { + "type": "array", + "items": { "type": "string" } + }, + "deliverables": { + "type": "array", + "items": { + "type": "object", + "required": ["type", "url"], + "additionalProperties": false, + "properties": { + "type": { "type": "string" }, + "url": { "type": "string", "format": "uri" } + } + } + }, + "cost": { + "type": "object", + "required": ["amount", "currency"], + "additionalProperties": false, + "properties": { + "amount": { "type": "number", "minimum": 0 }, + "currency": { "type": "string", "minLength": 2, "maxLength": 12 } + } + }, + "payment_status": { "type": "string" } + } +} diff --git a/packages/schemas/schemas/logicsrc-task.schema.json b/packages/schemas/schemas/logicsrc-task.schema.json new file mode 100644 index 0000000..ac6a443 --- /dev/null +++ b/packages/schemas/schemas/logicsrc-task.schema.json @@ -0,0 +1,114 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://schemas.logicsrc.com/logicsrc-task.schema.json", + "title": "LogicSRC Task", + "type": "object", + "required": ["type", "version", "title", "description", "board", "creator_did", "status"], + "additionalProperties": false, + "properties": { + "type": { "const": "logicsrc.task" }, + "version": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$" }, + "title": { "type": "string", "minLength": 1, "maxLength": 160 }, + "description": { "type": "string", "minLength": 1 }, + "board": { "type": "string", "pattern": "^/[a-z0-9][a-z0-9/_-]*$" }, + "creator_did": { "$ref": "#/$defs/did" }, + "status": { + "type": "string", + "enum": [ + "draft", + "open", + "funded", + "claimed", + "in_progress", + "submitted", + "approved", + "paid", + "rejected", + "disputed", + "cancelled", + "expired", + "refunded" + ] + }, + "budget": { "$ref": "#/$defs/money" }, + "currency": { "type": "string", "minLength": 2, "maxLength": 12 }, + "deadline": { "type": "string", "format": "date-time" }, + "skills": { + "type": "array", + "items": { "type": "string", "minLength": 1 }, + "uniqueItems": true + }, + "acceptance_criteria": { + "type": "array", + "items": { "type": "string", "minLength": 1 } + }, + "attachments": { + "type": "array", + "items": { "$ref": "#/$defs/attachment" } + }, + "external_links": { + "type": "array", + "items": { "type": "string", "format": "uri" } + }, + "github_repo": { "type": "string" }, + "github_issue": { "type": "string" }, + "target_url": { "type": "string", "format": "uri" }, + "permissions": { + "type": "object", + "additionalProperties": { "type": "boolean" } + }, + "assignee_did": { "$ref": "#/$defs/did" }, + "agent_allowed": { "type": "boolean", "default": true }, + "human_allowed": { "type": "boolean", "default": true }, + "escrow_required": { "type": "boolean", "default": false }, + "payment": { + "type": "object", + "additionalProperties": false, + "properties": { + "provider": { "type": "string" }, + "escrow_id": { "type": "string" }, + "status": { + "type": "string", + "enum": [ + "unfunded", + "funding_pending", + "funded", + "release_pending", + "released", + "refunded", + "disputed", + "cancelled", + "failed" + ] + } + } + }, + "logicsrc_version": { "type": "string" } + }, + "$defs": { + "did": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]*\\.[a-z0-9][a-z0-9._-]*$" + }, + "money": { + "type": "object", + "required": ["amount", "currency"], + "additionalProperties": false, + "properties": { + "amount": { "type": "number", "exclusiveMinimum": 0 }, + "currency": { "type": "string", "minLength": 2, "maxLength": 12 } + } + }, + "attachment": { + "type": "object", + "required": ["type", "url"], + "additionalProperties": false, + "properties": { + "type": { "type": "string" }, + "name": { "type": "string" }, + "url": { "type": "string", "format": "uri" }, + "sha256": { "type": "string" } + } + } + } +} diff --git a/packages/tui/package.json b/packages/tui/package.json new file mode 100644 index 0000000..7b7b11d --- /dev/null +++ b/packages/tui/package.json @@ -0,0 +1,17 @@ +{ + "name": "@logicsrc/tui", + "version": "0.1.0", + "description": "CommandBoard.run terminal UI.", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "tsc -p tsconfig.json" + }, + "dependencies": { + "@logicsrc/plugin-core": "file:../plugin-core", + "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", + "@logicsrc/plugin-sh1pt": "file:../../plugins/sh1pt", + "@logicsrc/plugin-ugig": "file:../../plugins/ugig" + } +} diff --git a/packages/tui/src/index.ts b/packages/tui/src/index.ts new file mode 100644 index 0000000..80f705d --- /dev/null +++ b/packages/tui/src/index.ts @@ -0,0 +1,52 @@ +import { createPluginRegistry } from "@logicsrc/plugin-core"; +import { coinPayPlugin } from "@logicsrc/plugin-coinpay"; +import { sh1ptPlugin } from "@logicsrc/plugin-sh1pt"; +import { uGigPlugin } from "@logicsrc/plugin-ugig"; + +export interface TuiState { + did: string; + board: string; + reputation: number; + balance: string; +} + +const defaultState: TuiState = { + did: "anthony.coinpay", + board: "/gigs", + reputation: 98, + balance: "$42" +}; + +export function renderTui(state: Partial<TuiState> = {}) { + const view = { ...defaultState, ...state }; + const registry = createPluginRegistry([coinPayPlugin, uGigPlugin, sh1ptPlugin]); + const plugins = registry.snapshot().plugins; + + return [ + "┌─ CommandBoard.run ──────────────────────────────────────────┐", + `│ DID: ${pad(view.did, 17)} Board: ${pad(view.board, 7)} Rep: ${String(view.reputation).padEnd(3)} Balance: ${pad(view.balance, 6)} │`, + "├───────────────┬─────────────────────────────────────────────┤", + "│ Boards │ Feed │", + "│ > /gigs │ [TASK] QA checkout flow - 25 USDC │", + "│ /agents │ [POST] New agent plugin idea │", + "│ /qa │ [RUN] qa-agent completed task_123 │", + "│ /jobs │ [uGig] Senior AI Engineer remote │", + "│ /projects │ [sh1pt] Release action published │", + "├───────────────┴─────────────────────────────────────────────┤", + "│ Plugins: " + plugins.map((plugin) => `${plugin.name} ${plugin.enabled ? "enabled" : "disabled"}`).join(" | ").padEnd(50) + " │", + "│ Enter: open p: post t: task a: agents w: wallet q: quit │", + "└─────────────────────────────────────────────────────────────┘" + ].join("\n"); +} + +export function renderPluginStatus() { + const registry = createPluginRegistry([coinPayPlugin, uGigPlugin, sh1ptPlugin]); + return registry + .snapshot() + .plugins.map((plugin) => `${plugin.id.padEnd(8)} ${plugin.enabled ? "enabled" : "disabled"} ${plugin.type.join(", ")}`) + .join("\n"); +} + +function pad(value: string, width: number) { + return value.length >= width ? value.slice(0, width) : value.padEnd(width); +} diff --git a/packages/tui/tsconfig.json b/packages/tui/tsconfig.json new file mode 100644 index 0000000..df59da5 --- /dev/null +++ b/packages/tui/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/validators/package.json b/packages/validators/package.json new file mode 100644 index 0000000..a8ff0ea --- /dev/null +++ b/packages/validators/package.json @@ -0,0 +1,24 @@ +{ + "name": "@logicsrc/validators", + "version": "0.1.0", + "description": "LogicSRC schema validation helpers.", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "bin": { + "logicsrc-validate": "./dist/cli.js" + }, + "scripts": { + "build": "tsc -p tsconfig.json", + "test": "vitest run src", + "validate:fixtures": "node dist/cli.js task ../schemas/fixtures/task.yaml && node dist/cli.js agent ../schemas/fixtures/agent.yaml" + }, + "dependencies": { + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "yaml": "^2.8.1" + }, + "devDependencies": { + "vitest": "^4.0.8" + } +} diff --git a/packages/validators/src/cli.ts b/packages/validators/src/cli.ts new file mode 100644 index 0000000..786133b --- /dev/null +++ b/packages/validators/src/cli.ts @@ -0,0 +1,33 @@ +#!/usr/bin/env node +import { readFileSync } from "node:fs"; +import { resolve } from "node:path"; +import { assertSchemaKind, parseDocument, validate } from "./index.js"; + +function main(argv: string[]) { + const [, , kindArg, fileArg] = argv; + + if (!kindArg || !fileArg) { + console.error("Usage: logicsrc-validate <task|agent|run|event|plugin> <file.yaml|file.json>"); + process.exitCode = 2; + return; + } + + const kind = assertSchemaKind(kindArg); + const filePath = resolve(process.cwd(), fileArg); + const input = readFileSync(filePath, "utf8"); + const data = parseDocument(input, filePath); + const result = validate(kind, data); + + if (!result.ok) { + console.error(`Invalid LogicSRC ${kind} document: ${filePath}`); + for (const error of result.errors) { + console.error(`- ${error.instancePath || "/"} ${error.message ?? "failed validation"}`); + } + process.exitCode = 1; + return; + } + + console.log(`Valid LogicSRC ${kind} document: ${filePath}`); +} + +main(process.argv); diff --git a/packages/validators/src/index.test.ts b/packages/validators/src/index.test.ts new file mode 100644 index 0000000..76304b4 --- /dev/null +++ b/packages/validators/src/index.test.ts @@ -0,0 +1,28 @@ +import { readFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { describe, expect, it } from "vitest"; +import { parseDocument, validate } from "./index.js"; + +describe("LogicSRC validators", () => { + it("validates the task fixture", () => { + const testDir = dirname(fileURLToPath(import.meta.url)); + const file = resolve(testDir, "../../schemas/fixtures/task.yaml"); + const data = parseDocument(readFileSync(file, "utf8"), file); + + expect(validate("task", data).ok).toBe(true); + }); + + it("rejects a task without a DID", () => { + const result = validate("task", { + type: "logicsrc.task", + version: "0.1", + title: "Missing DID", + description: "This should fail.", + board: "/qa", + status: "open" + }); + + expect(result.ok).toBe(false); + }); +}); diff --git a/packages/validators/src/index.ts b/packages/validators/src/index.ts new file mode 100644 index 0000000..6ea71b2 --- /dev/null +++ b/packages/validators/src/index.ts @@ -0,0 +1,52 @@ +import * as Ajv2020Module from "ajv/dist/2020.js"; +import * as addFormatsModule from "ajv-formats"; +import type { ErrorObject } from "ajv"; +import { parse } from "yaml"; +import { isSchemaKind, schemas, type SchemaKind } from "./schemas.js"; + +const Ajv2020 = (Ajv2020Module as unknown as { default: new (options: Record<string, unknown>) => { compile: (schema: unknown) => { (data: unknown): boolean; errors?: ErrorObject[] | null } } }).default; +const addFormats = (addFormatsModule as unknown as { default: (ajv: InstanceType<typeof Ajv2020>) => void }).default; + +export type ValidationResult = + | { ok: true; kind: SchemaKind; data: unknown } + | { ok: false; kind: SchemaKind; errors: ErrorObject[] }; + +export function createValidator() { + const ajv = new Ajv2020({ allErrors: true, strict: true }); + addFormats(ajv); + return ajv; +} + +export function parseDocument(input: string, fileName = "document") { + if (fileName.endsWith(".json")) { + return JSON.parse(input) as unknown; + } + + return parse(input) as unknown; +} + +export function validate(kind: SchemaKind, data: unknown): ValidationResult { + const ajv = createValidator(); + const validateDocument = ajv.compile(schemas[kind]); + const ok = validateDocument(data); + + if (ok) { + return { ok: true, kind, data }; + } + + return { + ok: false, + kind, + errors: validateDocument.errors ?? [] + }; +} + +export function assertSchemaKind(value: string): SchemaKind { + if (!isSchemaKind(value)) { + throw new Error(`Unknown schema kind "${value}". Expected one of: ${Object.keys(schemas).join(", ")}`); + } + + return value; +} + +export { schemas, type SchemaKind }; diff --git a/packages/validators/src/schemas.ts b/packages/validators/src/schemas.ts new file mode 100644 index 0000000..f016936 --- /dev/null +++ b/packages/validators/src/schemas.ts @@ -0,0 +1,19 @@ +import agentSchema from "../../schemas/schemas/logicsrc-agent.schema.json" with { type: "json" }; +import eventSchema from "../../schemas/schemas/logicsrc-event.schema.json" with { type: "json" }; +import pluginSchema from "../../schemas/schemas/logicsrc-plugin.schema.json" with { type: "json" }; +import runSchema from "../../schemas/schemas/logicsrc-run.schema.json" with { type: "json" }; +import taskSchema from "../../schemas/schemas/logicsrc-task.schema.json" with { type: "json" }; + +export const schemas = { + agent: agentSchema, + event: eventSchema, + plugin: pluginSchema, + run: runSchema, + task: taskSchema +} as const; + +export type SchemaKind = keyof typeof schemas; + +export function isSchemaKind(value: string): value is SchemaKind { + return value in schemas; +} diff --git a/packages/validators/tsconfig.json b/packages/validators/tsconfig.json new file mode 100644 index 0000000..df59da5 --- /dev/null +++ b/packages/validators/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"] +} diff --git a/plugins/coinpay/README.md b/plugins/coinpay/README.md new file mode 100644 index 0000000..c57e222 --- /dev/null +++ b/plugins/coinpay/README.md @@ -0,0 +1,11 @@ +# CoinPay Plugin + +CoinPay is the default CommandBoard.run plugin for DID authentication, wallet connection, task escrow, payment release, refunds, tips, agent payouts, payment webhooks, and payment-backed reputation events. + +Required environment: + +```txt +COINPAY_API_URL +COINPAY_API_KEY +COINPAY_WEBHOOK_SECRET +``` diff --git a/plugins/coinpay/package.json b/plugins/coinpay/package.json new file mode 100644 index 0000000..87511fb --- /dev/null +++ b/plugins/coinpay/package.json @@ -0,0 +1,18 @@ +{ + "name": "@logicsrc/plugin-coinpay", + "version": "0.1.0", + "description": "Default CommandBoard.run DID, wallet, payment, and escrow plugin.", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "test": "vitest run src --passWithNoTests" + }, + "dependencies": { + "@logicsrc/plugin-core": "file:../../packages/plugin-core" + }, + "devDependencies": { + "vitest": "^4.0.8" + } +} diff --git a/plugins/coinpay/src/index.ts b/plugins/coinpay/src/index.ts new file mode 100644 index 0000000..26810e8 --- /dev/null +++ b/plugins/coinpay/src/index.ts @@ -0,0 +1,33 @@ +import type { PluginDefinition } from "@logicsrc/plugin-core"; +import { coinPayManifest } from "./manifest.js"; + +export const coinPayPlugin: PluginDefinition = { + manifest: coinPayManifest, + configDefaults: { + enabled: true, + default_payment_provider: true, + default_identity_provider: true, + api_url: "${COINPAY_API_URL}", + api_key: "${COINPAY_API_KEY}", + webhook_secret: "${COINPAY_WEBHOOK_SECRET}" + }, + routes: [ + { method: "POST", path: "/api/plugins/coinpay/did/auth", capability: "did.auth" }, + { method: "POST", path: "/api/plugins/coinpay/escrows", capability: "escrow.create" }, + { method: "POST", path: "/api/plugins/coinpay/webhooks/payment-status", capability: "webhook.payment_status" } + ], + events: [ + { event: "task.approved", capability: "escrow.release" }, + { event: "payment.released", capability: "reputation.payment_event" } + ], + permissions: [ + "payments:read", + "payments:request", + "payments:release", + "escrows:create", + "escrows:refund" + ], + tuiPanels: [{ id: "coinpay-status", title: "CoinPay" }] +}; + +export { coinPayManifest }; diff --git a/plugins/coinpay/src/manifest.ts b/plugins/coinpay/src/manifest.ts new file mode 100644 index 0000000..deb295a --- /dev/null +++ b/plugins/coinpay/src/manifest.ts @@ -0,0 +1,23 @@ +import type { PluginManifest } from "@logicsrc/plugin-core"; + +export const coinPayManifest: PluginManifest = { + id: "coinpay", + name: "CoinPay", + version: "1.0.0", + type: ["payment", "identity", "escrow"], + default: true, + capabilities: [ + "did.auth", + "wallet.connect", + "payment.request", + "payment.send", + "escrow.create", + "escrow.fund", + "escrow.release", + "escrow.refund", + "webhook.payment_status", + "reputation.payment_event" + ], + commands: ["wallet", "escrow", "pay", "tip"], + env: ["COINPAY_API_URL", "COINPAY_API_KEY", "COINPAY_WEBHOOK_SECRET"] +}; diff --git a/plugins/coinpay/tsconfig.json b/plugins/coinpay/tsconfig.json new file mode 100644 index 0000000..df59da5 --- /dev/null +++ b/plugins/coinpay/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"] +} diff --git a/plugins/sh1pt/README.md b/plugins/sh1pt/README.md new file mode 100644 index 0000000..d7d533c --- /dev/null +++ b/plugins/sh1pt/README.md @@ -0,0 +1,11 @@ +# sh1pt Plugin + +sh1pt is the CommandBoard.run plugin for project delivery workflows: project sync, action import/publish, release tracking, deployment status, artifact sync, and delivery-backed reputation events. + +Required environment: + +```txt +SH1PT_API_URL +SH1PT_API_KEY +SH1PT_WEBHOOK_SECRET +``` diff --git a/plugins/sh1pt/package.json b/plugins/sh1pt/package.json new file mode 100644 index 0000000..0441ea0 --- /dev/null +++ b/plugins/sh1pt/package.json @@ -0,0 +1,18 @@ +{ + "name": "@logicsrc/plugin-sh1pt", + "version": "0.1.0", + "description": "CommandBoard.run projects, actions, releases, and delivery plugin for sh1pt.", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "test": "vitest run src --passWithNoTests" + }, + "dependencies": { + "@logicsrc/plugin-core": "file:../../packages/plugin-core" + }, + "devDependencies": { + "vitest": "^4.0.8" + } +} diff --git a/plugins/sh1pt/src/index.ts b/plugins/sh1pt/src/index.ts new file mode 100644 index 0000000..acb46d2 --- /dev/null +++ b/plugins/sh1pt/src/index.ts @@ -0,0 +1,40 @@ +import type { PluginDefinition } from "@logicsrc/plugin-core"; +import { sh1ptManifest } from "./manifest.js"; + +export const sh1ptPlugin: PluginDefinition = { + manifest: sh1ptManifest, + configDefaults: { + enabled: true, + default_project_provider: true, + api_url: "${SH1PT_API_URL}", + api_key: "${SH1PT_API_KEY}", + webhook_secret: "${SH1PT_WEBHOOK_SECRET}", + default_board: "/projects/sh1pt" + }, + routes: [ + { method: "GET", path: "/api/plugins/sh1pt/projects", capability: "projects.sync" }, + { method: "GET", path: "/api/plugins/sh1pt/actions", capability: "actions.import" }, + { method: "POST", path: "/api/plugins/sh1pt/actions/publish", capability: "actions.publish" }, + { method: "POST", path: "/api/plugins/sh1pt/deployments", capability: "deployments.create" }, + { method: "POST", path: "/api/plugins/sh1pt/webhooks/delivery-status", capability: "webhook.delivery_status" } + ], + events: [ + { event: "task.created", capability: "tasks.create_from_action" }, + { event: "task.approved", capability: "reputation.delivery_event" }, + { event: "artifact.created", capability: "artifacts.sync" }, + { event: "deployment.completed", capability: "releases.sync" } + ], + permissions: [ + "projects:read", + "projects:sync", + "actions:read", + "actions:publish", + "deployments:create", + "deployments:read", + "artifacts:sync", + "reputation:sync" + ], + tuiPanels: [{ id: "sh1pt-status", title: "sh1pt Projects" }] +}; + +export { sh1ptManifest }; diff --git a/plugins/sh1pt/src/manifest.ts b/plugins/sh1pt/src/manifest.ts new file mode 100644 index 0000000..8c5fdc9 --- /dev/null +++ b/plugins/sh1pt/src/manifest.ts @@ -0,0 +1,23 @@ +import type { PluginManifest } from "@logicsrc/plugin-core"; + +export const sh1ptManifest: PluginManifest = { + id: "sh1pt", + name: "sh1pt", + version: "1.0.0", + type: ["projects", "actions", "releases", "delivery"], + default: true, + capabilities: [ + "projects.sync", + "actions.import", + "actions.publish", + "tasks.create_from_action", + "releases.sync", + "deployments.create", + "deployments.status", + "artifacts.sync", + "webhook.delivery_status", + "reputation.delivery_event" + ], + commands: ["sh1pt", "projects", "actions", "deploy", "releases"], + env: ["SH1PT_API_URL", "SH1PT_API_KEY", "SH1PT_WEBHOOK_SECRET"] +}; diff --git a/plugins/sh1pt/tsconfig.json b/plugins/sh1pt/tsconfig.json new file mode 100644 index 0000000..df59da5 --- /dev/null +++ b/plugins/sh1pt/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"] +} diff --git a/plugins/ugig/README.md b/plugins/ugig/README.md new file mode 100644 index 0000000..a759c82 --- /dev/null +++ b/plugins/ugig/README.md @@ -0,0 +1,11 @@ +# uGig Plugin + +uGig is the default CommandBoard.run plugin for jobs, gigs, candidates, agents, marketplace publishing, bid sync, and reputation sync. + +Required environment: + +```txt +UGIG_API_URL +UGIG_API_KEY +UGIG_WEBHOOK_SECRET +``` diff --git a/plugins/ugig/package.json b/plugins/ugig/package.json new file mode 100644 index 0000000..2692043 --- /dev/null +++ b/plugins/ugig/package.json @@ -0,0 +1,18 @@ +{ + "name": "@logicsrc/plugin-ugig", + "version": "0.1.0", + "description": "Default CommandBoard.run jobs, gigs, talent, and marketplace plugin.", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "test": "vitest run src --passWithNoTests" + }, + "dependencies": { + "@logicsrc/plugin-core": "file:../../packages/plugin-core" + }, + "devDependencies": { + "vitest": "^4.0.8" + } +} diff --git a/plugins/ugig/src/index.ts b/plugins/ugig/src/index.ts new file mode 100644 index 0000000..3ec8446 --- /dev/null +++ b/plugins/ugig/src/index.ts @@ -0,0 +1,27 @@ +import type { PluginDefinition } from "@logicsrc/plugin-core"; +import { uGigManifest } from "./manifest.js"; + +export const uGigPlugin: PluginDefinition = { + manifest: uGigManifest, + configDefaults: { + enabled: true, + default_jobs_provider: true, + api_url: "${UGIG_API_URL}", + api_key: "${UGIG_API_KEY}", + webhook_secret: "${UGIG_WEBHOOK_SECRET}", + default_board: "/gigs" + }, + routes: [ + { method: "GET", path: "/api/plugins/ugig/jobs", capability: "jobs.import" }, + { method: "POST", path: "/api/plugins/ugig/gigs", capability: "jobs.publish" }, + { method: "POST", path: "/api/plugins/ugig/webhooks/gigs-sync", capability: "gigs.sync" } + ], + events: [ + { event: "task.created", capability: "tasks.publish_to_marketplace" }, + { event: "task.approved", capability: "reputation.sync" } + ], + permissions: ["jobs:read", "jobs:publish", "gigs:sync", "reputation:sync"], + tuiPanels: [{ id: "ugig-status", title: "uGig Jobs" }] +}; + +export { uGigManifest }; diff --git a/plugins/ugig/src/manifest.ts b/plugins/ugig/src/manifest.ts new file mode 100644 index 0000000..8d5cec7 --- /dev/null +++ b/plugins/ugig/src/manifest.ts @@ -0,0 +1,21 @@ +import type { PluginManifest } from "@logicsrc/plugin-core"; + +export const uGigManifest: PluginManifest = { + id: "ugig", + name: "uGig", + version: "1.0.0", + type: ["jobs", "gigs", "marketplace"], + default: true, + capabilities: [ + "jobs.import", + "jobs.publish", + "gigs.sync", + "candidates.link", + "agents.link", + "tasks.publish_to_marketplace", + "bids.sync", + "reputation.sync" + ], + commands: ["jobs", "gigs", "publish"], + env: ["UGIG_API_URL", "UGIG_API_KEY", "UGIG_WEBHOOK_SECRET"] +}; diff --git a/plugins/ugig/tsconfig.json b/plugins/ugig/tsconfig.json new file mode 100644 index 0000000..df59da5 --- /dev/null +++ b/plugins/ugig/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"] +} diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100755 index 0000000..046a8e5 --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env sh +set -eu + +VERSION="latest" +INSTALL_DIR="${HOME}/.commandboard/bin" +INSTALL_ALIAS=1 + +while [ "$#" -gt 0 ]; do + case "$1" in + --version) + VERSION="$2" + shift 2 + ;; + --install-dir) + INSTALL_DIR="$2" + shift 2 + ;; + --no-alias) + INSTALL_ALIAS=0 + shift + ;; + *) + echo "Unknown option: $1" >&2 + exit 2 + ;; + esac +done + +OS="$(uname -s | tr '[:upper:]' '[:lower:]')" +ARCH="$(uname -m)" +case "$ARCH" in + x86_64) ARCH="x64" ;; + aarch64|arm64) ARCH="arm64" ;; +esac + +echo "Installing CommandBoard.run CLI..." +echo "Detected: ${OS} ${ARCH}" +echo "Installing to: ${INSTALL_DIR}" + +mkdir -p "$INSTALL_DIR" + +cat > "${INSTALL_DIR}/commandboard" <<'BIN' +#!/usr/bin/env sh +echo "CommandBoard.run CLI bootstrap" +echo "Install from a release artifact when v1.0.0 binaries are published." +echo "For local development run: npm --workspace @logicsrc/cli run dev -- \"$@\"" +BIN + +chmod +x "${INSTALL_DIR}/commandboard" + +if [ "$INSTALL_ALIAS" -eq 1 ]; then + ln -sf "${INSTALL_DIR}/commandboard" "${INSTALL_DIR}/cb" + echo "Installed alias: cb" +fi + +echo "Installed: commandboard (${VERSION})" +echo "Add this to your shell profile if needed:" +echo "export PATH=\"\$HOME/.commandboard/bin:\$PATH\"" +echo "Run: commandboard login" +echo "Run: commandboard tui" diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..32b53ab --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM"], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "declaration": true, + "sourceMap": true, + "outDir": "dist" + } +}