From 32c0ace508331d033d146decdbf6b7012cfa1505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Menezes?= Date: Sun, 28 Jun 2026 20:16:03 -0300 Subject: [PATCH 01/86] feat: add thunderbolt CLI, a Pi-harness coding agent with acp/mcp bridges --- cli/.gitignore | 3 + cli/README.md | 67 ++++++++ cli/bun.lock | 299 +++++++++++++++++++++++++++++++++ cli/bunfig.toml | 7 + cli/install.sh | 30 ++++ cli/package.json | 31 ++++ cli/src/agent/harness.ts | 55 ++++++ cli/src/agent/model.ts | 36 ++++ cli/src/agent/permissions.ts | 56 ++++++ cli/src/agent/run.ts | 67 ++++++++ cli/src/agent/system-prompt.ts | 47 ++++++ cli/src/agent/types.ts | 104 ++++++++++++ cli/src/banner.ts | 31 ++++ cli/src/cli.ts | 224 ++++++++++++++++++++++++ cli/src/commands/bridge.ts | 152 +++++++++++++++++ cli/src/index.ts | 45 +++++ cli/src/ui/prompt.ts | 48 ++++++ cli/src/ui/render.ts | 129 ++++++++++++++ cli/src/ui/theme.ts | 46 +++++ cli/tsconfig.json | 12 ++ 20 files changed, 1489 insertions(+) create mode 100644 cli/.gitignore create mode 100644 cli/README.md create mode 100644 cli/bun.lock create mode 100644 cli/bunfig.toml create mode 100755 cli/install.sh create mode 100644 cli/package.json create mode 100644 cli/src/agent/harness.ts create mode 100644 cli/src/agent/model.ts create mode 100644 cli/src/agent/permissions.ts create mode 100644 cli/src/agent/run.ts create mode 100644 cli/src/agent/system-prompt.ts create mode 100644 cli/src/agent/types.ts create mode 100644 cli/src/banner.ts create mode 100644 cli/src/cli.ts create mode 100644 cli/src/commands/bridge.ts create mode 100644 cli/src/index.ts create mode 100644 cli/src/ui/prompt.ts create mode 100644 cli/src/ui/render.ts create mode 100644 cli/src/ui/theme.ts create mode 100644 cli/tsconfig.json diff --git a/cli/.gitignore b/cli/.gitignore new file mode 100644 index 000000000..f4e2c6d6b --- /dev/null +++ b/cli/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +dist/ +*.tsbuildinfo diff --git a/cli/README.md b/cli/README.md new file mode 100644 index 000000000..a692b1155 --- /dev/null +++ b/cli/README.md @@ -0,0 +1,67 @@ +# ⚡ thunderbolt + +A single-binary terminal coding agent. It operates directly in your working +directory with four tools — **bash**, **read**, **write**, **edit** — built on +the [Pi harness](https://www.npmjs.com/package/@earendil-works/pi-agent-core) +and talking to Claude. Give it a task as one prompt or drop into an interactive +REPL; there's no daemon, no config file, and nothing to install but the binary. + +## Install + +**From source** (requires [Bun](https://bun.sh)): + +```sh +cd cli +bun install +bun run build # compiles dist/thunderbolt +./install.sh # copies it to ~/.local/bin +``` + +**One-liner** (placeholder — same self-contained binary, no Bun required): + +```sh +curl -fsSL https://thunderbolt.dev/install.sh | sh +``` + +## Usage + +Run a single task and exit: + +```sh +thunderbolt "fix the failing test in utils.ts" +``` + +Start an interactive session (type a task, or `exit` to quit): + +```sh +thunderbolt +``` + +### Flags + +| Flag | Description | +| --------------------- | ----------------------------------------------------------------- | +| `-m`, `--model ` | Anthropic model id (default: `claude-opus-4-8`) | +| `--thinking ` | Reasoning depth: `off`, `minimal`, `low`, `medium`, `high`, `xhigh` (default: `medium`) | +| `-y`, `--yolo` | Auto-approve every tool call (alias: `--dangerously-skip-permissions`) | +| `-h`, `--help` | Show help and exit | +| `-v`, `--version` | Print the version and exit | + +Requires **`ANTHROPIC_API_KEY`** in your environment +(https://console.anthropic.com). + +## How it maps to the proposal + +Part 1 — the Pi harness is the engine that runs the agent loop and the four +tools. Part 3 — `thunderbolt agent` is the default (and only) subcommand, so +plain `thunderbolt` *is* the agent. + +## Demo + +```sh +export ANTHROPIC_API_KEY=sk-ant-... + +thunderbolt "summarize what this repo does in three bullets" +thunderbolt --thinking high "find and fix the off-by-one bug in src/range.ts" +thunderbolt --yolo "run the test suite and fix whatever breaks" +``` diff --git a/cli/bun.lock b/cli/bun.lock new file mode 100644 index 000000000..6f506ebff --- /dev/null +++ b/cli/bun.lock @@ -0,0 +1,299 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "@thunderbolt/cli", + "dependencies": { + "@earendil-works/pi-agent-core": "0.80.2", + "@earendil-works/pi-ai": "0.80.2", + "@earendil-works/pi-coding-agent": "0.80.2", + }, + "devDependencies": { + "@types/bun": "^1.2.20", + "typescript": "^6.0.3", + }, + }, + }, + "packages": { + "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.91.1", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw=="], + + "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], + + "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="], + + "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="], + + "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="], + + "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], + + "@aws-sdk/client-bedrock-runtime": ["@aws-sdk/client-bedrock-runtime@3.1048.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.11", "@aws-sdk/credential-provider-node": "^3.972.42", "@aws-sdk/eventstream-handler-node": "^3.972.16", "@aws-sdk/middleware-eventstream": "^3.972.12", "@aws-sdk/middleware-websocket": "^3.972.19", "@aws-sdk/token-providers": "3.1048.0", "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/fetch-http-handler": "^5.4.2", "@smithy/node-http-handler": "^4.7.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ=="], + + "@aws-sdk/core": ["@aws-sdk/core@3.974.23", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@aws-sdk/xml-builder": "^3.972.31", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.6", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-MiWR/uWjxjFXGzrE0Ghc5lWxUxzHsUWFhV+OX7M4cR9SrmrnZs6TXavnCWnzzdwJeFri34xQo81rvGNzK3c4BQ=="], + + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.49", "", { "dependencies": { "@aws-sdk/core": "^3.974.23", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-liB3yQNHCM9k/gu/w36XHMKPluT7HTlnGUhRbBGSISDQkcr/Sy1zsZabiuvQj8WG5yW573u9RehrBvvnIQ9OEQ=="], + + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.51", "", { "dependencies": { "@aws-sdk/core": "^3.974.23", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/node-http-handler": "^4.7.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-XET0H2oofciJ5lMRWNIvRjAP7Q3wv2XT+JtJJEdhPWUMwe3TvQ9qcxonpu7vXmNngncvFpi4E2It+Tamas/naA=="], + + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.972.56", "", { "dependencies": { "@aws-sdk/core": "^3.974.23", "@aws-sdk/credential-provider-env": "^3.972.49", "@aws-sdk/credential-provider-http": "^3.972.51", "@aws-sdk/credential-provider-login": "^3.972.55", "@aws-sdk/credential-provider-process": "^3.972.49", "@aws-sdk/credential-provider-sso": "^3.972.55", "@aws-sdk/credential-provider-web-identity": "^3.972.55", "@aws-sdk/nested-clients": "^3.997.23", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/credential-provider-imds": "^4.3.7", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-IAmc61hbgQiHht9U3x0tnRwz0lzdwOwD/i9voRgdJrKamF+JtmrBOsW9GwB7mfFonNWOWL4qARWYrF8veEMe3w=="], + + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.55", "", { "dependencies": { "@aws-sdk/core": "^3.974.23", "@aws-sdk/nested-clients": "^3.997.23", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-hBBkANo3cDn+h2qxxzER4a+J8JCO9o9Z/YYmU7iky6AcaarX5RRdRcHNC6SLdwY0vAXQygn6soUbDqPn3GghaA=="], + + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.58", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.49", "@aws-sdk/credential-provider-http": "^3.972.51", "@aws-sdk/credential-provider-ini": "^3.972.56", "@aws-sdk/credential-provider-process": "^3.972.49", "@aws-sdk/credential-provider-sso": "^3.972.55", "@aws-sdk/credential-provider-web-identity": "^3.972.55", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/credential-provider-imds": "^4.3.7", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-OyCLVmSI7pZO8hxwNVX6pXhTVlJqRBTp+ijdEfJSUj0RyjHnF602OfAarOzGq6wkGodeFkYBt8MmJ6A6ycRgWw=="], + + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.49", "", { "dependencies": { "@aws-sdk/core": "^3.974.23", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-C8h36lBuC/RnBSsjlO+dn6xZm3KbAl5vpJaVPAfQnMmz2/OISmKOc8XZcqMQgO2ADwBYNRMM6Kf3vz9G/TulMQ=="], + + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.972.55", "", { "dependencies": { "@aws-sdk/core": "^3.974.23", "@aws-sdk/nested-clients": "^3.997.23", "@aws-sdk/token-providers": "3.1074.0", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-1FkOz74Ea5QGS9jtIoXp55T/IkSS3spv+nLTT07fRY/+T5xmEOqaYBVIaEmX4zTNvbV6g2lrtlaVKWEoNyJt3w=="], + + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.55", "", { "dependencies": { "@aws-sdk/core": "^3.974.23", "@aws-sdk/nested-clients": "^3.997.23", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-g2BoECD1q01kTPByi56+VLVvdWDzMkKIcr77qixpqH0okw2t0U5CoPv+6S8v/D1Y2Wa6QKKtn6XAtDzP+Kfpvg=="], + + "@aws-sdk/eventstream-handler-node": ["@aws-sdk/eventstream-handler-node@3.972.22", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-tqPJv0dz4+O0hWGm1a6YekcMZyPhDFs/zH73Von7icaVT5n0Jqvm86typ3jRrG+qoUdPhALOnboRLTmnWQTlYQ=="], + + "@aws-sdk/middleware-eventstream": ["@aws-sdk/middleware-eventstream@3.972.18", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-OHpk8YoZi3yexPq8aFt1vN1IxA2zLKvsIR5GpWYylX/ve6kQmY7wxHNSFy/D3t2apMZ16rs76Co4dJWcDyIk3A=="], + + "@aws-sdk/middleware-websocket": ["@aws-sdk/middleware-websocket@3.972.31", "", { "dependencies": { "@aws-sdk/core": "^3.974.23", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-ps1rumU1LybSFHaW9dTDgkhCMJLVaedEY78kKSzUDDY+b9974/g6aiaYYA0U9WV0oL4CJCJrVWG+EZ/qr4or7g=="], + + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.23", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.23", "@aws-sdk/signature-v4-multi-region": "^3.996.35", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/node-http-handler": "^4.7.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-gO93ZPsI2bxeFZD42f1/qjDw6FAZkNZcKRO94LIiT03fzOmcJ9e/tunxjVjA1Rl69ClmVJzz8H3G9CdKef10PA=="], + + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.35", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg=="], + + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1048.0", "", { "dependencies": { "@aws-sdk/core": "^3.974.11", "@aws-sdk/nested-clients": "^3.997.9", "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA=="], + + "@aws-sdk/types": ["@aws-sdk/types@3.973.13", "", { "dependencies": { "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg=="], + + "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.8", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g=="], + + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.31", "", { "dependencies": { "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-SzE4Pgyl+hDF+BuyuzxUSpwnuUu9lJuO1YGgteG89/4Qv0+2IQiVQqdbPV32IozLvXWQChPQcdkk/sKvb1QHiQ=="], + + "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.4", "", {}, "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ=="], + + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@earendil-works/pi-agent-core": ["@earendil-works/pi-agent-core@0.80.2", "", { "dependencies": { "@earendil-works/pi-ai": "^0.80.2", "ignore": "7.0.5", "typebox": "1.1.38", "yaml": "2.9.0" } }, "sha512-BF9WPhixIFjT6Kp3Iz3H6ugkU+4AWotM8py96XE5pIK0arJbQKMWbR+dXSWWDEmR5yc/aFQODnuyowOEzMGO7Q=="], + + "@earendil-works/pi-ai": ["@earendil-works/pi-ai@0.80.2", "", { "dependencies": { "@anthropic-ai/sdk": "0.91.1", "@aws-sdk/client-bedrock-runtime": "3.1048.0", "@google/genai": "1.52.0", "@mistralai/mistralai": "2.2.6", "@opentelemetry/api": "1.9.0", "@smithy/node-http-handler": "4.7.3", "http-proxy-agent": "7.0.2", "https-proxy-agent": "7.0.6", "openai": "6.26.0", "partial-json": "0.1.7", "typebox": "1.1.38" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-5GNKfdrRJ4uZ5Zd9iudoXggi/BbUcKnD/xfRHtdR+7q4vWqPvfx8auFuaT+ewGBVI8K4wj87eigFQ/iCSuy9RQ=="], + + "@earendil-works/pi-coding-agent": ["@earendil-works/pi-coding-agent@0.80.2", "", { "dependencies": { "@earendil-works/pi-agent-core": "^0.80.2", "@earendil-works/pi-ai": "^0.80.2", "@earendil-works/pi-tui": "^0.80.2", "@silvia-odwyer/photon-node": "0.3.4", "chalk": "5.6.2", "cross-spawn": "7.0.6", "diff": "8.0.4", "glob": "13.0.6", "highlight.js": "10.7.3", "hosted-git-info": "9.0.3", "ignore": "7.0.5", "jiti": "2.7.0", "minimatch": "10.2.5", "proper-lockfile": "4.1.2", "semver": "7.8.0", "typebox": "1.1.38", "undici": "8.5.0", "yaml": "2.9.0" }, "optionalDependencies": { "@mariozechner/clipboard": "0.3.9" }, "bin": { "pi": "dist/cli.js" } }, "sha512-m9v7OUit0s9LklWfh61ca/XY5INjUzjtYtNZwy3cNvyjOLk3IpBgghP8aAp0iH35rLaiRwuuWiJ8t88ODMWY+A=="], + + "@earendil-works/pi-tui": ["@earendil-works/pi-tui@0.80.2", "", { "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.5" } }, "sha512-OvOAMIbXiC9OSse17YMiXIsI9AS5XM/ZV8N/k+UzdlRpPILDQYmLElevgGW92kkXR8qHBClIdzhCjuzlBGvphA=="], + + "@google/genai": ["@google/genai@1.52.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "p-retry": "^4.6.2", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q=="], + + "@mariozechner/clipboard": ["@mariozechner/clipboard@0.3.9", "", { "optionalDependencies": { "@mariozechner/clipboard-darwin-arm64": "0.3.9", "@mariozechner/clipboard-darwin-universal": "0.3.9", "@mariozechner/clipboard-darwin-x64": "0.3.9", "@mariozechner/clipboard-linux-arm64-gnu": "0.3.9", "@mariozechner/clipboard-linux-arm64-musl": "0.3.9", "@mariozechner/clipboard-linux-riscv64-gnu": "0.3.9", "@mariozechner/clipboard-linux-x64-gnu": "0.3.9", "@mariozechner/clipboard-linux-x64-musl": "0.3.9", "@mariozechner/clipboard-win32-arm64-msvc": "0.3.9", "@mariozechner/clipboard-win32-x64-msvc": "0.3.9" } }, "sha512-ABnA53mdfkGZwOFUdZNv2S0CWGO/EIuPj8Vv9xmBFmSYg/qFc7ihO6q5FcQjvoE67kZpWkEc4AhD6B/os04yuA=="], + + "@mariozechner/clipboard-darwin-arm64": ["@mariozechner/clipboard-darwin-arm64@0.3.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BfgV7vCEWZwJwZJw03r6bP5+tf0iI/ANuQYCxi9RNn7FrWB3yzGuMKCrNLRl6V761vXRdL8+OqZ0wd4TqlsNOQ=="], + + "@mariozechner/clipboard-darwin-universal": ["@mariozechner/clipboard-darwin-universal@0.3.9", "", { "os": "darwin" }, "sha512-BGGR4iA9Z2shAjI65eI5xtyb3LYNlDW9X3gxKxDbqtbnREohsrqznov6zpKoIrsRWpzlYVEdKphS7ksJ0/ndSQ=="], + + "@mariozechner/clipboard-darwin-x64": ["@mariozechner/clipboard-darwin-x64@0.3.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-4kURmCbS6nt8uYhtmWpUcJWyPHfmAr5dTpXD1nO3pIfa+TSQ9DbrGOYCKH+aEFW47XhQ4Vp8ZTszie+wfFvDKg=="], + + "@mariozechner/clipboard-linux-arm64-gnu": ["@mariozechner/clipboard-linux-arm64-gnu@0.3.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-g59OkUGP2DDfCOIKypHeYgv2M55u/cKvXa5dSxFbEJ34XvIQMdcVmpKCkGUro3ZgefXiGVdwguvTMQGpHWzIXw=="], + + "@mariozechner/clipboard-linux-arm64-musl": ["@mariozechner/clipboard-linux-arm64-musl@0.3.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-AGuJdgKsmJdm4Pych7kv3sqe591ERRaAHW3xjLooiFzn8J+PxUyof++7YZrB5Y5tpnTO+K18Og3taj2NpluCRQ=="], + + "@mariozechner/clipboard-linux-riscv64-gnu": ["@mariozechner/clipboard-linux-riscv64-gnu@0.3.9", "", { "os": "linux", "cpu": "none" }, "sha512-DXBEAiuMpk7dhS1a9NzNxVAFi1vaKoPu7rQNgY8LIDLGrK3lnIp3nT10DUum+PKVJoJppIP+NAA8IZe4DMNDPw=="], + + "@mariozechner/clipboard-linux-x64-gnu": ["@mariozechner/clipboard-linux-x64-gnu@0.3.9", "", { "os": "linux", "cpu": "x64" }, "sha512-WORrMLd6EpElEME7JRKfSaY34nW1P5LbdgK5YNCS1ncG2LqmITsSMEJ8nh2mpvxb3TxqbOOKgY7k9eMJYlW9Mw=="], + + "@mariozechner/clipboard-linux-x64-musl": ["@mariozechner/clipboard-linux-x64-musl@0.3.9", "", { "os": "linux", "cpu": "x64" }, "sha512-/DHn+1DrfL6oRaPPWXaOKvonFFrni666fxd+zFqiQEfvBH0tsHVWjq9iqBk0oDp0qaPA72lIMy5BptxISBEhZQ=="], + + "@mariozechner/clipboard-win32-arm64-msvc": ["@mariozechner/clipboard-win32-arm64-msvc@0.3.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-O5FHD3ErkMwMhNzAfu3ggy0ug4z7btZuoQgwwxlzPrwV2bxlD6WDpqBY4NCgICAgZdDKdp+loUEKVAVt8aYnhQ=="], + + "@mariozechner/clipboard-win32-x64-msvc": ["@mariozechner/clipboard-win32-x64-msvc@0.3.9", "", { "os": "win32", "cpu": "x64" }, "sha512-ihQC3EufqEY81vhXBgVBtK4prL+wc62zJsSvxrgz7K1hsdt6OObz6v9p3Rn1OG3GJksTTKMJF0u/guMISHPhSA=="], + + "@mistralai/mistralai": ["@mistralai/mistralai@2.2.6", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.40.0", "ws": "^8.18.0", "zod": "^3.25.0 || ^4.0.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-W8pX7zHxjJvMIpw8JMxeJEleapXX0Q9NPszdNzqkM3MIEoIGPObdodujj+WHteXEvGfaP/AMwlNyRfEzSY6dQQ=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.41.1", "", {}, "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.1", "", {}, "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.1", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1" } }, "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], + + "@silvia-odwyer/photon-node": ["@silvia-odwyer/photon-node@0.3.4", "", {}, "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA=="], + + "@smithy/core": ["@smithy/core@3.26.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-mLUktFAn+Pa2agl1J7VgtYNFWCX8/b4GMJSK1hCu4YCvtBfM6F8Os3EP4ry+DFFlXOf3wyvlgXhuUdFoy52D3g=="], + + "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.4.2", "", { "dependencies": { "@smithy/core": "^3.26.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-18UMDMyrAbDcpmL1gLUA7ww0fRTcdCrSjSJOi2Sbld+tVjwD/pW+OAwjlScFLR7vvBnhZrIPQ7kVuTf1mnJLug=="], + + "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.5.2", "", { "dependencies": { "@smithy/core": "^3.26.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-Ei/UK/QMhq0rKaMqGPlOAkE2yS9DZeYmZdk1RAKc3vp3zxgleZHZyBLlZv8yLsxljX4svCRuMTD6u3LLIcU4Bg=="], + + "@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.7.3", "", { "dependencies": { "@smithy/core": "^3.24.3", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA=="], + + "@smithy/signature-v4": ["@smithy/signature-v4@5.5.2", "", { "dependencies": { "@smithy/core": "^3.26.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-7xHpmPY4rt0IOmeAA8EfjgEH8isT+587TCdy9H6a7d4OMi5CQ0oEHhWllunvPu4j4Cq0vTFwdxXN/kABWPjdyA=="], + + "@smithy/types": ["@smithy/types@4.15.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg=="], + + "@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + + "@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + + "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], + + "@types/node": ["@types/node@26.0.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw=="], + + "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + + "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], + + "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + + "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], + + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], + + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + + "gaxios": ["gaxios@7.1.5", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2" } }, "sha512-5FZy72Rh8LhtjmvDrKkI+lVhrsQrVKVsItxMoDm5mNQE+xR0WVIIs+jzPSJgBvKVsLi24fZhXJIsNI0bihDzFg=="], + + "gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="], + + "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], + + "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + + "google-auth-library": ["google-auth-library@10.9.0", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^7.1.4", "gcp-metadata": "8.1.2", "google-logging-utils": "1.1.3", "jws": "^4.0.0" } }, "sha512-xtvUqvINPhTaBm7nXqlYPcrMHJPm1lCNdSovxnKKhTm+4JsvQ+KGVYJViLoH9Yxu8w+T0Qv5HubzYT9BLrppJg=="], + + "google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], + + "hosted-git-info": ["hosted-git-info@9.0.3", "", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg=="], + + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + + "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], + + "json-schema-to-ts": ["json-schema-to-ts@3.1.1", "", { "dependencies": { "@babel/runtime": "^7.18.3", "ts-algebra": "^2.0.0" } }, "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g=="], + + "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], + + "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "lru-cache": ["lru-cache@11.5.1", "", {}, "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A=="], + + "marked": ["marked@18.0.5", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w=="], + + "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + + "openai": ["openai@6.26.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA=="], + + "p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="], + + "partial-json": ["partial-json@0.1.7", "", {}, "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], + + "protobufjs": ["protobufjs@7.6.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.1", "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.3.2" } }, "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "ts-algebra": ["ts-algebra@2.0.0", "", {}, "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typebox": ["typebox@1.1.38", "", {}, "sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA=="], + + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + + "undici": ["undici@8.5.0", "", {}, "sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg=="], + + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + + "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + + "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], + + "@aws-sdk/credential-provider-http/@smithy/node-http-handler": ["@smithy/node-http-handler@4.8.2", "", { "dependencies": { "@smithy/core": "^3.26.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-wfl1uwrAqMH9/pi4kqBo5LBcFwrJLxuDLqL7p7qNcJIFcyZDUc6pzhYk4CYv+DP7fIUpQCZumwNnkhPKS52osQ=="], + + "@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1074.0", "", { "dependencies": { "@aws-sdk/core": "^3.974.23", "@aws-sdk/nested-clients": "^3.997.23", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-pv80IzgGW4RnXWtft692chZOM9i6PhebVsLCcnaM4dBEPZva2fE6FXAHs76G7Rc7s3yGyX/68G0nZMrUy+Vmpg=="], + + "@aws-sdk/nested-clients/@smithy/node-http-handler": ["@smithy/node-http-handler@4.8.2", "", { "dependencies": { "@smithy/core": "^3.26.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-wfl1uwrAqMH9/pi4kqBo5LBcFwrJLxuDLqL7p7qNcJIFcyZDUc6pzhYk4CYv+DP7fIUpQCZumwNnkhPKS52osQ=="], + + "p-retry/retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], + } +} diff --git a/cli/bunfig.toml b/cli/bunfig.toml new file mode 100644 index 000000000..b09aac595 --- /dev/null +++ b/cli/bunfig.toml @@ -0,0 +1,7 @@ +# The repo root pins `minimumReleaseAge = 604800` (a 7-day quarantine on new +# dependency versions). The Pi harness packages this CLI depends on are +# actively released and would be blocked by that quarantine, so the cli/ +# sub-project opts out. (Bun reads the bunfig.toml from the current working +# directory, so running install/build from cli/ uses this file, not the root's.) +[install] +minimumReleaseAge = 0 diff --git a/cli/install.sh b/cli/install.sh new file mode 100755 index 000000000..ca8908a01 --- /dev/null +++ b/cli/install.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# install.sh — build (if needed) and install the `thunderbolt` binary into +# ~/.local/bin. POSIX sh; idempotent (re-running overwrites the install). +set -eu + +SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +BINARY="${SCRIPT_DIR}/dist/thunderbolt" + +if [ ! -f "${BINARY}" ]; then + echo "thunderbolt: dist/thunderbolt missing — building…" + (cd "${SCRIPT_DIR}" && bun run build) +fi + +INSTALL_DIR="${HOME}/.local/bin" +mkdir -p "${INSTALL_DIR}" +cp "${BINARY}" "${INSTALL_DIR}/thunderbolt" +chmod +x "${INSTALL_DIR}/thunderbolt" + +case ":${PATH}:" in + *":${INSTALL_DIR}:"*) ;; + *) echo "note: ${INSTALL_DIR} is not on your PATH — add it:" \ + && echo " export PATH=\"${INSTALL_DIR}:\$PATH\"" ;; +esac + +echo "installed: ${INSTALL_DIR}/thunderbolt" diff --git a/cli/package.json b/cli/package.json new file mode 100644 index 000000000..a08193b11 --- /dev/null +++ b/cli/package.json @@ -0,0 +1,31 @@ +{ + "name": "@thunderbolt/cli", + "version": "0.1.0", + "private": true, + "type": "module", + "license": "MPL-2.0", + "description": "thunderbolt — a portable, single-binary terminal coding agent (bash/read/write/edit) built on the Pi harness.", + "bin": { + "thunderbolt": "./src/index.ts" + }, + "scripts": { + "dev": "bun run src/index.ts", + "start": "bun run src/index.ts", + "typecheck": "tsc --noEmit", + "build": "bun build --compile --minify --sourcemap src/index.ts --outfile dist/thunderbolt", + "build:darwin-arm64": "bun build --compile --minify --target=bun-darwin-arm64 src/index.ts --outfile dist/thunderbolt-darwin-arm64", + "build:darwin-x64": "bun build --compile --minify --target=bun-darwin-x64 src/index.ts --outfile dist/thunderbolt-darwin-x64", + "build:linux-x64": "bun build --compile --minify --target=bun-linux-x64 src/index.ts --outfile dist/thunderbolt-linux-x64", + "build:linux-arm64": "bun build --compile --minify --target=bun-linux-arm64 src/index.ts --outfile dist/thunderbolt-linux-arm64", + "build:all": "bun run build:darwin-arm64 && bun run build:darwin-x64 && bun run build:linux-x64 && bun run build:linux-arm64" + }, + "dependencies": { + "@earendil-works/pi-agent-core": "0.80.2", + "@earendil-works/pi-ai": "0.80.2", + "@earendil-works/pi-coding-agent": "0.80.2" + }, + "devDependencies": { + "@types/bun": "^1.2.20", + "typescript": "^6.0.3" + } +} diff --git a/cli/src/agent/harness.ts b/cli/src/agent/harness.ts new file mode 100644 index 000000000..97456713b --- /dev/null +++ b/cli/src/agent/harness.ts @@ -0,0 +1,55 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Assembles the Pi `AgentHarness` — the spine that lets the CLI actually talk + * to Claude. It binds a Node execution environment (real bash + filesystem) to + * the working directory, opens an in-memory session, resolves the model, and + * registers the four coding tools (bash/read/write/edit). + */ + +import { AgentHarness, InMemorySessionRepo } from '@earendil-works/pi-agent-core' +import { NodeExecutionEnv } from '@earendil-works/pi-agent-core/node' +import { createBashTool, createEditTool, createReadTool, createWriteTool } from '@earendil-works/pi-coding-agent' +import { resolveModel } from './model.ts' +import { buildSystemPrompt } from './system-prompt.ts' +import type { HarnessBundle, RunConfig } from './types.ts' + +/** + * Builds a ready-to-run harness for a single CLI invocation, paired with a + * `dispose` that releases the execution environment. Renderer and permission + * hooks are attached by the caller, not here. + * + * @param config - the resolved run configuration + * @returns the constructed harness and its teardown function + */ +export const buildHarness = async (config: RunConfig): Promise => { + const env = new NodeExecutionEnv({ cwd: config.cwd }) + const session = await new InMemorySessionRepo().create({}) + const { models, model } = resolveModel(config.model) + const tools = [ + createBashTool(config.cwd), + createReadTool(config.cwd), + createWriteTool(config.cwd), + createEditTool(config.cwd), + ] + + const harness = new AgentHarness({ + env, + session, + models, + model, + tools, + activeToolNames: tools.map((tool) => tool.name), + thinkingLevel: config.thinking, + systemPrompt: buildSystemPrompt({ cwd: config.cwd }), + }) + + return { + harness, + dispose: async () => { + await env.cleanup() + }, + } +} diff --git a/cli/src/agent/model.ts b/cli/src/agent/model.ts new file mode 100644 index 000000000..fbda42b1d --- /dev/null +++ b/cli/src/agent/model.ts @@ -0,0 +1,36 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Resolves an Anthropic model id against Pi's built-in catalog. + * + * Pi's `@earendil-works/pi-ai/providers/all` is the only entry point that wires + * the providers; bare `createModels()` returns an empty collection. The wired + * collection's anthropic provider resolves `ANTHROPIC_API_KEY` from the + * environment automatically. The specific model is looked up by id via + * `Models.getModel`, the non-deprecated runtime accessor that accepts an + * arbitrary string id (unlike the catalog-key-typed `getBuiltinModel`). + */ + +import type { Api, Model, Models } from '@earendil-works/pi-ai' +import { builtinModels } from '@earendil-works/pi-ai/providers/all' + +/** Provider whose models the CLI talks to. */ +const PROVIDER = 'anthropic' + +/** + * Builds the wired provider collection and resolves a single Anthropic model. + * + * @param requestedId - the Anthropic model id to run (e.g. `claude-opus-4-8`) + * @returns the provider collection and the resolved model, ready for the harness + * @throws if `requestedId` is not in Pi's built-in Anthropic catalog + */ +export const resolveModel = (requestedId: string): { models: Models; model: Model } => { + const models = builtinModels() + const model = models.getModel(PROVIDER, requestedId) + if (!model) { + throw new Error(`Unknown Anthropic model "${requestedId}".`) + } + return { models, model } +} diff --git a/cli/src/agent/permissions.ts b/cli/src/agent/permissions.ts new file mode 100644 index 000000000..91fce7228 --- /dev/null +++ b/cli/src/agent/permissions.ts @@ -0,0 +1,56 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import type { AgentHarness } from '@earendil-works/pi-agent-core' +import type { PermissionPrompt, PermissionRequest } from './types.ts' + +/** Tools that run unguarded — pure reads with no side effects. */ +const READ_ONLY_TOOLS = new Set(['read']) + +/** + * Builds the one-line summary shown to the user for a gated tool call. `bash` + * summarizes to its command; `write`/`edit` to their target path (both tools + * use an `input.path` field). + * + * @param toolName - the tool being invoked + * @param input - the tool's validated arguments + * @returns a human-readable one-liner + */ +const summarize = (toolName: string, input: Record): string => { + if (toolName === 'bash' && typeof input.command === 'string') return input.command + if (typeof input.path === 'string') return input.path + return JSON.stringify(input) +} + +/** + * Registers the interactive tool-permission gate on the harness. + * + * In `yolo` mode no hook is attached and every tool call runs unguarded. + * Otherwise each write/edit/bash call is approved via {@link PermissionPrompt}: + * `allow-once` runs it, `allow-session` runs it and allows that tool for the + * rest of the session, and `deny` blocks it with an error tool result. Read-only + * tools are always allowed. + * + * @param harness - the Pi harness to gate + * @param opts.yolo - when true, auto-approve everything (no gate) + * @param opts.ask - prompt used to ask the user for a decision + */ +export const attachPermissionGate = (harness: AgentHarness, opts: { yolo: boolean; ask: PermissionPrompt }): void => { + if (opts.yolo) return + + const sessionAllowed = new Set() + + harness.on('tool_call', async ({ toolName, input }) => { + if (READ_ONLY_TOOLS.has(toolName) || sessionAllowed.has(toolName)) return undefined + + const request: PermissionRequest = { toolName, summary: summarize(toolName, input) } + const decision = await opts.ask(request) + if (decision === 'allow-once') return undefined + if (decision === 'allow-session') { + sessionAllowed.add(toolName) + return undefined + } + return { block: true, reason: `User denied ${toolName}` } + }) +} diff --git a/cli/src/agent/run.ts b/cli/src/agent/run.ts new file mode 100644 index 000000000..ed9e6b1b2 --- /dev/null +++ b/cli/src/agent/run.ts @@ -0,0 +1,67 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * The agent run-loop: wires the harness, renderer, terminal I/O, and + * permission gate together, then drives either a single prompt (oneshot) or + * an interactive REPL. Harness teardown is guaranteed via `finally`. + */ + +import type { AgentHarness } from '@earendil-works/pi-agent-core' +import { buildHarness } from './harness.ts' +import { attachRenderer } from '../ui/render.ts' +import { attachPermissionGate } from './permissions.ts' +import { createTerminalIO } from '../ui/prompt.ts' +import { printBanner } from '../banner.ts' +import type { RunConfig, TerminalIO } from './types.ts' + +/** + * Interactive read-eval loop: prompt the user, run each line through the + * harness, and wait for the agent to go idle before reading the next one. + * `exit`/`quit` ends the loop; blank lines are skipped. + */ +const runRepl = async (harness: AgentHarness, io: TerminalIO): Promise => { + while (true) { + const line = await io.readLine('› ') + // `null` is EOF (Ctrl-D / closed pipe); `exit`/`quit` are explicit quits. + if (line === null || line === 'exit' || line === 'quit') return + if (line === '') continue + await harness.prompt(line) + await harness.waitForIdle() + } +} + +/** + * Runs the agent for a single CLI invocation. Requires `ANTHROPIC_API_KEY`; + * exits with a friendly message when it's absent. + * + * @param config - the resolved configuration from `parseArgs` + */ +export const runAgent = async (config: RunConfig): Promise => { + if (!process.env.ANTHROPIC_API_KEY) { + throw new Error('set ANTHROPIC_API_KEY to run the agent (https://console.anthropic.com).') + } + + const { harness, dispose } = await buildHarness(config) + attachRenderer(harness) + const io = createTerminalIO() + attachPermissionGate(harness, { yolo: config.yolo, ask: io.ask }) + + try { + if (config.mode === 'oneshot') { + const result = await harness.prompt(config.prompt) + await harness.waitForIdle() + // A failed turn (bad key, rate limit) resolves rather than throwing, and + // the renderer prints the error — propagate it to the exit code too. + if (result.stopReason === 'error') process.exitCode = 1 + process.stdout.write('\n') + } else { + printBanner() + await runRepl(harness, io) + } + } finally { + io.close() + await dispose() + } +} diff --git a/cli/src/agent/system-prompt.ts b/cli/src/agent/system-prompt.ts new file mode 100644 index 000000000..718e3d901 --- /dev/null +++ b/cli/src/agent/system-prompt.ts @@ -0,0 +1,47 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Builds the coding-agent system prompt. Tuned for Claude Opus 4.8 per + * Anthropic's migration guidance: default to silence between tool calls, + * take autonomy on small reversible decisions, and avoid over-engineering. + * + * @param params.cwd - the working directory the agent operates in + * @returns the system prompt string + */ +export const buildSystemPrompt = ({ cwd }: { cwd: string }): string => `\ +You are thunderbolt, a terminal coding agent. You operate directly in the user's \ +working directory and complete software tasks end-to-end. + +Working directory: ${cwd} + +# Tools +You have four tools, byte-identical to a real Unix shell and filesystem: +- bash — run shell commands (grep, sed, find, git, language toolchains, tests, …) +- read — read a file +- write — create or overwrite a file +- edit — replace a span within a file + +Prefer bash for exploration (grep/find/ls) and for running builds and tests. Use \ +read before edit. Make the smallest change that fully solves the task. + +# How to work +- When you have enough information to act, act. Don't re-derive facts already \ + established or narrate a plan you're about to execute — just execute it. +- Default to silence between tool calls. Only write text when you find something, \ + change direction, or hit a blocker — one sentence each. Don't narrate routine \ + actions ("Now I'll…", "Let me check…"). +- For minor, reversible choices (a name, a default, which of two equivalent \ + approaches), pick a reasonable option and proceed. For destructive or \ + irreversible actions, stop and explain before acting. +- Don't add features, refactors, abstractions, or defensive error handling beyond \ + what the task requires. Do the simplest thing that works. +- Verify your work: run the build and tests when they exist, and inspect output \ + rather than assuming success. Report outcomes faithfully — if tests fail, say so \ + with the output; if a step was skipped, say that. + +# Finishing +When the task is complete, end with one or two sentences on what changed and any \ +follow-up the user should know about. Lead with the outcome. Don't recap every \ +file you touched — the user watched it happen.` diff --git a/cli/src/agent/types.ts b/cli/src/agent/types.ts new file mode 100644 index 000000000..b770218a7 --- /dev/null +++ b/cli/src/agent/types.ts @@ -0,0 +1,104 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Shared module contracts for the thunderbolt CLI. + * + * These types are the stable seam between the CLI's modules (arg parsing, + * harness assembly, the streaming renderer, and the permission gate) so each + * can be built and reasoned about independently. Pi types (e.g. `AgentHarness`) + * are imported directly from `@earendil-works/pi-agent-core` where needed. + */ + +import type { AgentHarness } from '@earendil-works/pi-agent-core' + +/** + * A constructed harness paired with a teardown function. `buildHarness` + * returns this so callers release the underlying execution environment + * (temp dirs, shell) without reaching into Pi internals. + */ +export type HarnessBundle = { + readonly harness: AgentHarness + readonly dispose: () => Promise +} + +/** Reasoning depth passed to the Pi harness (`thinkingLevel`). */ +export type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' + +/** Wire protocol whose local stdio process the bridge exposes over the network. + * Drives only logging — the stdio↔WebSocket pump is byte-identical for both. */ +export type BridgeProtocol = 'acp' | 'mcp' + +/** + * Fully-resolved configuration for an `acp`/`mcp` bridge invocation, produced by + * {@link parseArgs} and consumed by the bridge runner. + */ +export type BridgeConfig = { + /** Which protocol's stdio process is being bridged. */ + readonly protocol: BridgeProtocol + /** Network transport exposing the process. Only `wss` exists today. */ + readonly transport: 'wss' + /** TCP port the WebSocket server listens on (`0` lets the OS assign one). */ + readonly port: number + /** The spawned stdio agent command: `command[0]` is the executable. */ + readonly command: readonly string[] +} + +/** Settings common to every run, independent of oneshot vs REPL mode. */ +type RunConfigBase = { + /** Anthropic model id (defaults to `claude-opus-4-8`). */ + readonly model: string + /** Working directory the agent's bash/fs tools are bound to. */ + readonly cwd: string + /** When true, auto-approve every tool call (no interactive gate). */ + readonly yolo: boolean + /** Reasoning depth for the harness. */ + readonly thinking: ThinkingLevel +} + +/** + * Fully-resolved configuration for a single CLI invocation, produced by + * {@link parseArgs} and consumed by the agent runner. The discriminated `mode` + * makes `prompt` present exactly when (and only when) it's a oneshot run. + */ +export type RunConfig = + (RunConfigBase & { readonly mode: 'oneshot'; readonly prompt: string }) | (RunConfigBase & { readonly mode: 'repl' }) + +/** Result of parsing argv: a run, a bridge, or a terminal info action. */ +export type ParsedArgs = + | { readonly kind: 'run'; readonly config: RunConfig } + | { readonly kind: 'bridge'; readonly config: BridgeConfig } + | { readonly kind: 'help' } + | { readonly kind: 'version' } + | { readonly kind: 'error'; readonly message: string } + +/** User's answer when asked to approve a tool call. */ +export type PermissionDecision = 'allow-once' | 'allow-session' | 'deny' + +/** A request surfaced to the user before a gated tool call runs. */ +export type PermissionRequest = { + /** Tool being invoked, e.g. `bash`, `write`, `edit`. */ + readonly toolName: string + /** One-line human summary, e.g. the bash command or target path. */ + readonly summary: string + /** Optional multi-line detail (diff, full command, etc.). */ + readonly detail?: string +} + +/** Asks the user to approve a gated tool call. Injected into the gate. */ +export type PermissionPrompt = (request: PermissionRequest) => Promise + +/** + * Interactive terminal I/O over a single shared readline interface — used both + * for the REPL input loop and for permission prompts so they don't fight over + * stdin. + */ +export type TerminalIO = { + /** Read one line of input for the given prompt label; `null` at EOF (Ctrl-D). */ + readonly readLine: (prompt: string) => Promise + /** Ask the user to approve a tool call. */ + readonly ask: PermissionPrompt + /** Tear down the readline interface. */ + readonly close: () => void +} diff --git a/cli/src/banner.ts b/cli/src/banner.ts new file mode 100644 index 000000000..e05e9fe30 --- /dev/null +++ b/cli/src/banner.ts @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Standalone REPL banner. Uses raw ANSI so it stays decoupled from the UI + * theme, and skips color when NO_COLOR is set or stdout isn't a TTY. + */ + +import { VERSION } from './cli.ts' + +/** Whether to emit ANSI color: only on an interactive TTY without NO_COLOR. */ +const useColor = (): boolean => !process.env.NO_COLOR && process.stdout.isTTY === true + +/** + * Prints a small colored header for the interactive REPL: the thunderbolt + * title, version, and a one-line hint. No-op-safe in non-TTY environments + * (the text still prints, just without color). + */ +export const printBanner = (): void => { + const color = useColor() + const bold = color ? '\x1b[1m' : '' + const yellow = color ? '\x1b[33m' : '' + const dim = color ? '\x1b[2m' : '' + const reset = color ? '\x1b[0m' : '' + + process.stdout.write( + `${bold}${yellow}⚡ thunderbolt${reset} ${dim}v${VERSION}${reset}\n` + + `${dim}type a task, or 'exit' to quit${reset}\n\n`, + ) +} diff --git a/cli/src/cli.ts b/cli/src/cli.ts new file mode 100644 index 000000000..fc376f247 --- /dev/null +++ b/cli/src/cli.ts @@ -0,0 +1,224 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Command-line surface for the thunderbolt CLI: version, help text, and the + * pure `parseArgs` that turns `Bun.argv.slice(2)` into a {@link ParsedArgs}. + * No I/O happens here — the caller decides what to do with the result. + */ + +import type { BridgeConfig, BridgeProtocol, ParsedArgs, RunConfig, ThinkingLevel } from './agent/types.ts' + +/** Released version of the CLI, surfaced by `--version` and the banner. */ +export const VERSION = '0.1.0' + +/** Default Anthropic model when `--model` is omitted. */ +const DEFAULT_MODEL = 'claude-opus-4-8' + +/** All valid `--thinking` levels, in increasing depth. */ +const THINKING_LEVELS: readonly ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh'] + +/** The only `--transport` value supported today. `iroh` (P2P) is planned. */ +const SUPPORTED_TRANSPORT = 'wss' + +/** Default `--port` per bridge protocol — distinct so `acp` and `mcp` bridges + * can run side by side without colliding on their defaults. */ +const DEFAULT_BRIDGE_PORT: Record = { acp: 8839, mcp: 8840 } + +/** Usage text printed by `--help`/`-h`. */ +export const HELP_TEXT = `⚡ thunderbolt v${VERSION} — a single-binary terminal coding agent. + +USAGE + thunderbolt [options] [prompt] + thunderbolt agent [options] [prompt] + thunderbolt acp --transport ${SUPPORTED_TRANSPORT} [--port N] -- + thunderbolt mcp --transport ${SUPPORTED_TRANSPORT} [--port N] -- + + With a prompt, runs it once and exits. With no prompt, starts an + interactive REPL. Built on the Pi harness; talks to Claude. + +SUBCOMMANDS + agent run the coding agent (default when omitted) + acp bridge a local stdio ACP agent onto a WebSocket the app can reach + mcp bridge a local stdio MCP server onto a WebSocket the app can reach + +TOOLS + bash run shell commands + read read a file + write create or overwrite a file + edit replace a span within a file + +OPTIONS + -m, --model Anthropic model id (default: ${DEFAULT_MODEL}) + --thinking reasoning depth: ${THINKING_LEVELS.join(' | ')} (default: medium) + -y, --yolo auto-approve every tool call (alias: + --dangerously-skip-permissions) + -h, --help show this help and exit + -v, --version print the version and exit + +BRIDGE OPTIONS (acp / mcp) + --transport network transport: ${SUPPORTED_TRANSPORT} (default: ${SUPPORTED_TRANSPORT}) + --port listen port (default: acp ${DEFAULT_BRIDGE_PORT.acp}, mcp ${DEFAULT_BRIDGE_PORT.mcp}) + -- everything after this is the stdio command to spawn + +EXAMPLES + thunderbolt "fix the failing test in utils.ts" + thunderbolt --thinking high "refactor the auth module" + thunderbolt --yolo "run the test suite and fix what breaks" + thunderbolt + thunderbolt acp --transport ${SUPPORTED_TRANSPORT} -- npx @zed-industries/claude-code-acp + thunderbolt mcp --transport ${SUPPORTED_TRANSPORT} --port 9001 -- uvx mcp-server-fetch + +Requires ANTHROPIC_API_KEY (https://console.anthropic.com).` + +/** Type guard: is `value` one of the supported {@link ThinkingLevel}s? */ +const isThinkingLevel = (value: string): value is ThinkingLevel => + (THINKING_LEVELS as readonly string[]).includes(value) + +/** Flag/positional state accumulated while scanning argv. */ +type Flags = { + readonly model: string + readonly yolo: boolean + readonly thinking: ThinkingLevel + readonly positionals: readonly string[] +} + +const DEFAULT_FLAGS: Flags = { + model: DEFAULT_MODEL, + yolo: false, + thinking: 'medium', + positionals: [], +} + +/** Outcome of scanning argv: resolved flags, or a parse error message. */ +type ScanResult = { readonly ok: true; readonly flags: Flags } | { readonly ok: false; readonly message: string } + +/** + * Recursively folds the token stream into {@link Flags}. Value-taking flags + * consume the following token; anything unrecognized becomes a positional. + */ +const scanTokens = (tokens: readonly string[], index: number, flags: Flags): ScanResult => { + if (index >= tokens.length) return { ok: true, flags } + + const token = tokens[index] + const next = tokens[index + 1] + + if (token === '--model' || token === '-m') { + if (next === undefined) return { ok: false, message: 'thunderbolt: --model requires a value' } + return scanTokens(tokens, index + 2, { ...flags, model: next }) + } + + if (token === '--thinking') { + if (next === undefined) return { ok: false, message: 'thunderbolt: --thinking requires a value' } + if (!isThinkingLevel(next)) { + return { + ok: false, + message: `thunderbolt: invalid --thinking level '${next}' (expected one of: ${THINKING_LEVELS.join(', ')})`, + } + } + return scanTokens(tokens, index + 2, { ...flags, thinking: next }) + } + + if (token === '--yolo' || token === '-y' || token === '--dangerously-skip-permissions') { + return scanTokens(tokens, index + 1, { ...flags, yolo: true }) + } + + return scanTokens(tokens, index + 1, { ...flags, positionals: [...flags.positionals, token] }) +} + +/** Bridge flag state accumulated while scanning the tokens before `--`. */ +type BridgeFlags = { readonly transport: 'wss'; readonly port: number } + +type BridgeScanResult = + | { readonly ok: true; readonly flags: BridgeFlags } + | { readonly ok: false; readonly message: string } + +/** + * Folds the bridge flag tokens (everything before the `--` separator) into + * {@link BridgeFlags}. Only `--transport` and `--port` are recognized; an + * unknown token is reported as a likely missing `--` before the agent command. + */ +const scanBridgeFlags = (tokens: readonly string[], index: number, flags: BridgeFlags): BridgeScanResult => { + if (index >= tokens.length) return { ok: true, flags } + + const token = tokens[index] + const next = tokens[index + 1] + + if (token === '--transport') { + if (next === undefined) return { ok: false, message: 'thunderbolt: --transport requires a value' } + if (next === 'iroh') { + return { ok: false, message: "thunderbolt: --transport 'iroh' is not available yet (P2P transport is planned); use 'wss'" } + } + if (next !== SUPPORTED_TRANSPORT) { + return { ok: false, message: `thunderbolt: invalid --transport '${next}' (only '${SUPPORTED_TRANSPORT}' is supported)` } + } + return scanBridgeFlags(tokens, index + 2, { ...flags, transport: SUPPORTED_TRANSPORT }) + } + + if (token === '--port') { + if (next === undefined) return { ok: false, message: 'thunderbolt: --port requires a value' } + // Digits-only so `0x10`/`1e3`/` 5 ` don't slip past `Number` coercion. + if (!/^\d+$/.test(next) || Number(next) > 65535) { + return { ok: false, message: `thunderbolt: invalid --port '${next}' (expected an integer 0-65535)` } + } + return scanBridgeFlags(tokens, index + 2, { ...flags, port: Number(next) }) + } + + return { ok: false, message: `thunderbolt: unrecognized bridge option '${token}' (did you forget '--' before the command?)` } +} + +/** + * Parses an `acp`/`mcp` bridge invocation. Splits the tokens at the first `--` + * separator: flags before it, the stdio command to spawn after it. + */ +const parseBridgeArgs = (protocol: BridgeProtocol, rest: string[]): ParsedArgs => { + const separator = rest.indexOf('--') + const flagTokens = separator === -1 ? rest : rest.slice(0, separator) + const command = separator === -1 ? [] : rest.slice(separator + 1) + + if (flagTokens.includes('--help') || flagTokens.includes('-h')) return { kind: 'help' } + + const scan = scanBridgeFlags(flagTokens, 0, { transport: SUPPORTED_TRANSPORT, port: DEFAULT_BRIDGE_PORT[protocol] }) + if (!scan.ok) return { kind: 'error', message: scan.message } + + if (command.length === 0) { + return { + kind: 'error', + message: `thunderbolt ${protocol}: missing agent command (e.g. thunderbolt ${protocol} --transport ${SUPPORTED_TRANSPORT} -- )`, + } + } + + const config: BridgeConfig = { protocol, transport: scan.flags.transport, port: scan.flags.port, command } + return { kind: 'bridge', config } +} + +/** + * Parses CLI arguments (already stripped of runtime/script — pass + * `Bun.argv.slice(2)`) into a {@link ParsedArgs}. Pure: no I/O, no exits. + * + * @param argv - the raw argument tokens + * @returns a terminal info action (`help`/`version`/`error`), a `run` with a + * fully-resolved {@link RunConfig}, or a `bridge` with a {@link BridgeConfig} + */ +export const parseArgs = (argv: string[]): ParsedArgs => { + const subcommand = argv[0] + if (subcommand === 'acp' || subcommand === 'mcp') return parseBridgeArgs(subcommand, argv.slice(1)) + + if (argv.includes('--help') || argv.includes('-h')) return { kind: 'help' } + if (argv.includes('--version') || argv.includes('-v')) return { kind: 'version' } + + const tokens = subcommand === 'agent' ? argv.slice(1) : argv + const scan = scanTokens(tokens, 0, DEFAULT_FLAGS) + if (!scan.ok) return { kind: 'error', message: scan.message } + + const prompt = scan.flags.positionals.join(' ') + const base = { + model: scan.flags.model, + cwd: process.cwd(), + yolo: scan.flags.yolo, + thinking: scan.flags.thinking, + } + const config: RunConfig = prompt.length > 0 ? { ...base, mode: 'oneshot', prompt } : { ...base, mode: 'repl' } + return { kind: 'run', config } +} diff --git a/cli/src/commands/bridge.ts b/cli/src/commands/bridge.ts new file mode 100644 index 000000000..4e22a6b73 --- /dev/null +++ b/cli/src/commands/bridge.ts @@ -0,0 +1,152 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Transparent stdio ↔ WebSocket bridge for ACP agents and MCP servers. + * + * Spawns a local JSON-RPC-over-stdio process and exposes it over a WebSocket so + * the in-browser app can reach it as a `remote-acp` agent / remote MCP server. + * The pump is framing-aware on both edges: + * - WS → stdin: every WebSocket frame is exactly one JSON-RPC object (the app + * sends `JSON.stringify(msg)` per frame), so we forward it verbatim plus the + * trailing newline that the ndjson stdio framing requires. + * - stdout → WS: the process emits newline-delimited JSON, so we split on + * newlines and send each complete object as its own WebSocket frame — what + * the app's transport expects (`JSON.parse(event.data)` once per message). + * + * Lifecycle is 1:1: each WebSocket connection spawns its own dedicated process; + * closing the socket kills the process, and a process exit closes the socket. + * ACP and MCP share this exact pump (both speak ndjson JSON-RPC over stdio). + */ + +import type { ServerWebSocket, Subprocess } from 'bun' +import type { BridgeConfig } from '../agent/types.ts' + +/** Per-connection state: the spawned process this socket is pumping. `null` + * only in the instant between upgrade and `open` (or after a spawn failure). */ +type BridgeSocketData = { + proc: Subprocess<'pipe', 'pipe', 'inherit'> | null +} + +type BridgeSocket = ServerWebSocket +type BridgeProc = Subprocess<'pipe', 'pipe', 'inherit'> + +/** One-shot decoder for the rare binary inbound frame. Safe to share: it's only + * ever called without `{ stream: true }`, so it holds no cross-call state. The + * stdout pump deliberately uses its own decoder (streaming state must not be + * shared across concurrent connections). */ +const frameDecoder = new TextDecoder() + +/** + * Pump a process's newline-delimited-JSON stdout to the socket, one JSON object + * per WebSocket frame. Resolves when stdout closes (the process exited or was + * killed). A trailing object without a final newline is flushed at close. + */ +const pumpStdoutToSocket = async (proc: BridgeProc, ws: BridgeSocket): Promise => { + // Per-pump decoder: `{ stream: true }` retains partial-multibyte state, which + // would corrupt other connections if shared. Each connection gets its own. + const decoder = new TextDecoder() + const reader = proc.stdout.getReader() + let buffer = '' + while (true) { + const { value, done } = await reader.read() + if (done) break + buffer += decoder.decode(value, { stream: true }) + const lines = buffer.split('\n') + buffer = lines.pop() ?? '' + for (const line of lines) { + const trimmed = line.trim() + if (trimmed) ws.send(trimmed) + } + } + buffer += decoder.decode() + const trailing = buffer.trim() + if (trailing) ws.send(trailing) +} + +/** Spawn the bridged agent, returning `null` if the executable can't be found + * (the parser guarantees a non-empty command). Bun.spawn throws synchronously + * on ENOENT — catching it at this connection boundary keeps one bad command + * from killing the whole server, and surfaces the reason on the operator's + * stderr so the failure is loud rather than silent. */ +const spawnAgent = (command: readonly string[]): BridgeProc | null => { + try { + return Bun.spawn({ cmd: [...command], stdin: 'pipe', stdout: 'pipe', stderr: 'inherit' }) + } catch (err) { + process.stderr.write(`thunderbolt bridge: failed to spawn '${command[0]}': ${err instanceof Error ? err.message : String(err)}\n`) + return null + } +} + +/** + * Start the bridge server: listen for WebSocket connections and pump each one + * to its own freshly-spawned `config.command` process. Returns once the server + * is listening; the live server keeps the process alive until interrupted. + */ +export const runBridge = async (config: BridgeConfig): Promise => { + const server = Bun.serve({ + // Loopback-only: this transport is unauthenticated, so it must not be + // reachable from the LAN (Bun's default binds every interface). The G3 + // consumer is the app running on the same machine; authenticated remote + // access is the separate iroh transport (G4). + hostname: '127.0.0.1', + port: config.port, + fetch(req, srv) { + if (srv.upgrade(req, { data: { proc: null } })) return undefined + return new Response('thunderbolt bridge: WebSocket endpoint only\n', { status: 426 }) + }, + websocket: { + open(ws) { + const proc = spawnAgent(config.command) + if (!proc) { + ws.close(1011, `failed to spawn '${config.command[0]}'`) + return + } + ws.data.proc = proc + void (async () => { + try { + await pumpStdoutToSocket(proc, ws) + } catch (err) { + process.stderr.write(`thunderbolt bridge: stdout pump error: ${err instanceof Error ? err.message : String(err)}\n`) + } + })() + void (async () => { + const code = await proc.exited + // 1000 (normal) only on a clean exit; a non-zero/killed exit is an + // abnormal close (1011) so the app surfaces it instead of seeing + // a successful shutdown. + ws.close(code === 0 ? 1000 : 1011, `agent exited (code ${code})`) + })() + }, + message(ws, message) { + const proc = ws.data.proc + if (!proc) return + const text = typeof message === 'string' ? message : frameDecoder.decode(message) + proc.stdin.write(text + '\n') + proc.stdin.flush() + }, + close(ws) { + ws.data.proc?.kill() + }, + }, + }) + + // A signal stops the server with `closeActiveConnections`, which fires each + // socket's `close` handler and so kills every spawned agent before exit. + const shutdown = (): void => { + server.stop(true) + process.exit(0) + } + process.on('SIGINT', shutdown) + process.on('SIGTERM', shutdown) + + // Advertise the exact bound address (not `localhost`, which can resolve to + // the IPv6 `::1` and miss this IPv4-only loopback bind). + const url = `ws://127.0.0.1:${server.port}` + process.stdout.write( + `⚡ thunderbolt ${config.protocol} bridge (${config.transport}) listening on ${url}\n` + + ` spawning per connection: ${config.command.join(' ')}\n` + + ` set this as the agent URL in the app: ${url}\n`, + ) +} diff --git a/cli/src/index.ts b/cli/src/index.ts new file mode 100644 index 000000000..34c7c9f82 --- /dev/null +++ b/cli/src/index.ts @@ -0,0 +1,45 @@ +#!/usr/bin/env bun +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Binary entrypoint. Parses argv, dispatches the terminal info actions + * (`help`/`version`/`error`) inline, and runs the agent inside the single + * top-level try/catch that turns any uncaught failure into a clean exit. + */ + +import { HELP_TEXT, VERSION, parseArgs } from './cli.ts' +import { runAgent } from './agent/run.ts' +import { runBridge } from './commands/bridge.ts' + +const parsed = parseArgs(Bun.argv.slice(2)) + +switch (parsed.kind) { + case 'help': + console.log(HELP_TEXT) + break + case 'version': + console.log(VERSION) + break + case 'error': + process.stderr.write(parsed.message + '\n') + process.exitCode = 1 + break + case 'run': + try { + await runAgent(parsed.config) + } catch (err) { + process.stderr.write(`thunderbolt: ${err instanceof Error ? err.message : String(err)}\n`) + process.exitCode = 1 + } + break + case 'bridge': + try { + await runBridge(parsed.config) + } catch (err) { + process.stderr.write(`thunderbolt: ${err instanceof Error ? err.message : String(err)}\n`) + process.exitCode = 1 + } + break +} diff --git a/cli/src/ui/prompt.ts b/cli/src/ui/prompt.ts new file mode 100644 index 000000000..cd64c03cd --- /dev/null +++ b/cli/src/ui/prompt.ts @@ -0,0 +1,48 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { createInterface } from 'node:readline/promises' +import type { PermissionDecision, PermissionRequest, TerminalIO } from '../agent/types.ts' + +/** + * Creates the interactive terminal I/O used by both the REPL input loop and the + * permission gate. A single `node:readline/promises` interface backs every read + * so the two never contend for stdin. + * + * @returns a {@link TerminalIO} bound to process stdin/stdout + */ +export const createTerminalIO = (): TerminalIO => { + const rl = createInterface({ input: process.stdin, output: process.stdout }) + // readline emits 'close' when stdin ends (Ctrl-D / closed pipe). A pending + // `question()` otherwise hangs forever, so abort it on close — that rejects + // the read, which `readLine` turns into a `null` end-of-input signal. + const eof = new AbortController() + rl.on('close', () => eof.abort()) + + const readLine = async (prompt: string): Promise => { + try { + const answer = await rl.question(prompt, { signal: eof.signal }) + return answer.trim() + } catch { + return null + } + } + + const ask = async (request: PermissionRequest): Promise => { + const block = ['', `\x1b[33m⚠ allow ${request.toolName}?\x1b[0m`, ` ${request.summary}`] + if (request.detail) block.push('', request.detail) + process.stdout.write(`${block.join('\n')}\n`) + + const answer = (await readLine('Allow? [y]es / [a]lways / [N]o: '))?.toLowerCase() + if (answer === 'y' || answer === 'yes') return 'allow-once' + if (answer === 'a' || answer === 'always') return 'allow-session' + return 'deny' + } + + const close = (): void => { + rl.close() + } + + return { readLine, ask, close } +} diff --git a/cli/src/ui/render.ts b/cli/src/ui/render.ts new file mode 100644 index 000000000..0502aad3b --- /dev/null +++ b/cli/src/ui/render.ts @@ -0,0 +1,129 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Streaming terminal renderer for the thunderbolt CLI. Subscribes to a Pi + * `AgentHarness` and pretty-prints the run as it happens: assistant prose, + * subdued thinking, and colored tool-call activity. + */ + +import type { AgentHarness, AgentMessage } from '@earendil-works/pi-agent-core' +import { cyan, dim, gray, green, red, symbols } from './theme.ts' + +/** Max length of a tool-call argument summary before it's ellipsized. */ +const ARGS_MAX = 100 +/** Max length of a tool-result preview before it's ellipsized. */ +const PREVIEW_MAX = 160 +/** Lines of a tool result shown as a preview. */ +const PREVIEW_LINES = 2 + +/** + * Truncates `text` to `max` characters, appending an ellipsis when clipped. + * + * @param text - the text to bound + * @param max - maximum length including the ellipsis + * @returns the original text, or a truncated copy ending in `…` + */ +const truncate = (text: string, max: number): string => (text.length > max ? `${text.slice(0, max - 1)}…` : text) + +/** + * Derives a one-line summary of a tool call's arguments: the shell command for + * `bash`, the target path for `read`/`write`/`edit`, or compact JSON otherwise. + * + * @param args - the tool's arguments (Pi types these loosely, so narrow here) + * @returns a single-line, untruncated summary + */ +const summarizeArgs = (args: unknown): string => { + if (typeof args !== 'object' || args === null) return '' + const record = args as Record + if (typeof record.command === 'string') return record.command + if (typeof record.path === 'string') return record.path + return JSON.stringify(record) +} + +/** Narrows an unknown tool-result content block to one carrying text. */ +const isTextBlock = (block: unknown): block is { text: string } => + typeof block === 'object' && block !== null && typeof (block as { text?: unknown }).text === 'string' + +/** + * Extracts a short preview from a Pi tool result by concatenating its text + * content blocks, then keeping the first couple of lines. + * + * @param result - the tool result (`{ content: [{ type, text }] }`) + * @returns a trimmed, line- and length-bounded preview (empty when none) + */ +const previewResult = (result: unknown): string => { + if (typeof result !== 'object' || result === null) return '' + const content = (result as { content?: unknown }).content + if (!Array.isArray(content)) return '' + const text = content + .filter(isTextBlock) + .map((block) => block.text) + .join('') + .trim() + return truncate(text.split('\n').slice(0, PREVIEW_LINES).join('\n'), PREVIEW_MAX) +} + +/** Writes the colored header that announces a tool invocation. */ +const renderToolStart = (toolName: string, args: unknown): void => { + const header = `${symbols.tool} ${cyan(toolName)}` + const summary = truncate(summarizeArgs(args), ARGS_MAX) + process.stdout.write(`\n${summary ? `${header} ${gray(summary)}` : header}\n`) +} + +/** Writes the success/failure marker for a finished tool call, with a preview. */ +const renderToolEnd = (isError: boolean, result: unknown): void => { + const mark = isError ? red(symbols.fail) : green(symbols.ok) + const preview = previewResult(result) + process.stdout.write(preview ? `${mark} ${gray(preview)}\n` : `${mark}\n`) +} + +/** + * Surfaces a turn that ended in a provider error (auth failure, rate limit, a + * bad request). Pi resolves the turn instead of throwing — the failure rides on + * the assistant message's `stopReason`/`errorMessage` — so without this the CLI + * would print nothing and look like a silent no-op. + * + * @param message - the assistant message attached to a `turn_end` event + */ +const renderTurnError = (message: AgentMessage): void => { + if (!('stopReason' in message) || message.stopReason !== 'error') return + const detail = message.errorMessage ?? 'the request failed' + process.stderr.write(`\n${red(`${symbols.fail} ${detail}`)}\n`) +} + +/** + * Attaches a streaming renderer to a harness. Subscribes for the harness's + * lifetime and writes assistant text, thinking, and tool activity to stdout as + * events arrive. + * + * @param harness - the Pi harness whose run should be rendered + */ +export const attachRenderer = (harness: AgentHarness): void => { + harness.subscribe((event) => { + switch (event.type) { + case 'message_update': { + const inner = event.assistantMessageEvent + switch (inner.type) { + case 'text_delta': + process.stdout.write(inner.delta) + break + case 'thinking_delta': + process.stdout.write(dim(inner.delta)) + break + } + break + } + case 'tool_execution_start': + renderToolStart(event.toolName, event.args) + break + case 'tool_execution_end': + renderToolEnd(event.isError, event.result) + break + case 'turn_end': + renderTurnError(event.message) + break + } + }) +} diff --git a/cli/src/ui/theme.ts b/cli/src/ui/theme.ts new file mode 100644 index 000000000..73754ea2c --- /dev/null +++ b/cli/src/ui/theme.ts @@ -0,0 +1,46 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Minimal, dependency-free ANSI styling for the thunderbolt CLI's terminal + * renderer. Color is suppressed when `NO_COLOR` holds a non-empty value or when + * stdout is not a TTY (piped/redirected output stays plain). The decision is + * resolved once at module load — the environment and TTY status don't change + * mid-run. + */ + +const colorEnabled = !process.env.NO_COLOR && Boolean(process.stdout.isTTY) + +/** + * Builds a styling helper that wraps text in an ANSI SGR sequence, returning + * the text unchanged when color is disabled. + * + * @param open - the opening SGR escape (e.g. `\x1b[36m` for cyan) + * @returns a helper that styles a string and resets afterwards + */ +const style = + (open: string) => + (text: string): string => + colorEnabled ? `${open}${text}\x1b[0m` : text + +/** Dims text — used for subdued output like the agent's thinking stream. */ +export const dim = style('\x1b[2m') +/** Colors text cyan — used for tool names and headers. */ +export const cyan = style('\x1b[36m') +/** Colors text green — used for success markers. */ +export const green = style('\x1b[32m') +/** Colors text red — used for failure markers. */ +export const red = style('\x1b[31m') +/** Colors text gray — used for secondary detail and result previews. */ +export const gray = style('\x1b[90m') + +/** Glyphs marking tool activity in the streamed output. */ +export const symbols = { + /** Precedes a tool invocation. */ + tool: '⏺', + /** Marks a successful tool result. */ + ok: '✓', + /** Marks a failed tool result. */ + fail: '✗', +} as const diff --git a/cli/tsconfig.json b/cli/tsconfig.json new file mode 100644 index 000000000..2315e8a0c --- /dev/null +++ b/cli/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../shared/tsconfig.base.json", + "compilerOptions": { + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "moduleResolution": "bundler", + "types": ["bun"], + "noEmit": true + }, + "include": ["src"] +} From ad89a34522a3e5c645a38fa0b0b836550761460b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Menezes?= Date: Sun, 28 Jun 2026 20:16:20 -0300 Subject: [PATCH 02/86] feat: run the built-in agent on an in-browser Pi harness --- bun.lock | 378 +++++++++++++++++- bunfig.toml | 11 + package.json | 10 + shared/agent-core/anthropic-model.ts | 192 +++++++++ .../browser-env/browser-execution-env.ts | 275 +++++++++++++ .../browser-env/coding-tool-operations.ts | 86 ++++ shared/agent-core/browser-env/fs-helpers.ts | 108 +++++ shared/agent-core/browser-env/index.ts | 19 + shared/agent-core/browser-env/mount.ts | 77 ++++ shared/agent-core/browser-env/zen-bash-fs.ts | 141 +++++++ .../agent-core/browser-stubs/cross-spawn.ts | 47 +++ .../browser-stubs/install-process.ts | 59 +++ .../browser-stubs/node-constants.cjs | 33 ++ .../agent-core/browser-stubs/node-crypto.ts | 43 ++ .../browser-stubs/node-fs-promises.ts | 53 +++ shared/agent-core/browser-stubs/node-fs.cjs | 107 +++++ .../agent-core/browser-stubs/node-module.ts | 59 +++ shared/agent-core/browser-stubs/node-os.ts | 37 ++ shared/agent-core/browser-stubs/node-url.ts | 33 ++ shared/agent-core/browser-stubs/undici.ts | 35 ++ shared/agent-core/browser-stubs/which.ts | 33 ++ shared/agent-core/build-app-harness.ts | 109 +++++ shared/agent-core/ensure-buffer.ts | 22 + shared/agent-core/index.ts | 22 + shared/agent-core/mcp-tools.ts | 158 ++++++++ shared/agent-core/pi-to-aisdk-stream.ts | 371 +++++++++++++++++ shared/agent-core/seed-history.ts | 49 +++ src/acp/built-in-adapter.ts | 255 +++++++++++- vite.config.ts | 55 +++ 29 files changed, 2864 insertions(+), 13 deletions(-) create mode 100644 shared/agent-core/anthropic-model.ts create mode 100644 shared/agent-core/browser-env/browser-execution-env.ts create mode 100644 shared/agent-core/browser-env/coding-tool-operations.ts create mode 100644 shared/agent-core/browser-env/fs-helpers.ts create mode 100644 shared/agent-core/browser-env/index.ts create mode 100644 shared/agent-core/browser-env/mount.ts create mode 100644 shared/agent-core/browser-env/zen-bash-fs.ts create mode 100644 shared/agent-core/browser-stubs/cross-spawn.ts create mode 100644 shared/agent-core/browser-stubs/install-process.ts create mode 100644 shared/agent-core/browser-stubs/node-constants.cjs create mode 100644 shared/agent-core/browser-stubs/node-crypto.ts create mode 100644 shared/agent-core/browser-stubs/node-fs-promises.ts create mode 100644 shared/agent-core/browser-stubs/node-fs.cjs create mode 100644 shared/agent-core/browser-stubs/node-module.ts create mode 100644 shared/agent-core/browser-stubs/node-os.ts create mode 100644 shared/agent-core/browser-stubs/node-url.ts create mode 100644 shared/agent-core/browser-stubs/undici.ts create mode 100644 shared/agent-core/browser-stubs/which.ts create mode 100644 shared/agent-core/build-app-harness.ts create mode 100644 shared/agent-core/ensure-buffer.ts create mode 100644 shared/agent-core/index.ts create mode 100644 shared/agent-core/mcp-tools.ts create mode 100644 shared/agent-core/pi-to-aisdk-stream.ts create mode 100644 shared/agent-core/seed-history.ts diff --git a/bun.lock b/bun.lock index 9f92e9dff..991d633d1 100644 --- a/bun.lock +++ b/bun.lock @@ -11,9 +11,13 @@ "@ai-sdk/openai": "^3.0.11", "@ai-sdk/openai-compatible": "^2.0.12", "@ai-sdk/react": "^3.0.39", + "@anthropic-ai/sdk": "0.91.1", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", + "@earendil-works/pi-agent-core": "0.80.2", + "@earendil-works/pi-ai": "0.80.2", + "@earendil-works/pi-coding-agent": "0.80.2", "@hookform/resolvers": "^5.2.1", "@icons-pack/react-simple-icons": "^13.13.0", "@journeyapps/wa-sqlite": "^1.7.0", @@ -54,21 +58,27 @@ "@tauri-apps/plugin-process": "^2.3.1", "@tauri-apps/plugin-store": "^2.4.2", "@tauri-apps/plugin-updater": "^2.10.1", + "@zenfs/core": "^2.5.7", + "@zenfs/dom": "^1.2.9", "ai": "^6.0.37", "better-auth": "^1.6.9", "bson": "^6.10.4", + "buffer": "^6.0.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "dayjs": "^1.11.13", "drizzle-orm": "^0.45.2", + "events": "^3.3.0", "framer-motion": "^12.23.12", "input-otp": "^1.4.2", + "just-bash": "^3.0.2", "katex": "^0.16.0", "lucide-react": "^1.8.0", "mammoth": "^1.12.0", "maplibre-gl": "^5.24.0", "marked": "^18.0.0", + "path-browserify": "^1.0.1", "posthog-js": "^1.288.1", "react": "^19.2.1", "react-dom": "^19.2.1", @@ -171,6 +181,8 @@ "@ai-sdk/react": ["@ai-sdk/react@3.0.192", "", { "dependencies": { "@ai-sdk/provider-utils": "4.0.27", "ai": "6.0.190", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1" } }, "sha512-QB7ViYcM1o2zN6Zo1nVD1FqAkiivCPOi1vmT/OmWAxctmXUGTdWOL7MBs9q3zuzPbZpkty4xDERwemWYoZx6Kw=="], + "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.91.1", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw=="], + "@asamuzakjp/css-color": ["@asamuzakjp/css-color@5.1.11", "", { "dependencies": { "@asamuzakjp/generational-cache": "^1.0.1", "@csstools/css-calc": "^3.2.0", "@csstools/css-color-parser": "^4.1.0", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg=="], "@asamuzakjp/dom-selector": ["@asamuzakjp/dom-selector@7.1.1", "", { "dependencies": { "@asamuzakjp/generational-cache": "^1.0.1", "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", "css-tree": "^3.2.1", "is-potential-custom-element-name": "^1.0.1" } }, "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ=="], @@ -181,6 +193,56 @@ "@authenio/xml-encryption": ["@authenio/xml-encryption@2.0.2", "", { "dependencies": { "@xmldom/xmldom": "^0.8.6", "escape-html": "^1.0.3", "xpath": "0.0.32" } }, "sha512-cTlrKttbrRHEw3W+0/I609A2Matj5JQaRvfLtEIGZvlN0RaPi+3ANsMeqAyCAVlH/lUIW2tmtBlSMni74lcXeg=="], + "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], + + "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="], + + "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="], + + "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="], + + "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], + + "@aws-sdk/client-bedrock-runtime": ["@aws-sdk/client-bedrock-runtime@3.1048.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.11", "@aws-sdk/credential-provider-node": "^3.972.42", "@aws-sdk/eventstream-handler-node": "^3.972.16", "@aws-sdk/middleware-eventstream": "^3.972.12", "@aws-sdk/middleware-websocket": "^3.972.19", "@aws-sdk/token-providers": "3.1048.0", "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/fetch-http-handler": "^5.4.2", "@smithy/node-http-handler": "^4.7.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ=="], + + "@aws-sdk/core": ["@aws-sdk/core@3.974.22", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@aws-sdk/xml-builder": "^3.972.30", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.6", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-YofH63shc6YRdXjz80BJkpJW+Bkn0Cuu2dn4Rv7s9G2Idt58tgtzQEWxrR2xVljlVfIBeUjPuULnSVYLke3sUQ=="], + + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.48", "", { "dependencies": { "@aws-sdk/core": "^3.974.22", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-h6FEC95fbexUd6zxm4PdgS82bTcI2PRtUb2ZwMipb/Xr8bPwtf0G8rBo2jp7NA24Mbx2JA8/WingiYpA9RCCyw=="], + + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.50", "", { "dependencies": { "@aws-sdk/core": "^3.974.22", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/node-http-handler": "^4.7.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-lJO3OLpjvz5m/RSBQmsG/CEUGsvCy5ruxKwPQaOCqxqCMuyYT2BZwQUTDZVVwqQ9LrZKuK24JSa6r31hL/tvkg=="], + + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.972.55", "", { "dependencies": { "@aws-sdk/core": "^3.974.22", "@aws-sdk/credential-provider-env": "^3.972.48", "@aws-sdk/credential-provider-http": "^3.972.50", "@aws-sdk/credential-provider-login": "^3.972.54", "@aws-sdk/credential-provider-process": "^3.972.48", "@aws-sdk/credential-provider-sso": "^3.972.54", "@aws-sdk/credential-provider-web-identity": "^3.972.54", "@aws-sdk/nested-clients": "^3.997.22", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/credential-provider-imds": "^4.3.7", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-TBoF4buBGYhXjdZAryayY2TrkQj2B2KfE/msG4V53XCt+w0EhEwM2JRjx8p2grJ2C6gtH5++SAwEvGMRdi0yyw=="], + + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.54", "", { "dependencies": { "@aws-sdk/core": "^3.974.22", "@aws-sdk/nested-clients": "^3.997.22", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-hBWI3wZTdTGiuMfmPts6AWbAjFfRniOQnqx68tc2cQvRKWawFbN9wkLOVPWM1FAOyowZU73mC6Fi+rHSHNyLFw=="], + + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.57", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.48", "@aws-sdk/credential-provider-http": "^3.972.50", "@aws-sdk/credential-provider-ini": "^3.972.55", "@aws-sdk/credential-provider-process": "^3.972.48", "@aws-sdk/credential-provider-sso": "^3.972.54", "@aws-sdk/credential-provider-web-identity": "^3.972.54", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/credential-provider-imds": "^4.3.7", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-u6dClpzNdWf1HGWz4wwhdXi1wiOofCLniM9S4BQQGlLAN9TW7VB+ld5V533GdKrYMaFeBGFqKnj0JCYvynLqwQ=="], + + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.48", "", { "dependencies": { "@aws-sdk/core": "^3.974.22", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-w6VZwojPt12WnEkAUy6Nu4K6sWCbBmR7QX390b0nE6vRvkXbrYr9Lq9VySGkfjiMjpUA87op+J4EgvRmtWIDoQ=="], + + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.972.54", "", { "dependencies": { "@aws-sdk/core": "^3.974.22", "@aws-sdk/nested-clients": "^3.997.22", "@aws-sdk/token-providers": "3.1071.0", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-23uZpIpF2SIFDCa1fcWa202tK4gGeyvX6GIIAjiB8WBsvsVRBMnJ/7dCxHzxf7eZT7GToJg837LDIBnZsl/VUg=="], + + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.54", "", { "dependencies": { "@aws-sdk/core": "^3.974.22", "@aws-sdk/nested-clients": "^3.997.22", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-0Iv5QttS6wcATlodYKgvQj6B9Db51rx7NU9fqu0PoLeS4BIgdYMc/QK4smwLwpm5RFrs02V/eLyEFp3FklvlNQ=="], + + "@aws-sdk/eventstream-handler-node": ["@aws-sdk/eventstream-handler-node@3.972.22", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-tqPJv0dz4+O0hWGm1a6YekcMZyPhDFs/zH73Von7icaVT5n0Jqvm86typ3jRrG+qoUdPhALOnboRLTmnWQTlYQ=="], + + "@aws-sdk/middleware-eventstream": ["@aws-sdk/middleware-eventstream@3.972.18", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-OHpk8YoZi3yexPq8aFt1vN1IxA2zLKvsIR5GpWYylX/ve6kQmY7wxHNSFy/D3t2apMZ16rs76Co4dJWcDyIk3A=="], + + "@aws-sdk/middleware-websocket": ["@aws-sdk/middleware-websocket@3.972.30", "", { "dependencies": { "@aws-sdk/core": "^3.974.22", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-kH6N4f/Fzi9r/dYap8EQ+Zk4NOz8pl4AtWKhzAoG2C1/4YkIHok9APp/e+75woreWQq264n+LkrJsJVZ0Q+M1Q=="], + + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.22", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.22", "@aws-sdk/signature-v4-multi-region": "^3.996.35", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/node-http-handler": "^4.7.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-4IwtcYSxEIVw5hcp8ogq0CMbFNZFw7jJUetpfFUhFFeqsa1K8j2Ihg2hnxLyOp3stMZnXda6VzOmPi1AFZQXcg=="], + + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.35", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg=="], + + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1048.0", "", { "dependencies": { "@aws-sdk/core": "^3.974.11", "@aws-sdk/nested-clients": "^3.997.9", "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA=="], + + "@aws-sdk/types": ["@aws-sdk/types@3.973.13", "", { "dependencies": { "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg=="], + + "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.8", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g=="], + + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.30", "", { "dependencies": { "@smithy/types": "^4.14.3", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-StElZPEoBquWwNqw1AcfpzEyZqJvFxouG+mpDNYlcH6ZOrqd2CuIryv+8LV8gNHZUOyKyJF3Dq9vxaXEmDR9TQ=="], + + "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.4", "", {}, "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ=="], + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], "@babel/compat-data": ["@babel/compat-data@7.29.3", "", {}, "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg=="], @@ -237,6 +299,8 @@ "@blazediff/core": ["@blazediff/core@1.9.1", "", {}, "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA=="], + "@borewit/text-codec": ["@borewit/text-codec@0.2.2", "", {}, "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ=="], + "@bramus/specificity": ["@bramus/specificity@2.4.2", "", { "dependencies": { "css-tree": "^3.0.0" }, "bin": { "specificity": "bin/cli.js" } }, "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw=="], "@chromatic-com/storybook": ["@chromatic-com/storybook@5.2.1", "", { "dependencies": { "@neoconfetti/react": "^1.0.0", "chromatic": "16.10.0", "jsonfile": "^6.1.0", "strip-ansi": "^7.1.0" }, "peerDependencies": { "storybook": "^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 || ^10.5.0-0 || ^10.6.0-0" } }, "sha512-z6I7NJk/0VngA64y5TNYaB4Hc2X8+90n4op6lBt9PvWk5TmIlFLDqdX33rlrwbNRkkYijVgA/wO04rVYXi5Mlg=="], @@ -263,6 +327,14 @@ "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], + "@earendil-works/pi-agent-core": ["@earendil-works/pi-agent-core@0.80.2", "", { "dependencies": { "@earendil-works/pi-ai": "^0.80.2", "ignore": "7.0.5", "typebox": "1.1.38", "yaml": "2.9.0" } }, "sha512-BF9WPhixIFjT6Kp3Iz3H6ugkU+4AWotM8py96XE5pIK0arJbQKMWbR+dXSWWDEmR5yc/aFQODnuyowOEzMGO7Q=="], + + "@earendil-works/pi-ai": ["@earendil-works/pi-ai@0.80.2", "", { "dependencies": { "@anthropic-ai/sdk": "0.91.1", "@aws-sdk/client-bedrock-runtime": "3.1048.0", "@google/genai": "1.52.0", "@mistralai/mistralai": "2.2.6", "@opentelemetry/api": "1.9.0", "@smithy/node-http-handler": "4.7.3", "http-proxy-agent": "7.0.2", "https-proxy-agent": "7.0.6", "openai": "6.26.0", "partial-json": "0.1.7", "typebox": "1.1.38" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-5GNKfdrRJ4uZ5Zd9iudoXggi/BbUcKnD/xfRHtdR+7q4vWqPvfx8auFuaT+ewGBVI8K4wj87eigFQ/iCSuy9RQ=="], + + "@earendil-works/pi-coding-agent": ["@earendil-works/pi-coding-agent@0.80.2", "", { "dependencies": { "@earendil-works/pi-agent-core": "^0.80.2", "@earendil-works/pi-ai": "^0.80.2", "@earendil-works/pi-tui": "^0.80.2", "@silvia-odwyer/photon-node": "0.3.4", "chalk": "5.6.2", "cross-spawn": "7.0.6", "diff": "8.0.4", "glob": "13.0.6", "highlight.js": "10.7.3", "hosted-git-info": "9.0.3", "ignore": "7.0.5", "jiti": "2.7.0", "minimatch": "10.2.5", "proper-lockfile": "4.1.2", "semver": "7.8.0", "typebox": "1.1.38", "undici": "8.5.0", "yaml": "2.9.0" }, "optionalDependencies": { "@mariozechner/clipboard": "0.3.9" }, "bin": { "pi": "dist/cli.js" } }, "sha512-m9v7OUit0s9LklWfh61ca/XY5INjUzjtYtNZwy3cNvyjOLk3IpBgghP8aAp0iH35rLaiRwuuWiJ8t88ODMWY+A=="], + + "@earendil-works/pi-tui": ["@earendil-works/pi-tui@0.80.2", "", { "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.5" } }, "sha512-OvOAMIbXiC9OSse17YMiXIsI9AS5XM/ZV8N/k+UzdlRpPILDQYmLElevgGW92kkXR8qHBClIdzhCjuzlBGvphA=="], + "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], @@ -361,6 +433,8 @@ "@freedomofpress/tuf-browser": ["@freedomofpress/tuf-browser@0.1.11", "", { "dependencies": { "@freedomofpress/crypto-browser": "^0.1.7" } }, "sha512-d76ohB/AS5+zI+lnbiFMX/BIK3nT18hZ8q3Na6X4vyYaSYjXkeknzhAnbx1da+8ObWLwsaZLue46haEch28qtQ=="], + "@google/genai": ["@google/genai@1.52.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "p-retry": "^4.6.2", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q=="], + "@happy-dom/global-registrator": ["@happy-dom/global-registrator@20.9.0", "", { "dependencies": { "@types/node": ">=20.0.0", "happy-dom": "^20.9.0" } }, "sha512-lBW6/m5BIFl3pMuWPNN0lIOYw9LMCmPfix53ExS3FBi4E+NELEljQ3xH6aAV9IYiQRfn9YIIgzzMrD0vIcD7tw=="], "@hono/node-server": ["@hono/node-server@1.19.14", "", { "peerDependencies": { "hono": "^4" } }, "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw=="], @@ -389,6 +463,16 @@ "@inquirer/type": ["@inquirer/type@4.0.5", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q=="], + "@jitl/quickjs-ffi-types": ["@jitl/quickjs-ffi-types@0.32.0", "", {}, "sha512-v9T+GQpmk43VDJ7d72sf0Nexhk+ArvtUihW27dy7lqAl0zBObFKtSBBIm5RBjwIhE8VwsPPm9PNuvPvNqLWUEg=="], + + "@jitl/quickjs-wasmfile-debug-asyncify": ["@jitl/quickjs-wasmfile-debug-asyncify@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-EX8zbXwGqCgAE764M+qvkHtyXDi/FUoMBea0JnES7vCM3P7a2+EOZOjGv85wtZ2sJhI1oJ+nekmqpOODFDY+hw=="], + + "@jitl/quickjs-wasmfile-debug-sync": ["@jitl/quickjs-wasmfile-debug-sync@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-LeYWrPGC1uNCTBWvibo3ZLJj0CSVNYUXvJpXMCmuQ5Sap2cCACc3uvGvYV4homHHBAzfw5akoTqMMS4YFRtw+Q=="], + + "@jitl/quickjs-wasmfile-release-asyncify": ["@jitl/quickjs-wasmfile-release-asyncify@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-3oSwPfja12ICz4aIblB58cuY8JlEq5Txt8Cut4VLo+LH47QN+mzCnSgnbB03hWzg1LBcc+VyyI9UOag7a1NF+Q=="], + + "@jitl/quickjs-wasmfile-release-sync": ["@jitl/quickjs-wasmfile-release-sync@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-BKNDI/TPBfGlLNGYpLrhcDGXmIk4xHm4MRAisOBnOzpXVn9HZWsfmMAc9WMBrAHjvvds6HOikKeaOBKdPdpVrg=="], + "@joshwooding/vite-plugin-react-docgen-typescript": ["@joshwooding/vite-plugin-react-docgen-typescript@0.7.0", "", { "dependencies": { "glob": "^13.0.1", "react-docgen-typescript": "^2.2.2" }, "peerDependencies": { "typescript": ">= 4.3.x", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["typescript"] }, "sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ=="], "@journeyapps/wa-sqlite": ["@journeyapps/wa-sqlite@1.7.0", "", {}, "sha512-xQZ670aKDo4FWxIFpLqY0AGDpURr09aYIO08UkLdWvFw8C018nCiqY0ILJudGRhRdXORhv7K2xD2OXZ2QxU39w=="], @@ -423,10 +507,38 @@ "@maplibre/vt-pbf": ["@maplibre/vt-pbf@4.3.2", "", { "dependencies": { "@mapbox/point-geometry": "^1.1.0", "@types/geojson": "^7946.0.16", "pbf": "^5.1.0" } }, "sha512-j6p0AdjvAR19Z3XaCysle7A4ZSo08tYOzxD0Y9NQylwPAkwJJeYub5b2eVucdeDh7erhv69DahoLOevDRERRUw=="], + "@mariozechner/clipboard": ["@mariozechner/clipboard@0.3.9", "", { "optionalDependencies": { "@mariozechner/clipboard-darwin-arm64": "0.3.9", "@mariozechner/clipboard-darwin-universal": "0.3.9", "@mariozechner/clipboard-darwin-x64": "0.3.9", "@mariozechner/clipboard-linux-arm64-gnu": "0.3.9", "@mariozechner/clipboard-linux-arm64-musl": "0.3.9", "@mariozechner/clipboard-linux-riscv64-gnu": "0.3.9", "@mariozechner/clipboard-linux-x64-gnu": "0.3.9", "@mariozechner/clipboard-linux-x64-musl": "0.3.9", "@mariozechner/clipboard-win32-arm64-msvc": "0.3.9", "@mariozechner/clipboard-win32-x64-msvc": "0.3.9" } }, "sha512-ABnA53mdfkGZwOFUdZNv2S0CWGO/EIuPj8Vv9xmBFmSYg/qFc7ihO6q5FcQjvoE67kZpWkEc4AhD6B/os04yuA=="], + + "@mariozechner/clipboard-darwin-arm64": ["@mariozechner/clipboard-darwin-arm64@0.3.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BfgV7vCEWZwJwZJw03r6bP5+tf0iI/ANuQYCxi9RNn7FrWB3yzGuMKCrNLRl6V761vXRdL8+OqZ0wd4TqlsNOQ=="], + + "@mariozechner/clipboard-darwin-universal": ["@mariozechner/clipboard-darwin-universal@0.3.9", "", { "os": "darwin" }, "sha512-BGGR4iA9Z2shAjI65eI5xtyb3LYNlDW9X3gxKxDbqtbnREohsrqznov6zpKoIrsRWpzlYVEdKphS7ksJ0/ndSQ=="], + + "@mariozechner/clipboard-darwin-x64": ["@mariozechner/clipboard-darwin-x64@0.3.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-4kURmCbS6nt8uYhtmWpUcJWyPHfmAr5dTpXD1nO3pIfa+TSQ9DbrGOYCKH+aEFW47XhQ4Vp8ZTszie+wfFvDKg=="], + + "@mariozechner/clipboard-linux-arm64-gnu": ["@mariozechner/clipboard-linux-arm64-gnu@0.3.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-g59OkUGP2DDfCOIKypHeYgv2M55u/cKvXa5dSxFbEJ34XvIQMdcVmpKCkGUro3ZgefXiGVdwguvTMQGpHWzIXw=="], + + "@mariozechner/clipboard-linux-arm64-musl": ["@mariozechner/clipboard-linux-arm64-musl@0.3.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-AGuJdgKsmJdm4Pych7kv3sqe591ERRaAHW3xjLooiFzn8J+PxUyof++7YZrB5Y5tpnTO+K18Og3taj2NpluCRQ=="], + + "@mariozechner/clipboard-linux-riscv64-gnu": ["@mariozechner/clipboard-linux-riscv64-gnu@0.3.9", "", { "os": "linux", "cpu": "none" }, "sha512-DXBEAiuMpk7dhS1a9NzNxVAFi1vaKoPu7rQNgY8LIDLGrK3lnIp3nT10DUum+PKVJoJppIP+NAA8IZe4DMNDPw=="], + + "@mariozechner/clipboard-linux-x64-gnu": ["@mariozechner/clipboard-linux-x64-gnu@0.3.9", "", { "os": "linux", "cpu": "x64" }, "sha512-WORrMLd6EpElEME7JRKfSaY34nW1P5LbdgK5YNCS1ncG2LqmITsSMEJ8nh2mpvxb3TxqbOOKgY7k9eMJYlW9Mw=="], + + "@mariozechner/clipboard-linux-x64-musl": ["@mariozechner/clipboard-linux-x64-musl@0.3.9", "", { "os": "linux", "cpu": "x64" }, "sha512-/DHn+1DrfL6oRaPPWXaOKvonFFrni666fxd+zFqiQEfvBH0tsHVWjq9iqBk0oDp0qaPA72lIMy5BptxISBEhZQ=="], + + "@mariozechner/clipboard-win32-arm64-msvc": ["@mariozechner/clipboard-win32-arm64-msvc@0.3.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-O5FHD3ErkMwMhNzAfu3ggy0ug4z7btZuoQgwwxlzPrwV2bxlD6WDpqBY4NCgICAgZdDKdp+loUEKVAVt8aYnhQ=="], + + "@mariozechner/clipboard-win32-x64-msvc": ["@mariozechner/clipboard-win32-x64-msvc@0.3.9", "", { "os": "win32", "cpu": "x64" }, "sha512-ihQC3EufqEY81vhXBgVBtK4prL+wc62zJsSvxrgz7K1hsdt6OObz6v9p3Rn1OG3GJksTTKMJF0u/guMISHPhSA=="], + "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], + "@mistralai/mistralai": ["@mistralai/mistralai@2.2.6", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.40.0", "ws": "^8.18.0", "zod": "^3.25.0 || ^4.0.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-W8pX7zHxjJvMIpw8JMxeJEleapXX0Q9NPszdNzqkM3MIEoIGPObdodujj+WHteXEvGfaP/AMwlNyRfEzSY6dQQ=="], + + "@mixmark-io/domino": ["@mixmark-io/domino@2.2.0", "", {}, "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="], + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], + "@mongodb-js/zstd": ["@mongodb-js/zstd@7.0.0", "", { "dependencies": { "node-addon-api": "^8.5.0", "prebuild-install": "^7.1.3" } }, "sha512-mQ2s0pYYiav+tzCDR05Zptem8Ey2v8s11lri5RKGhTtL4COVCvVCk5vtyRYNT+9L8qSfyOqqefF9UtnW8mC5jA=="], + "@mswjs/interceptors": ["@mswjs/interceptors@0.41.9", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w=="], "@napi-rs/canvas": ["@napi-rs/canvas@0.1.100", "", { "optionalDependencies": { "@napi-rs/canvas-android-arm64": "0.1.100", "@napi-rs/canvas-darwin-arm64": "0.1.100", "@napi-rs/canvas-darwin-x64": "0.1.100", "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.100", "@napi-rs/canvas-linux-arm64-gnu": "0.1.100", "@napi-rs/canvas-linux-arm64-musl": "0.1.100", "@napi-rs/canvas-linux-riscv64-gnu": "0.1.100", "@napi-rs/canvas-linux-x64-gnu": "0.1.100", "@napi-rs/canvas-linux-x64-musl": "0.1.100", "@napi-rs/canvas-win32-arm64-msvc": "0.1.100", "@napi-rs/canvas-win32-x64-msvc": "0.1.100" } }, "sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA=="], @@ -465,6 +577,8 @@ "@noble/post-quantum": ["@noble/post-quantum@0.6.1", "", { "dependencies": { "@noble/ciphers": "~2.2.0", "@noble/curves": "~2.2.0", "@noble/hashes": "~2.2.0" } }, "sha512-+pormrDZwjRw05U8ADK4JpHejo87+gBd+muRBB/ozztH5yhDLMDF4jHQWN3NQQAsu1zBNPWTG0ZwVI0CR29H0A=="], + "@nodable/entities": ["@nodable/entities@2.2.0", "", {}, "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg=="], + "@open-draft/deferred-promise": ["@open-draft/deferred-promise@3.0.0", "", {}, "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA=="], "@open-draft/logger": ["@open-draft/logger@0.3.0", "", { "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" } }, "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ=="], @@ -745,12 +859,32 @@ "@scure/bip39": ["@scure/bip39@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0", "@scure/base": "2.2.0" } }, "sha512-T/Bj/YvYMNkIPq6EENO6/rcs2e7qTNuyoUXf0KBFDmp0ZDu0H2X4Lq6yC3i0c8PcWkov5EbW+yQZZbdMmk154A=="], + "@silvia-odwyer/photon-node": ["@silvia-odwyer/photon-node@0.3.4", "", {}, "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA=="], + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], "@sinonjs/fake-timers": ["@sinonjs/fake-timers@15.4.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA=="], "@size-limit/file": ["@size-limit/file@12.1.0", "", { "peerDependencies": { "size-limit": "12.1.0" } }, "sha512-eGwDcIufnNnvJRzv3liDOn6MAOGgmOTUdpeGQ2KuRTlgIgO54AJH1ilvktlJc6PIjNfwpYY0dOGyap1QgM1swQ=="], + "@smithy/core": ["@smithy/core@3.25.1", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-zpDbpXBCBsxfLtG2GEUyfgvHvSFrw5CwDZSNzL0v52gx/c3oPlPbm+7W7num8xs6vyiUBn+bvYPHcQDOXZynCQ=="], + + "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.4.1", "", { "dependencies": { "@smithy/core": "^3.25.1", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-TSAF5NHgxEsllbErYWbK8aLnl5L601NGc5VYJlSPsKnf3YlkhdoBN+geGcaU00oiw2OK3QO5LA3QNXiiWhCidQ=="], + + "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.5.1", "", { "dependencies": { "@smithy/core": "^3.25.1", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-96JrD1q71anokymx9Iblb+zKmNQYNstlV/25A9ZYIJ2A0rp1r7/GZAIm0bDWSmVvz3DpNOCZuabzsiL+w0UHhw=="], + + "@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.7.3", "", { "dependencies": { "@smithy/core": "^3.24.3", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA=="], + + "@smithy/signature-v4": ["@smithy/signature-v4@5.5.1", "", { "dependencies": { "@smithy/core": "^3.25.1", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-X9rVls3En0z3NtrmguTmpRM0/NqtWUxBjal6fcAkwtsub+gOdLZ6kD+V7xhUgFMGdG14bHbZ7M5QjaRI1+DatQ=="], + + "@smithy/types": ["@smithy/types@4.15.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg=="], + + "@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + + "@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], @@ -867,6 +1001,10 @@ "@tinfoilsh/verifier": ["@tinfoilsh/verifier@1.1.4", "", { "dependencies": { "@freedomofpress/crypto-browser": "^0.1.7", "@freedomofpress/sigstore-browser": "^0.1.11", "@freedomofpress/tuf-browser": "^0.1.8" } }, "sha512-fcO0shcAIPBUG6xrWifsSF01motVa4fpma820FbgTtHzuaivoXzfeArylDXWlRcd+KWxn0wipVj0OCyjFMOr7w=="], + "@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="], + + "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], @@ -917,6 +1055,8 @@ "@types/resolve": ["@types/resolve@1.20.6", "", {}, "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ=="], + "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="], + "@types/set-cookie-parser": ["@types/set-cookie-parser@2.4.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw=="], "@types/sinonjs__fake-timers": ["@types/sinonjs__fake-timers@15.0.1", "", {}, "sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w=="], @@ -981,12 +1121,22 @@ "@xmldom/xmldom": ["@xmldom/xmldom@0.8.13", "", {}, "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw=="], + "@xterm/xterm": ["@xterm/xterm@5.5.0", "", {}, "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A=="], + + "@zenfs/core": ["@zenfs/core@2.5.7", "", { "dependencies": { "@types/node": "^25.2.0", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "kerium": "^1.3.4", "memium": "^0.4.0", "readable-stream": "^4.5.2", "utilium": "^3.0.0" }, "bin": { "make-index": "scripts/make-index.js", "zenfs-test": "scripts/test.js", "zci": "scripts/ci-cli.js" } }, "sha512-g3C86mvi91Q2JuzGOwjG83tqEvZ0sl94wtw6AdUvEuRYocovFU3BwGrMobhg3ecvMQlVbqMJHaoA+jZgJ4duig=="], + + "@zenfs/dom": ["@zenfs/dom@1.2.9", "", { "peerDependencies": { "@zenfs/core": "^2.3.11", "kerium": "^1.3.4", "utilium": "^3.0.0" } }, "sha512-+fVY9XDDml/aYCe9BC2LByM4vHZNXOIfTvuR19r78rV4BxWBy8fgc8GLmO2tHsdKe+nTiyaNt5F7qid55So42Q=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + "ai": ["ai@6.0.190", "", { "dependencies": { "@ai-sdk/gateway": "3.0.119", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@opentelemetry/api": "^1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T+ixHbWZ6jmHRREpVVJTkFyWJeCekCdzLPan7lp1F32jG5OUw4+odlVYjtMRXVzogU+pWzpMmXdRiHUmdL/q0w=="], "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], @@ -999,6 +1149,8 @@ "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + "anynum": ["anynum@1.0.1", "", {}, "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A=="], + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], @@ -1049,16 +1201,26 @@ "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="], + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + "bluebird": ["bluebird@3.4.7", "", {}, "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA=="], "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], + "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], + "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "browserslist": ["browserslist@4.28.2", "", { "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" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], "bson": ["bson@6.10.4", "", {}, "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng=="], + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], @@ -1081,6 +1243,8 @@ "chai": ["chai@5.3.3", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="], + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], @@ -1091,6 +1255,8 @@ "check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="], + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + "chromatic": ["chromatic@16.10.0", "", { "dependencies": { "semver": "^7.3.5" }, "peerDependencies": { "@chromatic-com/cypress": "^0.*.* || ^1.0.0", "@chromatic-com/playwright": "^0.*.* || ^1.0.0", "@chromatic-com/vitest": "^0.*.* || ^1.0.0" }, "optionalPeers": ["@chromatic-com/cypress", "@chromatic-com/playwright", "@chromatic-com/vitest"], "bin": { "chroma": "dist/bin.cjs", "chromatic": "dist/bin.cjs", "chromatic-cli": "dist/bin.cjs" } }, "sha512-nFsztmnu7rFiGafUJgXvLUNpqmRylz92eNvzBoJNTKKQj4EQUyxznwnfpf1dTs7hXtWD8JwcH92jADydaHA1sw=="], "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], @@ -1145,6 +1311,8 @@ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], + "data-urls": ["data-urls@7.0.0", "", { "dependencies": { "whatwg-mimetype": "^5.0.0", "whatwg-url": "^16.0.0" } }, "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA=="], "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], @@ -1161,8 +1329,12 @@ "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], @@ -1187,6 +1359,8 @@ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], + "dingbat-to-unicode": ["dingbat-to-unicode@1.0.1", "", {}, "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w=="], "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], @@ -1207,6 +1381,8 @@ "earcut": ["earcut@3.0.2", "", {}, "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ=="], + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], "ehbp": ["ehbp@0.2.0", "", { "dependencies": { "@panva/hpke-noble": "^1.0.3", "hpke": "^1.0.1" } }, "sha512-hYkeupwvY0S1h9RpcrCD8pAgc6yfxfMqbI0y6khtS+ZNEByZAf116LTA6aBFB2JJQFsUaOEO7convZVrVhyeZA=="], @@ -1219,6 +1395,8 @@ "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + "enhanced-resolve": ["enhanced-resolve@5.21.6", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ=="], "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], @@ -1285,12 +1463,18 @@ "event-iterator": ["event-iterator@2.0.0", "", {}, "sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ=="], + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], "eventsource-parser": ["eventsource-parser@3.0.8", "", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="], + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], @@ -1313,12 +1497,20 @@ "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], + "fast-xml-builder": ["fast-xml-builder@1.2.0", "", { "dependencies": { "path-expression-matcher": "^1.5.0", "xml-naming": "^0.1.0" } }, "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q=="], + + "fast-xml-parser": ["fast-xml-parser@5.9.3", "", { "dependencies": { "@nodable/entities": "^2.2.0", "fast-xml-builder": "^1.2.0", "is-unsafe": "^1.0.1", "path-expression-matcher": "^1.5.0", "strnum": "^2.4.1", "xml-naming": "^0.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-brCNCeScma/kqa54J4PIDriSSSLssRkuYaUCpvHJulGc3HGI/xxKUCTDcYkAdqJsyb//ydpbxecjC3hB9+tb/g=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + "fflate": ["fflate@0.4.8", "", {}, "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="], "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "file-type": ["file-type@21.3.4", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g=="], + "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], @@ -1329,12 +1521,16 @@ "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], "framer-motion": ["framer-motion@12.40.0", "", { "dependencies": { "motion-dom": "^12.40.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg=="], "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -1343,6 +1539,10 @@ "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + "gaxios": ["gaxios@7.1.5", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2" } }, "sha512-5FZy72Rh8LhtjmvDrKkI+lVhrsQrVKVsItxMoDm5mNQE+xR0WVIIs+jzPSJgBvKVsLi24fZhXJIsNI0bihDzFg=="], + + "gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="], + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], @@ -1361,6 +1561,8 @@ "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + "gl-matrix": ["gl-matrix@3.4.4", "", {}, "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ=="], "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], @@ -1371,6 +1573,10 @@ "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + "google-auth-library": ["google-auth-library@10.7.0", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^7.1.4", "gcp-metadata": "8.1.2", "google-logging-utils": "1.1.3", "jws": "^4.0.0" } }, "sha512-QpTAbNJ36TliZLx3TTtahR8HG0hN9RllL1e3FymOvQSIKK8JmgV58H924ub2wa2DsS3ANjjP1Aw1N+Ramc8hqQ=="], + + "google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="], + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], @@ -1419,8 +1625,12 @@ "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], + "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], + "hono": ["hono@4.12.21", "", {}, "sha512-uV63apnb0kyPtAUwoWgaGh9HyIFcv8lgmzPZSiTBQAFOFGIzka5EZ1dZocmGnn0XdX0+XTqJ6Tqv7selMuGLRQ=="], + "hosted-git-info": ["hosted-git-info@9.0.3", "", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg=="], + "hpke": ["hpke@1.1.1", "", {}, "sha512-FOx9R77nOSAWuKPoHDC3oWSslpjgaIaxl9W3ZaXuT/XRIwRioNGzSpoJuXOkR74oJw0lScvwHDSZUNOqtkUiGQ=="], "html-encoding-sniffer": ["html-encoding-sniffer@6.0.0", "", { "dependencies": { "@exodus/bytes": "^1.6.0" } }, "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg=="], @@ -1431,10 +1641,16 @@ "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], @@ -1445,6 +1661,8 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], "input-otp": ["input-otp@1.4.2", "", { "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA=="], @@ -1519,6 +1737,8 @@ "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + "is-unsafe": ["is-unsafe@1.0.1", "", {}, "sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA=="], + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], @@ -1551,10 +1771,14 @@ "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + "json-schema-to-ts": ["json-schema-to-ts@3.1.1", "", { "dependencies": { "@babel/runtime": "^7.18.3", "ts-algebra": "^2.0.0" } }, "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g=="], + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], @@ -1571,10 +1795,18 @@ "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], + "just-bash": ["just-bash@3.0.2", "", { "dependencies": { "diff": "^8.0.2", "fast-xml-parser": "^5.7.3", "file-type": "^21.2.0", "ini": "^6.0.0", "minimatch": "^10.1.1", "modern-tar": "^0.7.3", "papaparse": "^5.5.3", "quickjs-emscripten": "^0.32.0", "re2js": "^1.2.1", "seek-bzip": "^2.0.0", "smol-toml": "^1.6.0", "sprintf-js": "^1.1.3", "sql.js": "^1.13.0", "turndown": "^7.2.2", "yaml": "^2.8.2" }, "optionalDependencies": { "@mongodb-js/zstd": "^7.0.0", "node-liblzma": "^2.0.3" }, "bin": { "just-bash": "dist/bin/just-bash.js", "just-bash-shell": "dist/bin/shell/shell.js" } }, "sha512-uY8LMD2NpADp1HlYUcZSw9ffuq0tRhW76sg8xkeo+ZRDMu7mbekWbKbYDWquazVVi7pqpGZlic/liMFktQKy6w=="], + + "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], + + "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="], + "katex": ["katex@0.16.47", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg=="], "kdbush": ["kdbush@4.1.0", "", {}, "sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ=="], + "kerium": ["kerium@1.3.9", "", { "dependencies": { "utilium": "^3.0.0" } }, "sha512-uoiTcutvUOjOpck8mmUUq7EsuNPhdfFoYMVehLmJGfdLmWC3nABU8KB63MQM0ydkAM4q+2zZmRIKovbx2LF8iA=="], + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], "kysely": ["kysely@0.28.17", "", {}, "sha512-nbD8lB9EB3wNdMhOCdx5Li8DxnLbvKByylRLcJ1h+4SkrowVeECAyZlyiKMThF7xFdRz0jSQ2MoJr+wXux2y0Q=="], @@ -1689,6 +1921,8 @@ "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + "memium": ["memium@0.4.5", "", { "dependencies": { "kerium": "^1.3.2", "utilium": "^3.0.0" } }, "sha512-mnmHWWlcyKnkKSSU0qL1Jsg+CsoikVZ2xsOatAN89R+j4V3m3WlQr0nUoqcjKDyUVF5ZGdNinRiZGVd+7A+TJQ=="], + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], "merge-refs": ["merge-refs@2.0.0", "", { "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-3+B21mYK2IqUWnd2EivABLT7ueDhb0b8/dGK8LoFQPrU61YITeCMn14F7y7qZafWNZhUEKb24cJdiT5Wxs3prg=="], @@ -1757,6 +1991,8 @@ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], @@ -1765,6 +2001,10 @@ "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + + "modern-tar": ["modern-tar@0.7.6", "", {}, "sha512-sweCIVXzx1aIGTCdzcMlSZt1h8k5Tmk08VNAuRk3IU28XamGiOH5ypi11g6De2CH7PhYqSSnGy2A/EFhbWnVKg=="], + "motion-dom": ["motion-dom@12.40.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg=="], "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="], @@ -1785,12 +2025,26 @@ "nanostores": ["nanostores@1.3.0", "", {}, "sha512-XPUa/jz+P1oJvN9VBxw4L9MtdFfaH3DAryqPssqhb2kXjmb9npz0dly6rCsgFWOPr4Yg9mTfM3MDZgZZ+7A3lA=="], + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + "node-abi": ["node-abi@3.92.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ=="], + + "node-addon-api": ["node-addon-api@8.8.0", "", {}, "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA=="], + + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + "node-exports-info": ["node-exports-info@1.6.0", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw=="], + "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + + "node-liblzma": ["node-liblzma@2.2.0", "", { "dependencies": { "node-addon-api": "^8.5.0", "node-gyp-build": "^4.8.4" }, "bin": { "nxz": "lib/cli/nxz.js" } }, "sha512-s0KzNOWwOJJgPG6wxg6cKohnAl9Wk/oW1KrQaVzJBjQwVcUGPQCzpR46Ximygjqj/3KhOrtJXnYMp/xYAXp75g=="], + "node-releases": ["node-releases@2.0.45", "", {}, "sha512-iIbHXV9eBB2nB0wa7oTsrrXq+qQt+9SIlx9AX3T96YgobtEQfis5n6TJ6vV+3QP8DwdriEAcGhARaFCu37peBg=="], "node-rsa": ["node-rsa@1.1.1", "", { "dependencies": { "asn1": "^0.2.4" } }, "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw=="], @@ -1821,7 +2075,7 @@ "open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], - "openai": ["openai@6.38.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-AoMplt2UalrpgUDMh3L09QWjNRlgJPipclQvA6sYAaeF6nHNBMgmikAZGmcYLn8on4d9sQY9Q8bOLfrBS7Lc8g=="], + "openai": ["openai@6.26.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA=="], "option": ["option@0.2.4", "", {}, "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A=="], @@ -1839,16 +2093,26 @@ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="], + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "papaparse": ["papaparse@5.5.4", "", {}, "sha512-SwzWD9gl/ElwYLCI0nUja1mFJzjq2D8ziShfNBa7zCHzkOozeOGDwHWQ+tvCzEZcewecWZ5U7kUopDnG+DFYEQ=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], "parse5": ["parse5@8.0.1", "", { "dependencies": { "entities": "^8.0.0" } }, "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw=="], "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + "partial-json": ["partial-json@0.1.7", "", {}, "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA=="], + + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-expression-matcher": ["path-expression-matcher@1.6.0", "", {}, "sha512-e5y7RCLHKjemsgQ4eqGJtPyr10ILz25HO7flzxhTV8bgvd5yHx98DGtCAtbVW9f2TqnYI/gEVZd+vz7snrdPTw=="], + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -1891,16 +2155,22 @@ "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], "protobufjs": ["protobufjs@7.6.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.3.2" } }, "sha512-LtESOsMPTZgyYtwxhvdgdjGL0HmXEaRA/hVD6sol4zA60hVXXXP/SGmxnqDbgGE8gy7pYex7cym+5vYPcmaXBQ=="], @@ -1909,18 +2179,28 @@ "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="], "query-selector-shadow-dom": ["query-selector-shadow-dom@1.0.1", "", {}, "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw=="], + "quickjs-emscripten": ["quickjs-emscripten@0.32.0", "", { "dependencies": { "@jitl/quickjs-wasmfile-debug-asyncify": "0.32.0", "@jitl/quickjs-wasmfile-debug-sync": "0.32.0", "@jitl/quickjs-wasmfile-release-asyncify": "0.32.0", "@jitl/quickjs-wasmfile-release-sync": "0.32.0", "quickjs-emscripten-core": "0.32.0" } }, "sha512-So0Sqw869y/S2oE3Nuc0uT3Dhqgvsj8FSrwBdsuTosVsG8ME5/OcudU1GxsrIFdFABgy17GHnTVO9TYV/bLQcA=="], + + "quickjs-emscripten-core": ["quickjs-emscripten-core@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-QFnPfjFey8EqknSrSxe1hZrf1/8z7/6s1QzGOmKo6++02r7QRRX7ZoyNaZh7JuVjWsVW87KnQrbZqnHkOAzUyg=="], + "quickselect": ["quickselect@3.0.0", "", {}, "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="], "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "re2js": ["re2js@1.4.0", "", {}, "sha512-KTOIcZTSOpOxbu3i0+T6mFQ6tkxXKlTxfcMFs1trQbsMnG84qNq+DjXr8Afu+FEFjvF1NNlldpC7roPyazFI8g=="], + "react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="], "react-docgen": ["react-docgen@8.0.3", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.2", "@types/babel__core": "^7.20.5", "@types/babel__traverse": "^7.20.7", "@types/doctrine": "^0.0.9", "@types/resolve": "^1.20.2", "doctrine": "^3.0.0", "resolve": "^1.22.1", "strip-indent": "^4.0.0" } }, "sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w=="], @@ -1947,7 +2227,7 @@ "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], - "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], @@ -1981,6 +2261,8 @@ "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + "rettime": ["rettime@0.11.11", "", {}, "sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ=="], "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], @@ -2013,6 +2295,8 @@ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "seek-bzip": ["seek-bzip@2.0.0", "", { "dependencies": { "commander": "^6.0.0" }, "bin": { "seek-bunzip": "bin/seek-bunzip", "seek-table": "bin/seek-bzip-table" } }, "sha512-SMguiTnYrhpLdk3PwfzHeotrcwi8bNV4iemL9tx9poR/yeaMYwB9VzR1w7b57DuWpuqR8n6oZboi0hj3AxZxQg=="], + "semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], @@ -2045,7 +2329,11 @@ "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], "sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="], @@ -2053,6 +2341,8 @@ "slice-ansi": ["slice-ansi@8.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" } }, "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg=="], + "smol-toml": ["smol-toml@1.6.1", "", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="], + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -2061,7 +2351,9 @@ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], - "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + + "sql.js": ["sql.js@1.14.1", "", {}, "sha512-gcj8zBWU5cFsi9WUP+4bFNXAyF1iRpA3LLyS/DP5xlrNzGmPIizUeBggKa8DbDwdqaKwUcTEnChtd2grWo/x/A=="], "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], @@ -2089,7 +2381,7 @@ "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], - "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], @@ -2099,6 +2391,12 @@ "strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "strnum": ["strnum@2.4.1", "", { "dependencies": { "anynum": "^1.0.1" } }, "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg=="], + + "strtok3": ["strtok3@10.3.5", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA=="], + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], @@ -2121,6 +2419,10 @@ "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], + "tar-fs": ["tar-fs@2.1.4", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + "throttleit": ["throttleit@2.1.0", "", {}, "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw=="], "tinfoil": ["tinfoil@1.1.4", "", { "dependencies": { "@ai-sdk/openai-compatible": "^2.0.26", "@freedomofpress/sigstore-browser": "^0.1.11", "@tinfoilsh/verifier": "1.1.4", "ehbp": "^0.2.0", "openai": "^6.17.0" }, "peerDependencies": { "ai": "^6.0.69" }, "optionalPeers": ["ai"] }, "sha512-Ris0RaWb5uu+N02CX0LPhi4LwUiMoyEGUpxTF6CsTWWz6ThT9Z7P1VXoXwLwriuJnzePh/cwRA71UCULwoEmJg=="], @@ -2145,6 +2447,8 @@ "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + "token-types": ["token-types@6.1.2", "", { "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww=="], + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], "tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="], @@ -2155,6 +2459,8 @@ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + "ts-algebra": ["ts-algebra@2.0.0", "", {}, "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="], + "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], @@ -2165,6 +2471,10 @@ "tsx": ["tsx@4.22.3", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg=="], + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "turndown": ["turndown@7.2.4", "", { "dependencies": { "@mixmark-io/domino": "^2.2.0" } }, "sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ=="], + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], @@ -2173,6 +2483,8 @@ "type-is": ["type-is@2.1.0", "", { "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA=="], + "typebox": ["typebox@1.1.38", "", {}, "sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA=="], + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], @@ -2183,6 +2495,8 @@ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], "underscore": ["underscore@1.13.8", "", {}, "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ=="], @@ -2227,6 +2541,8 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "utilium": ["utilium@3.4.0", "", { "dependencies": { "eventemitter3": "^5.0.1" }, "optionalDependencies": { "@xterm/xterm": "^5.5.0" }, "bin": { "lice": "scripts/lice.js" } }, "sha512-z4PavqKX0P4XB9SKtXRWWBCDyoDxV6vmTEH4WDBN1/lrYf6MDVk+gntCY6YbryOKjBHGIsYHOS6BTzHf5cF9vQ=="], + "uuid": ["uuid@14.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg=="], "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], @@ -2251,6 +2567,8 @@ "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + "web-vitals": ["web-vitals@5.2.0", "", {}, "sha512-i2z98bEmaCqSDiHEDu+gHl/dmR4Q+TxFmG3/13KkMO+o8UxQzCqWaDRCiLgEa41nlO4VpXSI0ASa1xWmO9sBlA=="], "webidl-conversions": ["webidl-conversions@8.0.1", "", {}, "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ=="], @@ -2291,6 +2609,8 @@ "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], + "xml-naming": ["xml-naming@0.1.0", "", {}, "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw=="], + "xmlbuilder": ["xmlbuilder@10.1.1", "", {}, "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg=="], "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], @@ -2321,16 +2641,32 @@ "@authenio/xml-encryption/xpath": ["xpath@0.0.32", "", {}, "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw=="], + "@aws-sdk/credential-provider-http/@smithy/node-http-handler": ["@smithy/node-http-handler@4.8.1", "", { "dependencies": { "@smithy/core": "^3.25.1", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-emtXvoky671puri18ETf64AFIQUGIEA093F2drXpBgB0OGnBLjcwNR3CA2mYu62IAqNsS56xa5lnTxAgPq7cjw=="], + + "@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1071.0", "", { "dependencies": { "@aws-sdk/core": "^3.974.22", "@aws-sdk/nested-clients": "^3.997.22", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-4LDW2Qob6LoLFuqYSYZq2AyTE9koSE9+i+n5UZcm10GpmQOK0zRD9L4uYlzItiTKksIWgC/qMFChAi3RvKYtMg=="], + + "@aws-sdk/nested-clients/@smithy/node-http-handler": ["@smithy/node-http-handler@4.8.1", "", { "dependencies": { "@smithy/core": "^3.25.1", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-emtXvoky671puri18ETf64AFIQUGIEA093F2drXpBgB0OGnBLjcwNR3CA2mYu62IAqNsS56xa5lnTxAgPq7cjw=="], + + "@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="], + "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "@earendil-works/pi-ai/@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + + "@earendil-works/pi-coding-agent/undici": ["undici@8.5.0", "", {}, "sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg=="], + + "@earendil-works/pi-tui/marked": ["marked@18.0.5", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w=="], + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "@freedomofpress/crypto-browser/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + "@inquirer/core/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "@maplibre/maplibre-gl-style-spec/@mapbox/unitbezier": ["@mapbox/unitbezier@1.0.0", "", {}, "sha512-fqd515fjBmANKGGsQ286E2Wvj/XvDFpGzwJxq4CI6jMQue6Oy04uCKp+JWKF00xRTmk6cEu1jPJ9p3xqH8YWqQ=="], "@maplibre/vt-pbf/pbf": ["pbf@5.1.0", "", { "dependencies": { "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-Wv0yo0+uZepnoNEKsquhar1F18LogB8oeEikIhUXG16udbiXG7JecHGySwoo6kuMgjmbQYzdrTZlO+/K9t8eZg=="], @@ -2403,10 +2739,16 @@ "ajv-formats/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], + "argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + "ast-v8-to-istanbul/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], "better-call/set-cookie-parser": ["set-cookie-parser@3.1.0", "", {}, "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw=="], + "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "cli-truncate/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -2417,6 +2759,8 @@ "data-urls/whatwg-mimetype": ["whatwg-mimetype@5.0.0", "", {}, "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw=="], + "ecdsa-sig-formatter/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-plugin-react/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], @@ -2431,6 +2775,12 @@ "jsdom/whatwg-mimetype": ["whatwg-mimetype@5.0.0", "", {}, "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw=="], + "jszip/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "jwa/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "jws/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], @@ -2441,6 +2791,8 @@ "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + "p-retry/retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], "parse5/entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], @@ -2449,10 +2801,14 @@ "pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + "react-docgen/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], "redent/strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + "restore-cursor/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "rolldown/@oxc-project/types": ["@oxc-project/types@0.132.0", "", {}, "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ=="], "router/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], @@ -2461,16 +2817,26 @@ "safe-push-apply/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + "seek-bzip/commander": ["commander@6.2.1", "", {}, "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "tinfoil/openai": ["openai@6.38.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-AoMplt2UalrpgUDMh3L09QWjNRlgJPipclQvA6sYAaeF6nHNBMgmikAZGmcYLn8on4d9sQY9Q8bOLfrBS7Lc8g=="], + "tsx/esbuild": ["esbuild@0.28.0", "", { "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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw=="], "tsx/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "tunnel-agent/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], @@ -2547,6 +2913,8 @@ "hast-util-from-html/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + "jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], diff --git a/bunfig.toml b/bunfig.toml index 3930394d5..d06512a11 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -1,5 +1,16 @@ [install] minimumReleaseAge = 604800 # 7 days in seconds +# The Pi harness packages (the in-browser agent engine) are actively released and +# pinned to an exact version (0.80.2), so the 7-day quarantine — meant to avoid +# auto-pulling brand-new floating versions — would otherwise block this exact pin. +# Scope the exemption to the `@earendil-works/*` packages only; the global +# quarantine stays in force for every other dependency. +minimumReleaseAgeExcludes = [ + "@earendil-works/pi-agent-core", + "@earendil-works/pi-ai", + "@earendil-works/pi-coding-agent", + "@earendil-works/pi-tui", +] [test] preload = ["./happydom.ts", "./src/testing-library.ts"] diff --git a/package.json b/package.json index 9251bbe78..81f7da565 100644 --- a/package.json +++ b/package.json @@ -61,9 +61,13 @@ "@ai-sdk/openai": "^3.0.11", "@ai-sdk/openai-compatible": "^2.0.12", "@ai-sdk/react": "^3.0.39", + "@anthropic-ai/sdk": "0.91.1", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", + "@earendil-works/pi-agent-core": "0.80.2", + "@earendil-works/pi-ai": "0.80.2", + "@earendil-works/pi-coding-agent": "0.80.2", "@hookform/resolvers": "^5.2.1", "@icons-pack/react-simple-icons": "^13.13.0", "@journeyapps/wa-sqlite": "^1.7.0", @@ -104,21 +108,27 @@ "@tauri-apps/plugin-process": "^2.3.1", "@tauri-apps/plugin-store": "^2.4.2", "@tauri-apps/plugin-updater": "^2.10.1", + "@zenfs/core": "^2.5.7", + "@zenfs/dom": "^1.2.9", "ai": "^6.0.37", "better-auth": "^1.6.9", "bson": "^6.10.4", + "buffer": "^6.0.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "dayjs": "^1.11.13", "drizzle-orm": "^0.45.2", + "events": "^3.3.0", "framer-motion": "^12.23.12", "input-otp": "^1.4.2", + "just-bash": "^3.0.2", "katex": "^0.16.0", "lucide-react": "^1.8.0", "mammoth": "^1.12.0", "maplibre-gl": "^5.24.0", "marked": "^18.0.0", + "path-browserify": "^1.0.1", "posthog-js": "^1.288.1", "react": "^19.2.1", "react-dom": "^19.2.1", diff --git a/shared/agent-core/anthropic-model.ts b/shared/agent-core/anthropic-model.ts new file mode 100644 index 000000000..5a5db2458 --- /dev/null +++ b/shared/agent-core/anthropic-model.ts @@ -0,0 +1,192 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Builds a Pi-compatible Anthropic model whose HTTP goes through an injected + * `fetch`. This is the seam the in-browser embed needs: the app must route LLM + * calls through its CORS proxy via a custom fetch, but Pi's built-in anthropic + * provider constructs its `@anthropic-ai/sdk` client without a `fetch` hook. + * + * The `@anthropic-ai/sdk` constructor *does* accept `fetch`, and Pi's + * `anthropic-messages` API exposes a public `client?: Anthropic` option that + * skips internal client construction. So we build the SDK client ourselves with + * the injected fetch and hand it to Pi via that option — no fork of Pi. + * + * The one wrinkle: the harness drives streaming through `Models.streamSimple`, + * and Pi's `streamSimple` rebuilds its options via `buildBaseOptions`, which + * drops the `client` field. Only the full `stream` entry point honors `client`. + * So this module re-implements Pi's thin simple→full options bridge (reusing + * Pi's own exported `buildBaseOptions`/`adjustMaxTokensForThinking`) and injects + * the pre-built client into the full `stream` call. + * + * Header fidelity note: handing Pi a pre-built client bypasses its per-request + * header logic. We restore the two static headers that matter for the browser + * (`accept`, `anthropic-dangerous-direct-browser-access`). The only per-request + * header lost for tool-using runs is the `fine-grained-tool-streaming` beta + * (incremental tool-arg streaming — UX only, not correctness). The interleaved- + * thinking beta is irrelevant here: every adaptive model (e.g. claude-opus-4-8) + * has it built in and Pi skips that header for them anyway. + */ + +import Anthropic from '@anthropic-ai/sdk' +import { + type Api, + type AnthropicEffort, + type AnthropicOptions, + type Model, + type Models, + type ProviderStreams, + type SimpleStreamOptions, + type ThinkingLevel, + createModels, + createProvider, + envApiKeyAuth, + hasApi, +} from '@earendil-works/pi-ai' +import { stream as anthropicStream } from '@earendil-works/pi-ai/api/anthropic-messages' +import { adjustMaxTokensForThinking, buildBaseOptions } from '@earendil-works/pi-ai/api/simple-options' +import { builtinModels } from '@earendil-works/pi-ai/providers/all' + +/** Provider id of the resolved model; matches Pi's built-in anthropic provider. */ +const PROVIDER = 'anthropic' +const API = 'anthropic-messages' + +/** Valid adaptive-thinking effort levels, used to narrow catalog overrides. */ +const EFFORTS: readonly AnthropicEffort[] = ['low', 'medium', 'high', 'xhigh', 'max'] + +/** + * Minimal fetch shape every request is routed through. The app passes its proxy + * fetch (`FetchFn` from `src/lib/proxy-fetch.ts`, which additionally carries a + * `preconnect` method); a bare global fetch also satisfies this. Declared + * structurally — rather than as `typeof globalThis.fetch` — to dodge the + * Bun-vs-DOM `preconnect` signature clash that `typeof fetch` triggers when both + * type roots are loaded (the same reason `proxy-fetch.ts` pins its own `FetchFn` + * alias). Assignable to `@anthropic-ai/sdk`'s `Fetch` option, and every proxy + * fetch is assignable to it. + */ +export type AgentFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise + +/** Inputs for {@link buildAnthropicModel}. */ +export type BuildAnthropicModelOptions = { + /** Anthropic API key (used to build the SDK client; HTTP still flows through `fetch`). */ + readonly apiKey: string + /** The fetch implementation every request is routed through (e.g. the app's proxy fetch). */ + readonly fetch: AgentFetch + /** Anthropic model id to resolve, e.g. `claude-opus-4-8`. */ + readonly modelId: string +} + +/** + * Narrows a dispatched `Model` to the anthropic-messages model this + * provider exclusively serves, surfacing misuse loudly rather than guessing. + */ +const requireAnthropic = (model: Model): Model => { + if (!hasApi(model, API)) { + throw new Error(`Expected an "${API}" model, got "${model.api}".`) + } + return model +} + +/** + * Maps a Pi thinking level to an Anthropic adaptive-thinking effort, honoring a + * model's `thinkingLevelMap` override (e.g. opus models remap `xhigh`). Mirrors + * Pi's internal mapping, which is not exported. + */ +const mapThinkingLevelToEffort = (model: Model, level: ThinkingLevel): AnthropicEffort => { + const mapped = model.thinkingLevelMap?.[level] + // `EFFORTS.find` validates the catalog override as a real effort (type-safe, + // no cast). Every Anthropic catalog override is valid, so this matches Pi. + const override = typeof mapped === 'string' ? EFFORTS.find((effort) => effort === mapped) : undefined + if (override) return override + if (level === 'minimal' || level === 'low') return 'low' + if (level === 'medium') return 'medium' + return 'high' +} + +/** + * Re-implements Pi's `streamSimple` simple→full bridge so the `client` survives + * into the full `stream` call. Reuses Pi's exported helpers for the parts that + * are exported; only the (unexported) effort mapping is reproduced above. + */ +const toFullAnthropicOptions = (model: Model, options?: SimpleStreamOptions): AnthropicOptions => { + const base = buildBaseOptions(model, options, options?.apiKey) + if (!options?.reasoning) { + return { ...base, thinkingEnabled: false } + } + if (model.compat?.forceAdaptiveThinking === true) { + return { ...base, thinkingEnabled: true, effort: mapThinkingLevelToEffort(model, options.reasoning) } + } + const adjusted = adjustMaxTokensForThinking( + base.maxTokens, + model.maxTokens, + options.reasoning, + options.thinkingBudgets, + ) + return { + ...base, + maxTokens: adjusted.maxTokens, + thinkingEnabled: true, + thinkingBudgetTokens: adjusted.thinkingBudget, + } +} + +/** + * Builds the `@anthropic-ai/sdk` client with the injected fetch, restoring the + * static headers Pi would otherwise add for direct browser access. + */ +const createAnthropicClient = (model: Model, opts: BuildAnthropicModelOptions): Anthropic => + new Anthropic({ + apiKey: opts.apiKey, + baseURL: model.baseUrl, + fetch: opts.fetch, + dangerouslyAllowBrowser: true, + defaultHeaders: { + accept: 'application/json', + 'anthropic-dangerous-direct-browser-access': 'true', + }, + }) + +/** + * Resolves an Anthropic model and wires it through a provider whose HTTP flows + * through `opts.fetch`. Drop-in replacement for `resolveModel`: returns the same + * `{ models, model }` shape the harness consumes. + * + * @param opts - api key, injected fetch, and the model id to resolve + * @returns the wired provider collection and the resolved model + * @throws if `opts.modelId` is not in Pi's built-in Anthropic catalog + */ +export const buildAnthropicModel = (opts: BuildAnthropicModelOptions): { models: Models; model: Model } => { + const catalog = builtinModels() + const resolved = catalog.getModel(PROVIDER, opts.modelId) + if (!resolved || !hasApi(resolved, API)) { + throw new Error(`Unknown Anthropic model "${opts.modelId}".`) + } + + const client = createAnthropicClient(resolved, opts) + const api: ProviderStreams = { + stream: (model, context, options) => anthropicStream(requireAnthropic(model), context, { ...options, client }), + streamSimple: (model, context, options) => { + const narrowed = requireAnthropic(model) + return anthropicStream(narrowed, context, { ...toFullAnthropicOptions(narrowed, options), client }) + }, + } + + const models = createModels() + models.setProvider( + createProvider({ + id: PROVIDER, + name: 'Anthropic', + baseUrl: resolved.baseUrl, + // Advisory only: the pre-built `client` owns the real credential + // (`opts.apiKey`, bound for the session). This descriptor lets Pi's + // status/credential-store reporting recognize the provider; the resolved + // key never reaches the wire because the injected client is used as-is. + auth: { apiKey: envApiKeyAuth('Anthropic API key', ['ANTHROPIC_API_KEY']) }, + models: [resolved], + api, + }), + ) + + return { models, model: resolved } +} diff --git a/shared/agent-core/browser-env/browser-execution-env.ts b/shared/agent-core/browser-env/browser-execution-env.ts new file mode 100644 index 000000000..7352e3a92 --- /dev/null +++ b/shared/agent-core/browser-env/browser-execution-env.ts @@ -0,0 +1,275 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * `BrowserExecutionEnv` is Pi's {@link ExecutionEnv} (filesystem + shell) + * implemented entirely on top of a single ZenFS mount, with the shell provided + * by just-bash. It is the in-browser analogue of Pi's `NodeExecutionEnv`: same + * Result-based contract, same four-tool surface, but backed by ZenFS instead of + * `node:fs` and by just-bash instead of a spawned `/bin/bash`. + * + * Both halves target the SAME ZenFS singleton: + * - filesystem methods call `@zenfs/core/promises` directly; + * - `exec()` runs commands through a fresh just-bash `Bash` bound to a + * {@link ZenBashFileSystem} adapter over that same singleton. + * That shared mount is what makes a Pi `writeFile` instantly visible to `cat`, + * and a shell redirect instantly readable via `readTextFile`. + * + * Every operation method honours Pi's invariant of never throwing: ZenFS' and + * just-bash's thrown errors are caught at this adapter boundary and encoded into + * the returned {@link Result}. This is the architectural error-handling layer + * the contract mandates, not defensive wrapping of trusted calls. + * + * ZenFS is a process-global singleton; configure it once via `mountInMemoryFs()` + * (or, in the app, a `@zenfs/dom` OPFS backend) before constructing this env. + */ + +import { + err, + ExecutionError, + ok, + toError, + type ExecutionEnv, + type FileError, + type FileInfo, + type Result, + type ShellExecOptions, +} from '@earendil-works/pi-agent-core' +import * as fsp from '@zenfs/core/promises' +import { dirname, join, resolve } from '@zenfs/core/path' +import { Bash } from 'just-bash' +import { abortedResult, fileInfoFrom, splitLines, toFileError } from './fs-helpers.ts' +import { ZenBashFileSystem } from './zen-bash-fs.ts' + +/** Mount-relative root under which {@link BrowserExecutionEnv.createTempDir} carves unique directories. */ +const TEMP_ROOT = '/tmp' + +export class BrowserExecutionEnv implements ExecutionEnv { + cwd: string + private readonly env: Record + private readonly bashFs: ZenBashFileSystem + + constructor(options: { cwd: string; env?: Record }) { + this.cwd = options.cwd + this.env = options.env ?? {} + this.bashFs = new ZenBashFileSystem() + } + + async absolutePath(path: string): Promise> { + return ok(resolve(this.cwd, path)) + } + + async joinPath(parts: string[]): Promise> { + return ok(join(...parts)) + } + + async exec( + command: string, + options?: ShellExecOptions, + ): Promise> { + if (options?.abortSignal?.aborted) return err(new ExecutionError('aborted', 'aborted')) + + const cwd = options?.cwd ? resolve(this.cwd, options.cwd) : this.cwd + const env = { ...this.env, ...options?.env } + const controller = new AbortController() + const state = { timedOut: false } + const onExternalAbort = () => controller.abort() + if (options?.abortSignal) options.abortSignal.addEventListener('abort', onExternalAbort, { once: true }) + const timeoutId = + typeof options?.timeout === 'number' + ? setTimeout(() => { + state.timedOut = true + controller.abort() + }, options.timeout * 1000) + : undefined + + try { + // `defenseInDepth` (default ON) monkey-patches/blocks JS globals (Proxy, + // eval, Function, …) to contain escapes from just-bash's *sandboxed JS* + // surfaces — `js-exec` (QuickJS) and python. We enable neither, so it + // guards nothing here while actively breaking the bash interpreter (it + // trips on just-bash's own internal `Proxy` use). The real sandbox is the + // virtual ZenFS mount with no host-process access, so we disable it. + const bash = new Bash({ fs: this.bashFs, cwd, env, defenseInDepth: false }) + const result = await bash.exec(command, { signal: controller.signal }) + if (state.timedOut) return err(new ExecutionError('timeout', `timeout:${options?.timeout}`)) + if (options?.abortSignal?.aborted) return err(new ExecutionError('aborted', 'aborted')) + if (result.stdout) options?.onStdout?.(result.stdout) + if (result.stderr) options?.onStderr?.(result.stderr) + return ok({ stdout: result.stdout, stderr: result.stderr, exitCode: result.exitCode }) + } catch (error) { + if (state.timedOut) return err(new ExecutionError('timeout', `timeout:${options?.timeout}`)) + if (controller.signal.aborted) return err(new ExecutionError('aborted', 'aborted')) + const cause = toError(error) + return err(new ExecutionError('unknown', cause.message, cause)) + } finally { + if (timeoutId) clearTimeout(timeoutId) + if (options?.abortSignal) options.abortSignal.removeEventListener('abort', onExternalAbort) + } + } + + async readTextFile(path: string, abortSignal?: AbortSignal): Promise> { + const resolved = resolve(this.cwd, path) + const aborted = abortedResult(abortSignal, resolved) + if (aborted) return aborted + try { + return ok(await fsp.readFile(resolved, { encoding: 'utf8' })) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async readTextLines( + path: string, + options?: { maxLines?: number; abortSignal?: AbortSignal }, + ): Promise> { + const resolved = resolve(this.cwd, path) + const aborted = abortedResult(options?.abortSignal, resolved) + if (aborted) return aborted + if (options?.maxLines !== undefined && options.maxLines <= 0) return ok([]) + try { + const lines = splitLines(await fsp.readFile(resolved, { encoding: 'utf8' })) + return ok(options?.maxLines !== undefined ? lines.slice(0, options.maxLines) : lines) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async readBinaryFile(path: string, abortSignal?: AbortSignal): Promise> { + const resolved = resolve(this.cwd, path) + const aborted = abortedResult(abortSignal, resolved) + if (aborted) return aborted + try { + return ok(new Uint8Array(await fsp.readFile(resolved))) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async writeFile( + path: string, + content: string | Uint8Array, + abortSignal?: AbortSignal, + ): Promise> { + const resolved = resolve(this.cwd, path) + const aborted = abortedResult(abortSignal, resolved) + if (aborted) return aborted + try { + await fsp.mkdir(dirname(resolved), { recursive: true }) + const afterMkdir = abortedResult(abortSignal, resolved) + if (afterMkdir) return afterMkdir + await fsp.writeFile(resolved, content) + return ok(undefined) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async appendFile(path: string, content: string | Uint8Array): Promise> { + const resolved = resolve(this.cwd, path) + try { + await fsp.mkdir(dirname(resolved), { recursive: true }) + await fsp.appendFile(resolved, content) + return ok(undefined) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async fileInfo(path: string): Promise> { + const resolved = resolve(this.cwd, path) + try { + return fileInfoFrom(resolved, await fsp.lstat(resolved)) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async listDir(path: string, abortSignal?: AbortSignal): Promise> { + const resolved = resolve(this.cwd, path) + const aborted = abortedResult(abortSignal, resolved) + if (aborted) return aborted + try { + const entries = await fsp.readdir(resolved, { withFileTypes: true }) + const infos: FileInfo[] = [] + for (const entry of entries) { + const loopAborted = abortedResult(abortSignal, resolved) + if (loopAborted) return loopAborted + const childPath = join(resolved, entry.name) + const info = fileInfoFrom(childPath, await fsp.lstat(childPath)) + if (info.ok) infos.push(info.value) + } + return ok(infos) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async canonicalPath(path: string): Promise> { + const resolved = resolve(this.cwd, path) + try { + return ok(await fsp.realpath(resolved)) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async exists(path: string): Promise> { + const result = await this.fileInfo(path) + if (result.ok) return ok(true) + if (result.error.code === 'not_found') return ok(false) + return err(result.error) + } + + async createDir(path: string, options?: { recursive?: boolean }): Promise> { + const resolved = resolve(this.cwd, path) + try { + await fsp.mkdir(resolved, { recursive: options?.recursive ?? true }) + return ok(undefined) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async remove(path: string, options?: { recursive?: boolean; force?: boolean }): Promise> { + const resolved = resolve(this.cwd, path) + try { + await fsp.rm(resolved, { recursive: options?.recursive ?? false, force: options?.force ?? false }) + return ok(undefined) + } catch (error) { + return err(toFileError(error, resolved)) + } + } + + async createTempDir(prefix = 'tmp-'): Promise> { + try { + // `crypto.randomUUID()` is generated inside the try: outside a secure + // context the browser leaves it undefined, so calling it throws — which + // would break the never-throw contract if it ran before the try. + const dir = join(TEMP_ROOT, `${prefix}${crypto.randomUUID()}`) + await fsp.mkdir(TEMP_ROOT, { recursive: true }) + await fsp.mkdir(dir) + return ok(dir) + } catch (error) { + return err(toFileError(error, TEMP_ROOT)) + } + } + + async createTempFile(options?: { prefix?: string; suffix?: string }): Promise> { + const dir = await this.createTempDir('tmp-') + if (!dir.ok) return dir + try { + const filePath = join(dir.value, `${options?.prefix ?? ''}${crypto.randomUUID()}${options?.suffix ?? ''}`) + await fsp.writeFile(filePath, '') + return ok(filePath) + } catch (error) { + return err(toFileError(error, dir.value)) + } + } + + async cleanup(): Promise { + // ZenFS is a shared, process-global singleton owned by the mount; there is + // nothing per-env to release. Kept as a no-op to satisfy the contract. + } +} diff --git a/shared/agent-core/browser-env/coding-tool-operations.ts b/shared/agent-core/browser-env/coding-tool-operations.ts new file mode 100644 index 000000000..757ea0cd8 --- /dev/null +++ b/shared/agent-core/browser-env/coding-tool-operations.ts @@ -0,0 +1,86 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Pluggable {@link BrowserExecutionEnv}-backed operations for Pi's four coding + * tools (bash/read/write/edit). The tools default to Pi's local Node shell and + * `node:fs` backend, which don't exist in the browser; these adapters redirect + * each tool onto the same process-global ZenFS mount the harness runs over. + * + * The bash operation delegates to {@link BrowserExecutionEnv.exec} (just-bash + * over ZenFS); the file operations call `@zenfs/core/promises` directly — the + * very same singleton — so a file the shell writes is instantly visible to the + * read tool and vice versa. All four therefore share one consistent mount. + * + * The env is never-throwing (it encodes failures in a `Result`); Pi's bash tool, + * by contrast, decodes failures from a thrown error (and detects timeouts via a + * `timeout:` message). The bash adapter re-throws the env's + * `ExecutionError` — whose `.message` already carries that exact framing — so the + * tool's existing error/timeout handling works unchanged. This is the + * architectural boundary translation Pi's contract calls for, not defensive + * wrapping. + * + * Runtime note: the read/edit operations and the bash output bridge construct + * Node `Buffer`s (Pi's operation contracts are typed in terms of `Buffer`). The + * app entry must ensure a global `Buffer` polyfill exists in the browser (the + * standard `buffer` package shim) before driving the harness. + */ + +import type { BashOperations, EditOperations, ReadOperations, WriteOperations } from '@earendil-works/pi-coding-agent' +import * as fsp from '@zenfs/core/promises' +import type { BrowserExecutionEnv } from './browser-execution-env.ts' + +/** + * Build bash operations that run every command through `env` (just-bash over the + * shared ZenFS mount). Streams stdout and stderr to the tool via `onData` and + * surfaces the env's encoded failures by throwing them. + * + * @param env - the browser execution environment bound to the agent's cwd + */ +export const createBashOperations = (env: BrowserExecutionEnv): BashOperations => ({ + exec: async (command, cwd, { onData, signal, timeout }) => { + const result = await env.exec(command, { + cwd, + timeout, + abortSignal: signal, + onStdout: (chunk) => onData(Buffer.from(chunk)), + onStderr: (chunk) => onData(Buffer.from(chunk)), + }) + if (result.ok) { + return { exitCode: result.value.exitCode } + } + // env.exec never throws; re-throw the typed ExecutionError so Pi's bash tool + // decodes it (its `.message` already carries the `timeout:` framing). + throw result.error + }, +}) + +/** Build read operations over the shared ZenFS mount. */ +export const createReadOperations = (): ReadOperations => ({ + readFile: async (absolutePath) => Buffer.from(await fsp.readFile(absolutePath)), + access: async (absolutePath) => { + await fsp.access(absolutePath) + }, +}) + +/** Build write operations over the shared ZenFS mount. */ +export const createWriteOperations = (): WriteOperations => ({ + writeFile: async (absolutePath, content) => { + await fsp.writeFile(absolutePath, content) + }, + mkdir: async (dir) => { + await fsp.mkdir(dir, { recursive: true }) + }, +}) + +/** Build edit operations over the shared ZenFS mount. */ +export const createEditOperations = (): EditOperations => ({ + readFile: async (absolutePath) => Buffer.from(await fsp.readFile(absolutePath)), + writeFile: async (absolutePath, content) => { + await fsp.writeFile(absolutePath, content) + }, + access: async (absolutePath) => { + await fsp.access(absolutePath) + }, +}) diff --git a/shared/agent-core/browser-env/fs-helpers.ts b/shared/agent-core/browser-env/fs-helpers.ts new file mode 100644 index 000000000..dd272249d --- /dev/null +++ b/shared/agent-core/browser-env/fs-helpers.ts @@ -0,0 +1,108 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Interop helpers that translate ZenFS results and errors into the shapes Pi's + * {@link FileSystem} contract expects. ZenFS throws Node-style `errno` errors + * (`ENOENT`, `EACCES`, …); these helpers map them onto Pi's backend-independent + * {@link FileError} codes so the {@link BrowserExecutionEnv} can stay strictly + * Result-based and never leak a thrown error. + */ + +import { err, FileError, ok, toError, type FileInfo, type FileKind, type Result } from '@earendil-works/pi-agent-core' +import { basename } from '@zenfs/core/path' + +/** + * Structural view of a ZenFS `Stats` object. Declared structurally (rather than + * importing ZenFS' concrete type) so the helpers stay decoupled from ZenFS' + * internal class while remaining fully typed. + */ +export type ZenStats = { + isFile(): boolean + isDirectory(): boolean + isSymbolicLink(): boolean + mode: number + size: number + mtime: Date + mtimeMs: number +} + +const isErrnoError = (error: unknown): error is { code: string; message: string } => + error instanceof Error && 'code' in error && typeof (error as { code: unknown }).code === 'string' + +/** + * Normalize an unknown thrown value (typically a ZenFS `errno` error) into a + * Pi {@link FileError} with a stable, backend-independent code. + * + * @param error - the thrown value to translate + * @param path - the addressed path associated with the failure, when known + * @returns a {@link FileError} carrying the mapped code and the original cause + */ +export const toFileError = (error: unknown, path?: string): FileError => { + if (error instanceof FileError) return error + const cause = toError(error) + if (isErrnoError(error)) { + switch (error.code) { + case 'ABORT_ERR': + return new FileError('aborted', error.message, path, cause) + case 'ENOENT': + return new FileError('not_found', error.message, path, cause) + case 'EACCES': + case 'EPERM': + return new FileError('permission_denied', error.message, path, cause) + case 'ENOTDIR': + return new FileError('not_directory', error.message, path, cause) + case 'EISDIR': + return new FileError('is_directory', error.message, path, cause) + case 'EINVAL': + return new FileError('invalid', error.message, path, cause) + } + } + return new FileError('unknown', cause.message, path, cause) +} + +const fileKindFrom = (stat: ZenStats): FileKind | undefined => { + if (stat.isFile()) return 'file' + if (stat.isDirectory()) return 'directory' + if (stat.isSymbolicLink()) return 'symlink' + return undefined +} + +/** + * Build a Pi {@link FileInfo} from an addressed path and its ZenFS stats, + * without following symlinks. Returns an `invalid` {@link FileError} for + * filesystem object kinds Pi does not model. + * + * @param path - the absolute addressed path the stats describe + * @param stat - the ZenFS stats for that path + */ +export const fileInfoFrom = (path: string, stat: ZenStats): Result => { + const kind = fileKindFrom(stat) + if (!kind) return err(new FileError('invalid', 'Unsupported file type', path)) + return ok({ name: basename(path) || path, path, kind, size: stat.size, mtimeMs: stat.mtimeMs }) +} + +/** + * Short-circuit Result for an already-aborted operation, or `undefined` when the + * signal is still live. Lets callers early-return before touching ZenFS. + * + * @param signal - the caller's abort signal, if any + * @param path - the addressed path, threaded into the {@link FileError} + */ +export const abortedResult = (signal: AbortSignal | undefined, path: string): Result | undefined => + signal?.aborted ? err(new FileError('aborted', 'aborted', path)) : undefined + +/** + * Split UTF-8 text into lines the way Node's `readline` would: tolerate both + * CRLF and LF, and drop the single trailing empty element a final newline + * produces (so `"a\nb\n"` yields `["a", "b"]`, matching the Node env). + * + * @param text - the file contents to split + */ +export const splitLines = (text: string): string[] => { + if (text === '') return [] + const lines = text.split(/\r?\n/) + if (lines[lines.length - 1] === '') lines.pop() + return lines +} diff --git a/shared/agent-core/browser-env/index.ts b/shared/agent-core/browser-env/index.ts new file mode 100644 index 000000000..3b3b15b66 --- /dev/null +++ b/shared/agent-core/browser-env/index.ts @@ -0,0 +1,19 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser execution environment for the Pi harness: a single ZenFS mount shared + * between Pi's filesystem API and just-bash's shell, presenting OPFS as a CLI, + * plus the per-tool operation adapters that bind Pi's four coding tools to it. + */ + +export { BrowserExecutionEnv } from './browser-execution-env.ts' +export { ZenBashFileSystem } from './zen-bash-fs.ts' +export { mountAgentFs, mountInMemoryFs, type MountedBackend } from './mount.ts' +export { + createBashOperations, + createEditOperations, + createReadOperations, + createWriteOperations, +} from './coding-tool-operations.ts' diff --git a/shared/agent-core/browser-env/mount.ts b/shared/agent-core/browser-env/mount.ts new file mode 100644 index 000000000..1a0ab76ea --- /dev/null +++ b/shared/agent-core/browser-env/mount.ts @@ -0,0 +1,77 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Configures the process-global ZenFS singleton that backs + * {@link BrowserExecutionEnv}. ZenFS is a singleton (like `node:fs`), so it must + * be mounted exactly once before constructing an env. + * + * Two mounts are provided: + * - {@link mountInMemoryFs} — an ephemeral in-memory mount for Node/tests and + * non-OPFS contexts. + * - {@link mountAgentFs} — the app entry point: prefers an OPFS-backed + * `@zenfs/dom` `WebAccess` mount (persists across reloads) and falls back to + * in-memory when OPFS is unavailable. It is memoised so repeated harness + * builds share the single global mount instead of reconfiguring it. + */ + +import { configureSingle, InMemory } from '@zenfs/core' +import { WebAccess } from '@zenfs/dom' + +/** Backend that ended up mounted, for the caller's diagnostics. */ +export type MountedBackend = 'opfs' | 'memory' + +/** + * Mount an in-memory ZenFS at `/`. Used by tests, by Node spikes, and as the + * fallback when the browser exposes no OPFS. Both Pi's filesystem API and + * just-bash share whatever backend is mounted here. + */ +export const mountInMemoryFs = async (): Promise => { + await configureSingle({ backend: InMemory }) +} + +/** Whether the current context exposes the Origin Private File System. */ +const isOpfsAvailable = (): boolean => + typeof navigator !== 'undefined' && typeof navigator.storage?.getDirectory === 'function' + +/** Performs the actual mount: OPFS when available and usable, in-memory otherwise. + * Always resolves (never rejects) so the memoised mount can't get stuck on a + * rejected promise — an unusable OPFS degrades to the in-memory backend. */ +const doMountAgentFs = async (): Promise => { + if (isOpfsAvailable()) { + try { + // The one-line OPFS swap: wire @zenfs/dom's WebAccess backend over the + // origin's private directory handle. {@link BrowserExecutionEnv} and + // {@link ZenBashFileSystem} both target whatever is mounted here. + const handle = await navigator.storage.getDirectory() + await configureSingle({ backend: WebAccess, handle }) + return 'opfs' + } catch { + // OPFS is exposed but unusable here (quota, private browsing, permission). + // Fall through to the same in-memory mount used when OPFS is absent. + } + } + await mountInMemoryFs() + return 'memory' +} + +/** + * Module-scoped mount promise. ZenFS is a process-global singleton, so the mount + * is a process-global one-time effect; memoising the promise makes repeated + * `mountAgentFs()` calls (one per harness build) idempotent rather than + * reconfiguring the live singleton underneath an in-flight env. + */ +let agentFsMount: Promise | undefined + +/** + * Mount the ZenFS singleton the app harness runs over, exactly once per process. + * Prefers OPFS persistence and falls back to in-memory. Safe to call repeatedly — + * subsequent calls return the same in-flight/settled mount. + * + * @returns the backend that was actually mounted (`opfs` or `memory`) + */ +export const mountAgentFs = (): Promise => { + agentFsMount ??= doMountAgentFs() + return agentFsMount +} diff --git a/shared/agent-core/browser-env/zen-bash-fs.ts b/shared/agent-core/browser-env/zen-bash-fs.ts new file mode 100644 index 000000000..ebdbd34f5 --- /dev/null +++ b/shared/agent-core/browser-env/zen-bash-fs.ts @@ -0,0 +1,141 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * `ZenBashFileSystem` is the bridge that lets just-bash run its 80+ coreutils + * over the very same ZenFS mount that Pi's {@link BrowserExecutionEnv} reads and + * writes. It implements just-bash's `IFileSystem` by forwarding every call to + * the process-global ZenFS singleton (`@zenfs/core/promises`). + * + * This is half of the "OPFS-as-CLI" illusion: because both this adapter and the + * execution env target one ZenFS instance, a file Pi writes is instantly + * visible to `cat`, and a file a shell redirect creates is instantly readable + * through Pi's filesystem API — no copying, no sync step. + * + * just-bash expects filesystem methods to THROW on failure (it catches and maps + * them to shell exit codes internally), so this adapter deliberately forwards + * ZenFS' Node-style errors unchanged rather than wrapping them. + */ + +import * as fsp from '@zenfs/core/promises' +import { resolve } from '@zenfs/core/path' +import type { BufferEncoding, CpOptions, FileContent, FsStat, IFileSystem, MkdirOptions, RmOptions } from 'just-bash' +import type { ZenStats } from './fs-helpers.ts' + +// just-bash declares these structurally in its `IFileSystem` module but does not +// re-export them from the package root; mirror them locally. Structural identity +// keeps `implements IFileSystem` satisfied. +type ReadFileOptions = { encoding?: BufferEncoding | null } +type WriteFileOptions = { encoding?: BufferEncoding } +type DirentEntry = { name: string; isFile: boolean; isDirectory: boolean; isSymbolicLink: boolean } + +const encodingOf = ( + options: ReadFileOptions | WriteFileOptions | BufferEncoding | undefined, +): BufferEncoding | undefined => { + const encoding = typeof options === 'string' ? options : options?.encoding + return encoding ?? undefined +} + +const toFsStat = (stat: ZenStats): FsStat => ({ + isFile: stat.isFile(), + isDirectory: stat.isDirectory(), + isSymbolicLink: stat.isSymbolicLink(), + mode: stat.mode, + size: stat.size, + mtime: stat.mtime, +}) + +export class ZenBashFileSystem implements IFileSystem { + async readFile(path: string, options?: ReadFileOptions | BufferEncoding): Promise { + return await fsp.readFile(path, { encoding: encodingOf(options) ?? 'utf8' }) + } + + async readFileBuffer(path: string): Promise { + return new Uint8Array(await fsp.readFile(path)) + } + + async writeFile(path: string, content: FileContent, options?: WriteFileOptions | BufferEncoding): Promise { + const encoding = encodingOf(options) + await fsp.writeFile(path, content, encoding ? { encoding } : undefined) + } + + async appendFile(path: string, content: FileContent, options?: WriteFileOptions | BufferEncoding): Promise { + const encoding = encodingOf(options) + await fsp.appendFile(path, content, encoding ? { encoding } : undefined) + } + + async exists(path: string): Promise { + return await fsp.exists(path) + } + + async stat(path: string): Promise { + return toFsStat(await fsp.stat(path)) + } + + async lstat(path: string): Promise { + return toFsStat(await fsp.lstat(path)) + } + + async mkdir(path: string, options?: MkdirOptions): Promise { + await fsp.mkdir(path, { recursive: options?.recursive ?? false }) + } + + async readdir(path: string): Promise { + return await fsp.readdir(path) + } + + async readdirWithFileTypes(path: string): Promise { + const entries = await fsp.readdir(path, { withFileTypes: true }) + return entries.map((entry) => ({ + name: entry.name, + isFile: entry.isFile(), + isDirectory: entry.isDirectory(), + isSymbolicLink: entry.isSymbolicLink(), + })) + } + + async rm(path: string, options?: RmOptions): Promise { + await fsp.rm(path, { recursive: options?.recursive ?? false, force: options?.force ?? false }) + } + + async cp(src: string, dest: string, options?: CpOptions): Promise { + await fsp.cp(src, dest, { recursive: options?.recursive ?? false }) + } + + async mv(src: string, dest: string): Promise { + await fsp.rename(src, dest) + } + + resolvePath(base: string, path: string): string { + return resolve(base, path) + } + + getAllPaths(): string[] { + return [] + } + + async chmod(path: string, mode: number): Promise { + await fsp.chmod(path, mode) + } + + async symlink(target: string, linkPath: string): Promise { + await fsp.symlink(target, linkPath) + } + + async link(existingPath: string, newPath: string): Promise { + await fsp.link(existingPath, newPath) + } + + async readlink(path: string): Promise { + return await fsp.readlink(path) + } + + async realpath(path: string): Promise { + return await fsp.realpath(path) + } + + async utimes(path: string, atime: Date, mtime: Date): Promise { + await fsp.utimes(path, atime, mtime) + } +} diff --git a/shared/agent-core/browser-stubs/cross-spawn.ts b/shared/agent-core/browser-stubs/cross-spawn.ts new file mode 100644 index 000000000..1b0c22715 --- /dev/null +++ b/shared/agent-core/browser-stubs/cross-spawn.ts @@ -0,0 +1,47 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser stub for `cross-spawn`, aliased in `vite.config.ts` for the in-browser + * Pi harness path. + * + * Why this exists: Pi's `@earendil-works/pi-coding-agent` pulls `cross-spawn` in + * through its Node child-process helper. The real package evaluates + * `process.platform` at *module scope* (`lib/parse.js`, `lib/enoent.js`), so + * merely importing it throws `ReferenceError: process is not defined` in the + * browser — before any LLM call. A runtime `globalThis.process` shim can't help + * because the optimized dep evaluates `process` the moment the chunk loads, so + * the fix must be build-level: replace the module entirely. + * + * Why it's safe: the app harness never resolves OS executables. Bash runs through + * {@link BrowserExecutionEnv} (just-bash over ZenFS), and the read/write/edit + * tools are bound to the same ZenFS mount — none of them touch `child_process`. + * This module is therefore dead weight on the browser path. + * + * Why it throws rather than no-ops: reaching this code would mean execution was + * wrongly routed through Node's `child_process`, which is an architectural bug we + * want to surface loudly, not silence. + */ + +/** Loudly reject any browser call into the Node child-process path. */ +const browserUnsupported = (..._args: unknown[]): never => { + throw new Error('cross-spawn is unavailable in the browser; execution runs through BrowserExecutionEnv') +} + +/** Mirrors the shape `cross-spawn` consumers expect (callable + `.sync`/`.spawn`). */ +type CrossSpawn = { + (...args: unknown[]): never + sync: (...args: unknown[]) => never + spawn: (...args: unknown[]) => never +} + +const crossSpawn = browserUnsupported as CrossSpawn +crossSpawn.sync = browserUnsupported +crossSpawn.spawn = browserUnsupported + +// Named exports too, so every access path (`import cs`, `import { sync }`) throws +// loudly rather than relying on CJS-interop synthesizing the named bindings. +export const sync = browserUnsupported +export const spawn = browserUnsupported +export default crossSpawn diff --git a/shared/agent-core/browser-stubs/install-process.ts b/shared/agent-core/browser-stubs/install-process.ts new file mode 100644 index 000000000..130f8050d --- /dev/null +++ b/shared/agent-core/browser-stubs/install-process.ts @@ -0,0 +1,59 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Installs the Node globals (`process`, `global`) the lazily-loaded Pi engine + * expects but the browser lacks. + * + * Why this exists: Pi is a Node CLI. Several of its modules read the bare + * `process` global — `config.js` (`process.versions.bun`), `timings.js` + * (`process.env.PI_TIMING`), the clipboard helper (`process.execPath`, + * `process.platform`, `process.env`) — and others reference the bare `global` + * object, so loading Pi throws `ReferenceError: process is not defined` / + * `global is not defined` in the browser. Because these are bare globals (not + * `import … from 'process'`), a module alias can't reach them; the globals must + * exist when Pi evaluates. + * + * Why a side-effecting import rather than a runtime shim: ES module imports are + * hoisted and evaluated in source order, so a `globalThis.process = …` assignment + * placed inside a consumer runs *after* the hoisted Pi import has already thrown. + * This module performs the assignment at its own module scope and is imported + * first by `shared/agent-core/index.ts` (the lazy chunk's entry), so the global is + * in place before any Pi module evaluates — and, living only in that chunk, it + * never touches the entry bundle. + * + * The harness never executes OS processes (bash runs through BrowserExecutionEnv), + * so this shim only has to satisfy the module-scope reads above and stay inert. + */ + +/** Minimal browser stand-in for Node's `process` — just the surface Pi reads. */ +const browserProcess = { + /** Pi treats truthy `browser` as "take the browser code path" where it checks. */ + browser: true, + env: {} as Record, + platform: 'browser', + arch: 'wasm', + version: '', + versions: {} as Record, + argv: [] as string[], + execPath: '/pi', + cwd: () => '/', + chdir: () => {}, + nextTick: (callback: (...args: unknown[]) => void, ...args: unknown[]) => { + queueMicrotask(() => callback(...args)) + }, + // Some libraries register lifecycle listeners (`process.on('exit', …)`); accept + // and ignore them so the chainable API stays intact. + on: () => browserProcess, + once: () => browserProcess, + off: () => browserProcess, + removeListener: () => browserProcess, + emit: () => false, +} + +const scope = globalThis as unknown as { process?: unknown; global?: unknown } +scope.process ??= browserProcess +// Some Pi/dependency code references the bare Node `global` object; in the browser +// it is the same as `globalThis`. +scope.global ??= globalThis diff --git a/shared/agent-core/browser-stubs/node-constants.cjs b/shared/agent-core/browser-stubs/node-constants.cjs new file mode 100644 index 000000000..ab777f8ba --- /dev/null +++ b/shared/agent-core/browser-stubs/node-constants.cjs @@ -0,0 +1,33 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser shim for Node's legacy `constants` / `node:constants` module, aliased in + * `vite.config.ts` for the in-browser Pi harness path. + * + * Why this exists: `graceful-fs` (pulled in transitively by Pi) does + * `require('constants')` and then calls `constants.hasOwnProperty('O_SYMLINK')`. + * Vite's default `browser-external:constants` returns a proxy whose + * `hasOwnProperty` is not callable, throwing during graceful-fs's patch step. A + * plain CommonJS object restores `hasOwnProperty`; omitting the exotic flags + * (e.g. `O_SYMLINK`) makes graceful-fs skip the `lchmod`/`lchown` patches it would + * otherwise install — none of which the browser harness needs. + */ + +module.exports = { + F_OK: 0, + R_OK: 4, + W_OK: 2, + X_OK: 1, + O_RDONLY: 0, + O_WRONLY: 1, + O_RDWR: 2, + O_CREAT: 64, + O_EXCL: 128, + O_TRUNC: 512, + O_APPEND: 1024, + S_IFMT: 61440, + S_IFREG: 32768, + S_IFDIR: 16384, +} diff --git a/shared/agent-core/browser-stubs/node-crypto.ts b/shared/agent-core/browser-stubs/node-crypto.ts new file mode 100644 index 000000000..78a9f80b6 --- /dev/null +++ b/shared/agent-core/browser-stubs/node-crypto.ts @@ -0,0 +1,43 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser shim for Node's `crypto` / `node:crypto`, aliased in `vite.config.ts` + * for the in-browser Pi harness path. + * + * Why this exists: Pi's runtime engine generates ids at runtime — + * `crypto.randomUUID` (session/message ids) and `crypto.randomBytes` (tool-call + * ids) — which Vite's default `browser-external:crypto` leaves undefined. These + * are backed by the browser's native Web Crypto, so the shim is a thin, correct + * delegation rather than a stub. `createHash` is not on the harness path; it + * throws so an unexpected caller surfaces loudly instead of silently misbehaving. + */ + +import { Buffer } from 'buffer' + +/** Native RFC-4122 v4 UUID via Web Crypto. */ +export const randomUUID = (): string => globalThis.crypto.randomUUID() + +/** Node-compatible `randomBytes`: a `Buffer` of cryptographically-random bytes. */ +export const randomBytes = (size: number): Buffer => { + const bytes = new Uint8Array(size) + globalThis.crypto.getRandomValues(bytes) + return Buffer.from(bytes) +} + +/** Fill an existing typed array with random bytes (Web Crypto, returns the array). */ +export const randomFillSync = (buffer: T): T => { + globalThis.crypto.getRandomValues(buffer as unknown as Uint8Array) + return buffer +} + +/** The Web Crypto implementation, mirroring Node's `crypto.webcrypto`. */ +export const webcrypto = globalThis.crypto + +/** Not available in the browser — surfaces loudly if the harness ever needs it. */ +export const createHash = (): never => { + throw new Error('crypto.createHash is unavailable in the browser Pi harness') +} + +export default { randomUUID, randomBytes, randomFillSync, webcrypto, createHash } diff --git a/shared/agent-core/browser-stubs/node-fs-promises.ts b/shared/agent-core/browser-stubs/node-fs-promises.ts new file mode 100644 index 000000000..89aa0e287 --- /dev/null +++ b/shared/agent-core/browser-stubs/node-fs-promises.ts @@ -0,0 +1,53 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser shim for Node's `fs/promises` / `node:fs/promises`, aliased in + * `vite.config.ts` for the in-browser Pi harness path. + * + * The harness performs its real file I/O through the ZenFS-backed operation + * adapters (see `coding-tool-operations.ts`), so Pi's own `fs/promises` calls are + * inert on this path. This presents an empty filesystem: reads reject with + * `ENOENT`, writes resolve as no-ops. It exists so importing Pi doesn't pull in + * Vite's `browser-external` placeholder (whose members throw on access). + */ + +/** Build a Node-style ENOENT error so Pi's error handling reads it as "missing". */ +const enoent = (path: string): Error & { code: string } => { + const error = new Error(`ENOENT: no such file or directory, '${path}'`) as Error & { code: string } + error.code = 'ENOENT' + return error +} + +export const access = (path: string): Promise => Promise.reject(enoent(path)) +export const readFile = (path: string): Promise => Promise.reject(enoent(path)) +export const stat = (path: string): Promise => Promise.reject(enoent(path)) +export const lstat = (path: string): Promise => Promise.reject(enoent(path)) +export const readlink = (path: string): Promise => Promise.reject(enoent(path)) +export const realpath = (path: string): Promise => Promise.resolve(path) +export const readdir = (): Promise => Promise.resolve([]) +export const writeFile = (): Promise => Promise.resolve() +export const appendFile = (): Promise => Promise.resolve() +export const mkdir = (): Promise => Promise.resolve(undefined) +export const mkdtemp = (prefix: string): Promise => Promise.resolve(`${prefix}browser`) +export const rm = (): Promise => Promise.resolve() +export const unlink = (): Promise => Promise.resolve() +export const open = (path: string): Promise => Promise.reject(enoent(path)) + +export default { + access, + readFile, + stat, + lstat, + readlink, + realpath, + readdir, + writeFile, + appendFile, + mkdir, + mkdtemp, + rm, + unlink, + open, +} diff --git a/shared/agent-core/browser-stubs/node-fs.cjs b/shared/agent-core/browser-stubs/node-fs.cjs new file mode 100644 index 000000000..001f36408 --- /dev/null +++ b/shared/agent-core/browser-stubs/node-fs.cjs @@ -0,0 +1,107 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser shim for Node's `fs` / `node:fs`, aliased in `vite.config.ts` for the + * in-browser Pi harness path. + * + * Why this exists: Pi's package/config detection probes the disk with sync `fs` + * calls (`existsSync`, `readFileSync`, …). Vite's default `browser-external:fs` + * leaves them undefined, throwing on call. The harness does its REAL file I/O + * through the ZenFS-backed operation adapters (see `coding-tool-operations.ts`), + * never through these — so this shim presents an *empty* filesystem: `existsSync` + * returns false (Pi falls back to its defaults), reads throw `ENOENT`, and writes + * are inert no-ops. + * + * Why CommonJS (not the ESM `.ts` used by the sibling shims): `graceful-fs` + * monkey-patches the `fs` module in place (`fs.closeSync = …`). ES module named + * exports are read-only bindings, so an ESM shim throws + * "Cannot set property closeSync … which has only a getter". A CJS `module.exports` + * object is plain and mutable, so the (harmless, browser-irrelevant) patching + * succeeds and the harness loads. + */ + +/** Build a Node-style ENOENT error so Pi's error handling reads it as "missing". */ +const enoent = (path) => { + const error = new Error(`ENOENT: no such file or directory, '${path}'`) + error.code = 'ENOENT' + return error +} + +/** No-op file watcher: callers only ever `.close()` it. */ +const noopWatcher = { close: () => {}, on: () => noopWatcher, unref: () => noopWatcher, ref: () => noopWatcher } + +module.exports = { + constants: { F_OK: 0, R_OK: 4, W_OK: 2, X_OK: 1, O_RDONLY: 0, O_WRONLY: 1, O_RDWR: 2 }, + + existsSync: () => false, + readFileSync: (path) => { + throw enoent(path) + }, + readSync: () => { + throw new Error('fs.readSync is unavailable in the browser Pi harness') + }, + openSync: (path) => { + throw enoent(path) + }, + statSync: (path) => { + throw enoent(path) + }, + lstatSync: (path) => { + throw enoent(path) + }, + readlinkSync: (path) => { + throw enoent(path) + }, + /** Callback-style `fs.readdir`: report an empty directory. */ + readdir: (_path, optionsOrCb, maybeCb) => { + const callback = typeof optionsOrCb === 'function' ? optionsOrCb : maybeCb + if (typeof callback === 'function') { + callback(null, []) + } + }, + readdirSync: () => [], + accessSync: (path) => { + throw enoent(path) + }, + createReadStream: (path) => { + throw enoent(path) + }, + createWriteStream: () => { + throw new Error('fs.createWriteStream is unavailable in the browser Pi harness') + }, + /** Identity: with no real symlinks, the resolved path is the input path. */ + realpathSync: (path) => path, + + writeFileSync: () => {}, + appendFileSync: () => {}, + mkdirSync: () => {}, + rmSync: () => {}, + renameSync: () => {}, + copyFileSync: () => {}, + unlinkSync: () => {}, + chmodSync: () => {}, + closeSync: () => {}, + + watch: () => noopWatcher, + watchFile: () => {}, + unwatchFile: () => {}, + + /** Async surface, for code reaching `fs.promises` through the namespace. */ + promises: { + access: (path) => Promise.reject(enoent(path)), + readFile: (path) => Promise.reject(enoent(path)), + stat: (path) => Promise.reject(enoent(path)), + lstat: (path) => Promise.reject(enoent(path)), + readlink: (path) => Promise.reject(enoent(path)), + realpath: (path) => Promise.resolve(path), + readdir: () => Promise.resolve([]), + writeFile: () => Promise.resolve(), + appendFile: () => Promise.resolve(), + mkdir: () => Promise.resolve(undefined), + mkdtemp: (prefix) => Promise.resolve(`${prefix}browser`), + rm: () => Promise.resolve(), + unlink: () => Promise.resolve(), + }, +} diff --git a/shared/agent-core/browser-stubs/node-module.ts b/shared/agent-core/browser-stubs/node-module.ts new file mode 100644 index 000000000..899fc2e8d --- /dev/null +++ b/shared/agent-core/browser-stubs/node-module.ts @@ -0,0 +1,59 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser shim for Node's `module` / `node:module`, aliased in `vite.config.ts` + * for the in-browser Pi harness path. + * + * Why this exists: Pi builds a CommonJS `require` via `createRequire(import.meta.url)` + * — at module scope (its clipboard probe) and lazily at runtime (some modules + * `require('fs')` rather than import it). Vite's `browser-external:module` leaves + * `createRequire` undefined, throwing on import. + * + * The returned `require` resolves the Node builtins Pi reaches for to the same + * browser shims the static `vite.config.ts` aliases use, so a dynamic + * `require('fs')` behaves identically to `import … from 'fs'`. Anything else + * (e.g. an optional native addon) throws — the only such caller wraps the lookup + * in try/catch and falls back to `null`, so the harness still loads cleanly. + */ + +// All imported via their bare builtin specifiers: typed by @types/node for the +// type-checker, redirected to the browser shims by vite.config.ts's resolve.alias +// at build time (so a dynamic `require('fs')` matches the static `import` path). +import nodeCrypto from 'node:crypto' +import nodeFs from 'node:fs' +import nodeFsPromises from 'node:fs/promises' +import nodeOs from 'node:os' +import nodeUrl from 'node:url' +import nodePath from 'node:path' + +/** Node builtins Pi may `require()` at runtime, mapped to their browser shims. */ +const browserBuiltins: Record = { + fs: nodeFs, + 'node:fs': nodeFs, + 'fs/promises': nodeFsPromises, + 'node:fs/promises': nodeFsPromises, + os: nodeOs, + 'node:os': nodeOs, + crypto: nodeCrypto, + 'node:crypto': nodeCrypto, + path: nodePath, + 'node:path': nodePath, + url: nodeUrl, + 'node:url': nodeUrl, +} + +/** A CommonJS `require` over the browser shims; unknown ids fail loudly. */ +const browserRequire = (id: string): unknown => { + const builtin = browserBuiltins[id] + if (builtin) { + return builtin + } + throw new Error(`Cannot require '${id}' in the browser; native modules are unavailable in the Pi harness`) +} + +/** Browser `createRequire`: hand back the shimmed `require`. */ +export const createRequire = (): typeof browserRequire => browserRequire + +export default { createRequire } diff --git a/shared/agent-core/browser-stubs/node-os.ts b/shared/agent-core/browser-stubs/node-os.ts new file mode 100644 index 000000000..5d4e730b1 --- /dev/null +++ b/shared/agent-core/browser-stubs/node-os.ts @@ -0,0 +1,37 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser shim for Node's `os` / `node:os`, aliased in `vite.config.ts` for the + * in-browser Pi harness path. + * + * Why this exists: Pi resolves its config directory from `os.homedir()` and a few + * helpers read `os.tmpdir()`/`os.platform()`. Vite's default `browser-external:os` + * leaves them undefined, throwing on call. The harness keeps no on-disk config + * (it uses an in-memory session repo and a ZenFS sandbox), so these only need to + * return stable, sane values rather than reflect a real host. + */ + +/** A stable virtual home directory; the harness never reads it. */ +export const homedir = (): string => '/home/user' + +/** A stable virtual temp directory; real temp I/O goes through ZenFS. */ +export const tmpdir = (): string => '/tmp' + +/** Report a browser "platform" so Pi takes its non-Windows code paths. */ +export const platform = (): string => 'browser' + +/** WebAssembly-ish arch label; only used in diagnostics Pi never shows here. */ +export const arch = (): string => 'wasm' + +/** Browsers are LF-only. */ +export const EOL = '\n' + +/** No CPU topology in the browser. */ +export const cpus = (): unknown[] => [] + +/** Stable host label. */ +export const hostname = (): string => 'browser' + +export default { homedir, tmpdir, platform, arch, EOL, cpus, hostname } diff --git a/shared/agent-core/browser-stubs/node-url.ts b/shared/agent-core/browser-stubs/node-url.ts new file mode 100644 index 000000000..caf485d27 --- /dev/null +++ b/shared/agent-core/browser-stubs/node-url.ts @@ -0,0 +1,33 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser shim for Node's `url` / `node:url`, aliased in `vite.config.ts` for the + * in-browser Pi harness path. + * + * Why this exists: Pi's `config.js` derives `__dirname` at MODULE SCOPE via + * `fileURLToPath(import.meta.url)`, and its clipboard helper calls + * `pathToFileURL` at load. Vite's default `browser-external:url` leaves both + * undefined, so importing Pi throws "fileURLToPath is not a function" before any + * LLM call. The browser harness never reads on-disk Pi config/assets, so the + * derived paths are inert — these implementations only need to return a value + * rather than throw. `URL`/`URLSearchParams` are browser globals, re-exported for + * parity with the Node module surface. + */ + +/** Browser `fileURLToPath`: return the URL's pathname (file:// or http(s)://). */ +export const fileURLToPath = (url: string | URL): string => new globalThis.URL(url).pathname + +/** Browser `pathToFileURL`: wrap an absolute path as a `file://` URL. */ +export const pathToFileURL = (path: string): URL => new globalThis.URL(`file://${path}`) + +// Re-export the browser globals under the Node module's names (globals can't be +// re-exported directly, so alias through local bindings). +const url = globalThis.URL +const urlSearchParams = globalThis.URLSearchParams + +const nodeUrl = { fileURLToPath, pathToFileURL, URL: url, URLSearchParams: urlSearchParams } + +export { url as URL, urlSearchParams as URLSearchParams } +export default nodeUrl diff --git a/shared/agent-core/browser-stubs/undici.ts b/shared/agent-core/browser-stubs/undici.ts new file mode 100644 index 000000000..742744edd --- /dev/null +++ b/shared/agent-core/browser-stubs/undici.ts @@ -0,0 +1,35 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser stub for `undici`, aliased in `vite.config.ts` for the in-browser Pi + * harness path. + * + * Why this exists: Pi's `core/http-dispatcher.js` does `import * as undici from + * 'undici'` to install a custom Node HTTP dispatcher. `undici` is a Node-only + * HTTP stack — its modules `extends` Node `stream`/`net`/`tls` classes at module + * scope, throwing "Class extends value undefined" in the browser (those builtins + * are externalized). The harness routes every model request through the app's + * injected proxy `fetch`, never undici, so the whole library is dead weight here. + * + * Replacing it with this stub keeps undici's heavy Node graph out of the browser + * bundle entirely. The dispatcher-config calls (`setGlobalDispatcher`, `install`, + * `new EnvHttpProxyAgent(...)`) become harmless no-ops; `fetch` delegates to the + * browser's native implementation in case anything reaches for it. + */ + +/** No-op stand-in for undici's proxy agent — constructed but never used. */ +class EnvHttpProxyAgent {} +class Agent {} +class ProxyAgent {} +class Pool {} + +const setGlobalDispatcher = (): void => {} +const getGlobalDispatcher = (): undefined => undefined +const install = (): void => {} +const fetch = (input: RequestInfo | URL, init?: RequestInit): Promise => globalThis.fetch(input, init) + +export { EnvHttpProxyAgent, Agent, ProxyAgent, Pool, setGlobalDispatcher, getGlobalDispatcher, install, fetch } + +export default { EnvHttpProxyAgent, Agent, ProxyAgent, Pool, setGlobalDispatcher, getGlobalDispatcher, install, fetch } diff --git a/shared/agent-core/browser-stubs/which.ts b/shared/agent-core/browser-stubs/which.ts new file mode 100644 index 000000000..68f8f9cd3 --- /dev/null +++ b/shared/agent-core/browser-stubs/which.ts @@ -0,0 +1,33 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Browser stub for `which`, aliased in `vite.config.ts` for the in-browser Pi + * harness path. See `./cross-spawn.ts` for the full rationale — `which` is the + * sibling executable-resolution module (`cross-spawn` resolves commands through + * it) and likewise evaluates `process.platform`/`process.env` at module scope, + * throwing `ReferenceError: process is not defined` on import in the browser. + * + * The harness never resolves OS executables (bash runs through + * {@link BrowserExecutionEnv}), so this module is dead weight on the browser + * path. It throws if ever called so a mis-routed execution surfaces loudly + * instead of silently no-op'ing. + */ + +/** Loudly reject any browser call into OS executable resolution. */ +const browserUnsupported = (..._args: unknown[]): never => { + throw new Error('which is unavailable in the browser; execution runs through BrowserExecutionEnv') +} + +/** Mirrors the shape `which` consumers expect (callable + `.sync`). */ +type Which = { + (...args: unknown[]): never + sync: (...args: unknown[]) => never +} + +const which = browserUnsupported as Which +which.sync = browserUnsupported + +export default which +export const sync = browserUnsupported diff --git a/shared/agent-core/build-app-harness.ts b/shared/agent-core/build-app-harness.ts new file mode 100644 index 000000000..da6eafa80 --- /dev/null +++ b/shared/agent-core/build-app-harness.ts @@ -0,0 +1,109 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Assembles a Pi {@link AgentHarness} for the APP — the in-browser analogue of + * the CLI's `buildHarness`. Where the CLI binds a `NodeExecutionEnv` (real bash + + * `node:fs`) and lets Pi's anthropic provider read `ANTHROPIC_API_KEY`, the app + * harness runs entirely inside the browser: + * + * - the model is Pi's anthropic model wired through the caller's injected + * `fetch` (the app's CORS proxy) via {@link buildAnthropicModel}; + * - the execution environment is a {@link BrowserExecutionEnv} over an + * OPFS-backed ZenFS mount ({@link mountAgentFs}), with an in-memory fallback; + * - the four coding tools (bash/read/write/edit) are bound to that same mount + * through {@link createBashOperations} and the file-operation adapters. + * + * Extra `tools` (e.g. the app's MCP tools converted via `./mcp-tools.ts`) are + * appended and made active alongside the coding tools. + */ + +import { AgentHarness, InMemorySessionRepo, type AgentTool, type ThinkingLevel } from '@earendil-works/pi-agent-core' +import { createBashTool, createEditTool, createReadTool, createWriteTool } from '@earendil-works/pi-coding-agent' +import { buildAnthropicModel, type AgentFetch } from './anthropic-model.ts' +import { BrowserExecutionEnv } from './browser-env/browser-execution-env.ts' +import { + createBashOperations, + createEditOperations, + createReadOperations, + createWriteOperations, +} from './browser-env/coding-tool-operations.ts' +import { mountAgentFs } from './browser-env/mount.ts' +import { ensureBufferPolyfill } from './ensure-buffer.ts' +import { buildSeedMessages, type SeedTurn } from './seed-history.ts' + +/** Absolute mount-relative directory the agent's tools are bound to. */ +const AGENT_CWD = '/workspace' + +/** Inputs for {@link buildAppHarness}. */ +export type BuildAppHarnessOptions = { + /** Anthropic API key (HTTP still flows through `fetch`). */ + readonly apiKey: string + /** Fetch every request is routed through — the app passes its proxy fetch. */ + readonly fetch: AgentFetch + /** Anthropic model id to run, e.g. `claude-opus-4-8`. */ + readonly modelId: string + /** System prompt sent with each model request. */ + readonly systemPrompt: string + /** Reasoning depth for the harness. */ + readonly thinkingLevel: ThinkingLevel + /** Extra tools to register and activate alongside the four coding tools. */ + readonly tools?: AgentTool[] + /** Prior conversation turns to seed into the session before the first prompt, + * so the agent has multi-turn context. Omitted/empty starts a blank session. */ + readonly history?: readonly SeedTurn[] +} + +/** + * Build a ready-to-run app harness. Mounts the ZenFS singleton (once), binds the + * coding tools to it, resolves the proxied anthropic model, and returns the + * constructed harness. No teardown is needed — {@link BrowserExecutionEnv} owns + * no per-instance resources (ZenFS is a process-global singleton). + * + * @param options - api key, injected fetch, model id, prompt, thinking level, extra tools + * @returns the constructed {@link AgentHarness} + */ +export const buildAppHarness = async (options: BuildAppHarnessOptions): Promise => { + ensureBufferPolyfill() + await mountAgentFs() + const env = new BrowserExecutionEnv({ cwd: AGENT_CWD }) + const created = await env.createDir(AGENT_CWD) + if (!created.ok) { + throw created.error + } + const session = await new InMemorySessionRepo().create({}) + const { models, model } = buildAnthropicModel({ + apiKey: options.apiKey, + fetch: options.fetch, + modelId: options.modelId, + }) + + const tools: AgentTool[] = [ + createBashTool(AGENT_CWD, { operations: createBashOperations(env) }), + createReadTool(AGENT_CWD, { operations: createReadOperations() }), + createWriteTool(AGENT_CWD, { operations: createWriteOperations() }), + createEditTool(AGENT_CWD, { operations: createEditOperations() }), + ...(options.tools ?? []), + ] + + const harness = new AgentHarness({ + env, + session, + models, + model, + tools, + activeToolNames: tools.map((tool) => tool.name), + thinkingLevel: options.thinkingLevel, + systemPrompt: options.systemPrompt, + }) + + // Seed prior turns into the (idle) session so the first prompt runs with full + // conversational context. `appendMessage` writes straight to the session while + // idle; `prompt` then reads them back via `session.buildContext()`. + for (const message of buildSeedMessages(options.history)) { + await harness.appendMessage(message) + } + + return harness +} diff --git a/shared/agent-core/ensure-buffer.ts b/shared/agent-core/ensure-buffer.ts new file mode 100644 index 000000000..617f264b1 --- /dev/null +++ b/shared/agent-core/ensure-buffer.ts @@ -0,0 +1,22 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Installs a global `Buffer` for the in-browser harness. Pi's coding tools and + * the ZenFS operation adapters speak Node `Buffer` (the read/edit operations + * return `Buffer`, bash output is wrapped in `Buffer`, and Pi's coding-agent + * internals call `Buffer` too), but browsers expose no global `Buffer`. This + * shims it from the `buffer` package once, before the harness runs. + */ + +import { Buffer as BufferPolyfill } from 'buffer' + +/** + * Ensure `globalThis.Buffer` exists, idempotently. A no-op in any environment + * that already provides `Buffer` (Node, Bun, or a host that polyfilled it). + */ +export const ensureBufferPolyfill = (): void => { + const scope: { Buffer?: unknown } = globalThis + scope.Buffer ??= BufferPolyfill +} diff --git a/shared/agent-core/index.ts b/shared/agent-core/index.ts new file mode 100644 index 000000000..b605a7740 --- /dev/null +++ b/shared/agent-core/index.ts @@ -0,0 +1,22 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * The app's in-browser agent engine: a Pi {@link AgentHarness} assembled over an + * OPFS-backed ZenFS execution environment, with the Anthropic model routed + * through the app's proxy fetch and the app's MCP tools bridged in. + */ + +// Side-effect import — MUST stay first. Installs the Node globals Pi reads at +// module scope (`process`, `global`) before any Pi module evaluates; otherwise the +// browser throws `ReferenceError: process is not defined`. See ./browser-stubs/install-process.ts. +import './browser-stubs/install-process.ts' + +export { buildAnthropicModel, type AgentFetch, type BuildAnthropicModelOptions } from './anthropic-model.ts' +export { buildAppHarness, type BuildAppHarnessOptions } from './build-app-harness.ts' +export { ensureBufferPolyfill } from './ensure-buffer.ts' +export { toPiAgentTools } from './mcp-tools.ts' +export type { SeedTurn } from './seed-history.ts' +export { piHarnessToUiMessageStream, type AiSdkChunk } from './pi-to-aisdk-stream.ts' +export { BrowserExecutionEnv, mountAgentFs, mountInMemoryFs, type MountedBackend } from './browser-env/index.ts' diff --git a/shared/agent-core/mcp-tools.ts b/shared/agent-core/mcp-tools.ts new file mode 100644 index 000000000..e7aaa947f --- /dev/null +++ b/shared/agent-core/mcp-tools.ts @@ -0,0 +1,158 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Converts the app's AI-SDK tools — the `Record` produced by + * `src/ai/fetch.ts`'s `mergeMcpTools` (MCP servers' tools, already namespaced + * `_`, plus the app's built-in integration tools) — into Pi + * {@link AgentTool}s so they keep working under the in-browser Pi harness. + * + * Two boundaries are bridged: + * + * - **Schema.** An AI-SDK tool carries its input schema as a `FlexibleSchema` + * (Zod or JSON Schema). Pi types a tool's `parameters` as a TypeBox `TSchema`, + * but its validation layer (`validateToolArguments`) explicitly accepts a + * *plain* JSON Schema object that lacks TypeBox metadata — it compiles such a + * schema directly and applies JSON-Schema coercion — and its Anthropic tool + * serialization reads `.properties`/`.required` straight off the object. So we + * resolve the tool's schema to JSON Schema via `asSchema().jsonSchema` and pass + * it through unchanged; {@link asPiParameters} only re-brands the structural + * type at the FFI boundary. + * + * - **Result.** Pi tools return `{ content, details }` where `content` is a list + * of text/image blocks. We run the AI-SDK tool's `execute` and map its output + * through the tool's own `toModelOutput` (MCP tools define one) into Pi text / + * image content, falling back to a JSON dump when no `toModelOutput` exists. + * + * Errors are intentionally left to throw: Pi's agent loop catches a thrown tool + * error and encodes it as a tool-result error, which is exactly the never-mask + * behaviour we want — no defensive wrapping here. + */ + +import type { AgentTool } from '@earendil-works/pi-agent-core' +import type { ImageContent, TextContent } from '@earendil-works/pi-ai' +import { asSchema, type Tool } from 'ai' + +/** Pi's structural type for a tool's `parameters` (a TypeBox `TSchema`). */ +type PiToolParameters = AgentTool['parameters'] + +/** A text or image block in a Pi tool result. */ +type PiContent = TextContent | ImageContent + +/** + * Re-brand a resolved JSON Schema as Pi's `parameters` type. Pi accepts plain + * JSON Schema objects at runtime (see module docs), so the schema flows through + * unchanged; this only satisfies the structural `TSchema` brand at the boundary. + */ +const asPiParameters = (jsonSchema: object): PiToolParameters => jsonSchema as unknown as PiToolParameters + +/** Render any value as a string for text content (passing strings through). + * `JSON.stringify` returns `undefined` for `undefined`/functions, so coerce that + * to `'null'` (matching the AI SDK) to keep the result a real string. */ +const stringify = (value: unknown): string => (typeof value === 'string' ? value : (JSON.stringify(value) ?? 'null')) + +/** Whether a tool's raw output is an MCP error result (`{ isError: true }`). The + * AI-SDK MCP client returns — rather than throws — such results, and its + * `toModelOutput` drops the flag, so we detect it on the raw output. */ +const isErrorOutput = (output: unknown): boolean => + typeof output === 'object' && output !== null && 'isError' in output && output.isError === true + +/** Whether a value is an async iterable (a streaming tool result). */ +const isAsyncIterable = (value: unknown): value is AsyncIterable => + typeof value === 'object' && value !== null && Symbol.asyncIterator in value + +/** + * Normalise an AI-SDK `execute` return — which may be a value, a promise, or an + * async iterable of progressive outputs — to the single final output. + */ +const resolveExecuteOutput = async (raw: unknown): Promise => { + if (isAsyncIterable(raw)) { + const chunks: unknown[] = [] + for await (const chunk of raw) { + chunks.push(chunk) + } + return chunks.at(-1) + } + return await raw +} + +/** + * Map an AI-SDK tool's output to Pi content. Prefers the tool's `toModelOutput` + * (MCP tools always define one); otherwise dumps the raw output as JSON text. + */ +const toPiContent = async ( + tool: Tool, + args: { toolCallId: string; input: unknown; output: unknown }, +): Promise => { + if (!tool.toModelOutput) { + return [{ type: 'text', text: stringify(args.output) }] + } + const modelOutput = await tool.toModelOutput(args) + switch (modelOutput.type) { + case 'text': + case 'error-text': + return [{ type: 'text', text: modelOutput.value }] + case 'json': + case 'error-json': + return [{ type: 'text', text: stringify(modelOutput.value) }] + case 'execution-denied': + return [{ type: 'text', text: modelOutput.reason ?? 'Tool execution was denied.' }] + case 'content': + return modelOutput.value.map((item): PiContent => { + switch (item.type) { + case 'text': + return { type: 'text', text: item.text } + case 'image-data': + case 'media': + return { type: 'image', data: item.data, mimeType: item.mediaType } + case 'file-data': + return item.mediaType.startsWith('image/') + ? { type: 'image', data: item.data, mimeType: item.mediaType } + : { type: 'text', text: stringify(item) } + default: + return { type: 'text', text: stringify(item) } + } + }) + } +} + +/** + * Convert a single AI-SDK tool into a Pi {@link AgentTool}. The schema is resolved + * eagerly (Pi reads `parameters` synchronously when building the provider request). + */ +const toPiAgentTool = async (name: string, tool: Tool): Promise => { + const jsonSchema = await Promise.resolve(asSchema(tool.inputSchema).jsonSchema) + return { + name, + label: tool.title ?? name, + description: tool.description ?? '', + parameters: asPiParameters(jsonSchema), + execute: async (toolCallId, params, signal) => { + const { execute } = tool + if (!execute) { + throw new Error(`Cannot run tool "${name}": it has no execute function.`) + } + const output = await resolveExecuteOutput(execute(params, { toolCallId, messages: [], abortSignal: signal })) + const content = await toPiContent(tool, { toolCallId, input: params, output }) + if (isErrorOutput(output)) { + // Pi tools signal failure by throwing (its loop encodes that as an error + // tool result, mirroring Anthropic's `is_error`). Surface the MCP error + // text as a throw rather than masking it as a successful result. + const text = content.map((part) => (part.type === 'text' ? part.text : '[image]')).join('\n') + throw new Error(text || `Tool "${name}" returned an error.`) + } + return { content, details: output } + }, + } +} + +/** + * Convert an AI-SDK toolset (e.g. the merged MCP + integration tools) into Pi + * {@link AgentTool}s, preserving each tool's namespaced name as the Pi tool name. + * + * @param toolset - the app's `Record` (keys are namespaced tool names) + * @returns the equivalent Pi agent tools, ready to pass to `buildAppHarness({ tools })` + */ +export const toPiAgentTools = async (toolset: Record): Promise => + Promise.all(Object.entries(toolset).map(([name, tool]) => toPiAgentTool(name, tool))) diff --git a/shared/agent-core/pi-to-aisdk-stream.ts b/shared/agent-core/pi-to-aisdk-stream.ts new file mode 100644 index 000000000..ce9743440 --- /dev/null +++ b/shared/agent-core/pi-to-aisdk-stream.ts @@ -0,0 +1,371 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Translator: Pi {@link AgentHarness} run → AI SDK v5 UI message stream. + * + * This is the in-browser analogue of `src/acp/translators/acp-to-ai-sdk.ts`, + * which does the same job for an ACP `session/update` stream. The output + * `ReadableStream` matches what `createUIMessageStreamResponse` + * produces — each chunk is a UTF-8 `data: \n\n` line — so the app's chat + * transport consumes it directly from a `Response.body`. + * + * Event mapping (Pi `AgentHarnessEvent` → AI SDK chunk): + * agent_start → start + * turn_start → start-step + * message_update (text_delta) → text-start (once) → text-delta… + * message_update (thinking_delta) → reasoning-start (once) → reasoning-delta… + * message_end → close any open text/reasoning part + * tool_execution_start → tool-input-start + tool-input-available + * tool_execution_end → tool-output-available | tool-output-error + * turn_end (stopReason === 'error') → error (carrying message.errorMessage) + * turn_end → finish-step + * agent_end → finish + * + * Reasoning boundaries are synthesized from deltas, not from Pi's explicit + * `thinking_start`/`text_start` content events: reasoning opens on the first + * `thinking_delta` and closes the moment the first `text_delta` arrives. This + * mirrors the app's "reasoning duration ends when text begins" semantic and + * keeps the translator robust to providers that omit the explicit boundaries. + * + * Durations are emitted as `message-metadata` `reasoningTime` entries keyed to + * match `groupMessageParts`: reasoning by its 0-based ordinal (`reasoning-`) + * and tools by their `toolCallId`. The chat store deep-merges these chunks, so + * one entry per part accumulates rather than overwrites. + */ + +import type { AgentEvent, AgentHarness, AgentHarnessEvent } from '@earendil-works/pi-agent-core' + +const encoder = new TextEncoder() +const now = Date.now + +/** The `assistantMessageEvent` carried by a Pi `message_update` event. */ +type AssistantInnerEvent = Extract['assistantMessageEvent'] + +/** + * Minimal AI SDK v5 UI message stream chunk shapes this translator emits. Mirrors + * `src/acp/types.ts` (which itself mirrors `ai`'s `UIMessageChunk`), declaring + * only the variants we produce so an upstream change surfaces as a compile error. + * Re-declared here because `shared/` must not depend on app (`@/`) code. + */ +export type AiSdkChunk = + | { type: 'start'; messageId?: string } + | { type: 'start-step' } + | { type: 'text-start'; id: string } + | { type: 'text-delta'; id: string; delta: string } + | { type: 'text-end'; id: string } + | { type: 'reasoning-start'; id: string } + | { type: 'reasoning-delta'; id: string; delta: string } + | { type: 'reasoning-end'; id: string } + | { type: 'tool-input-start'; toolCallId: string; toolName: string; title?: string } + | { type: 'tool-input-available'; toolCallId: string; toolName: string; input: unknown; title?: string } + | { type: 'tool-output-available'; toolCallId: string; output: unknown } + | { type: 'tool-output-error'; toolCallId: string; errorText: string } + | { type: 'message-metadata'; messageMetadata: Record } + | { type: 'finish-step' } + | { type: 'finish' } + | { type: 'error'; errorText: string } + +/** Open reasoning part: its stream `id`, the `reasoningTime` key the UI expects, + * and the start timestamp used to compute its duration. */ +type ReasoningPart = { id: string; durationKey: string; startedAt: number } + +const encodeChunk = (chunk: AiSdkChunk): Uint8Array => encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`) +const encodeDone = (): Uint8Array => encoder.encode('data: [DONE]\n\n') + +/** Narrows an unknown tool-result content block to one carrying text. */ +const isTextContent = (block: unknown): block is { text: string } => + typeof block === 'object' && block !== null && typeof (block as { text?: unknown }).text === 'string' + +/** + * Derives a human error message from a Pi tool result by concatenating its text + * content blocks, falling back to compact JSON when none are present. + * + * @param result - the `AgentToolResult` from a `tool_execution_end` event + * @returns the joined error text (never empty) + */ +const toolErrorText = (result: unknown): string => { + if (typeof result === 'object' && result !== null) { + const content = (result as { content?: unknown }).content + if (Array.isArray(content)) { + const text = content + .filter(isTextContent) + .map((block) => block.text) + .join('') + .trim() + if (text.length > 0) { + return text + } + } + } + return JSON.stringify(result ?? {}) +} + +/** Stateful per-run translator. `handle` ingests harness events; `finish` + * guarantees a well-formed terminal sequence even when the run never reaches + * `agent_end` (e.g. the harness rejects before the loop starts). */ +type PiTranslator = { + /** Translate one harness event into zero or more emitted chunks. */ + handle: (event: AgentHarnessEvent) => void + /** Close any open parts and emit the terminal `finish`. With `errorText`, + * an `error` chunk is emitted first. Idempotent once the stream has finished. */ + finish: (errorText?: string) => void +} + +/** + * Builds a stateful translator that writes AI SDK chunks into `emit`. Splitting + * state from sinking lets the stream wrapper enqueue into a controller while a + * test could collect into an array. + * + * @param emit - sink invoked once per produced chunk + * @returns the translator's `handle`/`finish` surface + */ +const createPiTranslator = (emit: (chunk: AiSdkChunk) => void): PiTranslator => { + let started = false + let stepOpen = false + let finished = false + let reasoning: ReasoningPart | null = null + let text: { id: string } | null = null + // Run-global ordinals: part ids must be unique across the whole run, and the + // reasoning ordinal must match `groupMessageParts`' per-message counter. + let reasoningOrdinal = 0 + let textOrdinal = 0 + const toolStartTimes = new Map() + + const emitDuration = (key: string, elapsedMs: number): void => { + emit({ type: 'message-metadata', messageMetadata: { reasoningTime: { [key]: elapsedMs } } }) + } + + const closeReasoning = (): void => { + if (!reasoning) { + return + } + emit({ type: 'reasoning-end', id: reasoning.id }) + emitDuration(reasoning.durationKey, now() - reasoning.startedAt) + reasoning = null + } + + const closeText = (): void => { + if (!text) { + return + } + emit({ type: 'text-end', id: text.id }) + text = null + } + + const closeOpenParts = (): void => { + closeReasoning() + closeText() + } + + const ensureReasoningOpen = (): string => { + if (reasoning) { + return reasoning.id + } + // A new reasoning block means any prior text block has ended; keep parts + // non-overlapping so the chat store assembles them cleanly. + closeText() + const ordinal = reasoningOrdinal++ + reasoning = { id: `pi-reasoning-${ordinal}`, durationKey: `reasoning-${ordinal}`, startedAt: now() } + emit({ type: 'reasoning-start', id: reasoning.id }) + return reasoning.id + } + + const ensureTextOpen = (): string => { + if (text) { + return text.id + } + text = { id: `pi-text-${textOrdinal++}` } + emit({ type: 'text-start', id: text.id }) + return text.id + } + + const handleInner = (inner: AssistantInnerEvent): void => { + if (inner.type === 'thinking_delta') { + emit({ type: 'reasoning-delta', id: ensureReasoningOpen(), delta: inner.delta }) + return + } + if (inner.type === 'text_delta') { + closeReasoning() + emit({ type: 'text-delta', id: ensureTextOpen(), delta: inner.delta }) + } + } + + // Terminal sequence shared by `agent_end`, normal settlement, and the + // reject/abort backstop. Guarded by `finished` so it runs exactly once. + const finish = (errorText?: string): void => { + if (finished) { + return + } + if (!started) { + emit({ type: 'start' }) + started = true + } + closeOpenParts() + if (errorText !== undefined) { + emit({ type: 'error', errorText }) + } + if (stepOpen) { + emit({ type: 'finish-step' }) + stepOpen = false + } + emit({ type: 'finish' }) + finished = true + } + + const handle = (event: AgentHarnessEvent): void => { + switch (event.type) { + case 'agent_start': { + if (!started) { + emit({ type: 'start' }) + started = true + } + return + } + case 'turn_start': { + emit({ type: 'start-step' }) + stepOpen = true + return + } + case 'message_update': { + handleInner(event.assistantMessageEvent) + return + } + case 'message_end': { + closeOpenParts() + return + } + case 'tool_execution_start': { + toolStartTimes.set(event.toolCallId, now()) + const input: unknown = event.args ?? {} + emit({ + type: 'tool-input-start', + toolCallId: event.toolCallId, + toolName: event.toolName, + title: event.toolName, + }) + emit({ + type: 'tool-input-available', + toolCallId: event.toolCallId, + toolName: event.toolName, + input, + title: event.toolName, + }) + return + } + case 'tool_execution_end': { + if (event.isError) { + emit({ type: 'tool-output-error', toolCallId: event.toolCallId, errorText: toolErrorText(event.result) }) + } else { + emit({ type: 'tool-output-available', toolCallId: event.toolCallId, output: event.result as unknown }) + } + const startedAt = toolStartTimes.get(event.toolCallId) + if (startedAt !== undefined) { + toolStartTimes.delete(event.toolCallId) + emitDuration(event.toolCallId, now() - startedAt) + } + return + } + case 'turn_end': { + closeOpenParts() + const { message } = event + if ('stopReason' in message && message.stopReason === 'error') { + emit({ type: 'error', errorText: message.errorMessage ?? 'the request failed' }) + } + if (stepOpen) { + emit({ type: 'finish-step' }) + stepOpen = false + } + return + } + case 'agent_end': { + finish() + return + } + // Every other harness event (queue_update, tool_call/tool_result hooks, + // model/tools/resources updates, etc.) is irrelevant to the UI stream. + default: + return + } + } + + return { handle, finish } +} + +/** + * Subscribes to a Pi {@link AgentHarness} run and produces the AI SDK UI message + * stream the app's chat transport expects. The harness's own lifecycle events + * drive every chunk; `runPrompt` only *initiates* the run (and its settlement is + * the backstop that closes the stream), so the caller stays free to start the + * run however it likes — a plain prompt, a skill, or a template invocation: + * + * ```ts + * new Response( + * piHarnessToUiMessageStream(harness, async () => { + * await harness.prompt(text) + * await harness.waitForIdle() + * }), + * { headers: { 'Content-Type': 'text/event-stream' } }, + * ) + * ``` + * + * The stream is purely streaming — chunks are enqueued as events arrive, never + * buffered for the whole run. Cancelling the consumer (e.g. the user stops + * generation) aborts the harness and unsubscribes. + * + * @param harness - the harness whose run should be streamed + * @param runPrompt - thunk that starts the run and resolves once it settles + * @returns a `ReadableStream` of SSE-encoded AI SDK chunks for the `Response` body + */ +export const piHarnessToUiMessageStream = ( + harness: AgentHarness, + runPrompt: () => Promise, +): ReadableStream => { + let unsubscribe: (() => void) | null = null + let closed = false + + return new ReadableStream({ + start(controller) { + const translator = createPiTranslator((chunk) => { + if (!closed) { + controller.enqueue(encodeChunk(chunk)) + } + }) + unsubscribe = harness.subscribe((event) => translator.handle(event)) + + const finalize = (errorText?: string): void => { + if (closed) { + return + } + // Unsubscribe first so no further harness event races the terminal + // sequence, let `finish` emit its chunks while the gate is still open, + // and only then close the gate against any straggler from `cancel`. + unsubscribe?.() + unsubscribe = null + translator.finish(errorText) + closed = true + controller.enqueue(encodeDone()) + controller.close() + } + + // Drive the run off this start callback. A failed turn resolves with a + // `stopReason: 'error'` message (surfaced via `turn_end`), so a rejection + // here is an exceptional harness failure — surface it as a terminal error. + void (async () => { + try { + await runPrompt() + finalize() + } catch (error) { + finalize(error instanceof Error ? error.message : String(error)) + } + })() + }, + async cancel() { + closed = true + unsubscribe?.() + unsubscribe = null + await harness.abort() + }, + }) +} diff --git a/shared/agent-core/seed-history.ts b/shared/agent-core/seed-history.ts new file mode 100644 index 000000000..3c1f5127b --- /dev/null +++ b/shared/agent-core/seed-history.ts @@ -0,0 +1,49 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Maps a thread's prior conversation turns into Pi {@link AgentMessage}s so a + * freshly built harness starts with that history seeded into its session + * (`harness.appendMessage`). Without it the harness is prompted with only the + * latest user turn and the agent forgets everything said before — every turn + * would start from a blank transcript. + * + * Only the *text* of each prior turn is carried across: tool calls/results and + * images from earlier turns are intentionally dropped. Faithfully rebuilding + * Pi's `tool_use`/`tool_result` pairing (matched ids, schemas) from the AI-SDK UI + * message shape is fragile and unnecessary for conversational context — the agent + * re-runs any tool it still needs. Prior assistant turns are rebuilt via Pi's + * exported `fauxAssistantMessage` helper, the supported way to synthesize a + * well-formed `AssistantMessage` without hand-fabricating its usage/provider + * metadata (none of which is sent on the wire for a historical turn anyway). + */ + +import type { AgentMessage } from '@earendil-works/pi-agent-core' +import { fauxAssistantMessage } from '@earendil-works/pi-ai' + +/** A prior conversation turn reduced to its role and concatenated text. The app + * derives these from its `ThunderboltUIMessage[]` using app types only, so it can + * build the seed list without statically importing (and bundling) the engine. */ +export type SeedTurn = { + readonly role: 'user' | 'assistant' + readonly text: string +} + +/** + * Build the Pi {@link AgentMessage}s for a list of prior turns, ready to seed into + * a harness session in order. Empty-text turns are skipped so the transcript never + * carries a content-less message (e.g. an assistant turn that only ran tools). + * + * @param turns - prior conversation turns (role + text); omitted/all-empty yields `[]` + * @returns the equivalent Pi agent messages, in order + */ +export const buildSeedMessages = (turns: readonly SeedTurn[] = []): AgentMessage[] => + turns + .filter((turn) => turn.text.length > 0) + .map( + (turn): AgentMessage => + turn.role === 'user' + ? { role: 'user', content: turn.text, timestamp: Date.now() } + : fauxAssistantMessage(turn.text), + ) diff --git a/src/acp/built-in-adapter.ts b/src/acp/built-in-adapter.ts index 82cb32028..e1d921ae5 100644 --- a/src/acp/built-in-adapter.ts +++ b/src/acp/built-in-adapter.ts @@ -3,27 +3,258 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** - * Built-in adapter — wraps the existing `aiFetchStreamingResponse` pipeline so - * the chat layer can route every agent (built-in or ACP) through one - * `AgentAdapter` seam. No ACP handshake; `capabilities` is null; - * `disconnect()` is a no-op (the underlying pipeline is stateless per call). + * Built-in adapter — the app's first-party agent, exposed through the same + * `AgentAdapter` seam as every ACP agent. Selecting it must look identical to + * the user: the chat layer calls `adapter.fetch(init, ctx)` and streams the + * returned `Response` body unchanged. + * + * Engine routing (behind the seam, invisible to the chat layer): + * + * - **Anthropic models** run on the in-browser Pi {@link AgentHarness} + * (`shared/agent-core`): a real coding agent (bash/read/write/edit over an + * OPFS-backed ZenFS sandbox) whose LLM HTTP flows through the app's proxy + * fetch. Its Pi event stream is translated to the AI SDK v5 UI message + * stream by `piHarnessToUiMessageStream`. The engine is `import()`-ed lazily + * (see `fetchViaHarness`) so its ~8MB stays off the chat entry chunk. + * - **Every other provider** (tinfoil, thunderbolt-proxy, openai, custom, …) + * stays on the legacy `aiFetchStreamingResponse` pipeline. The Pi anthropic + * model is the only engine wired so far; this gate is the explicit seam for + * migrating the rest later. + * + * The harness is prompted with the latest user turn; prior turns are seeded into + * its session as history (`buildAppHarness({ history })`) so the agent has + * multi-turn context. Side-effecting tool calls (`bash`/`write`/`edit`/MCP) are + * gated on the chat layer's permission dialog; read-only `read` auto-allows. + * + * No ACP handshake either way; `capabilities` is null. The harness is built per + * `fetch` (in-process, no wire), so `ensureSession`/`disconnect` are no-ops — + * there is no persistent connection or session to warm or tear down. */ -import { aiFetchStreamingResponse } from '@/ai/fetch' +import { aiFetchStreamingResponse, mergeMcpTools } from '@/ai/fetch' import type { Agent, AgentAdapter, AgentAdapterContext } from '@/types/acp' +import type { ThunderboltUIMessage } from '@/types' +import type { SeedTurn } from '@shared/agent-core' +import type { PermissionOption, RequestPermissionResponse, ToolKind } from '@agentclientprotocol/sdk' +import type { ThinkingLevel, ToolCallEvent, ToolCallResult } from '@earendil-works/pi-agent-core' /** Production injection point — production binds to `aiFetchStreamingResponse`. */ export type AiFetchStreamingResponseFn = typeof aiFetchStreamingResponse export type BuiltInAdapterOptions = { - /** Inject for tests so we don't touch the AI SDK / DB / settings stack. */ + /** Inject for tests so we don't touch the AI SDK / DB / settings stack. Also + * the engine for every non-Pi provider (tinfoil/thunderbolt-proxy/openai/…). */ aiFetch?: AiFetchStreamingResponseFn } +/** Reasoning depth handed to the harness. Fixed for now — deriving it from the + * model profile is a follow-up (see the adapter's gap notes). */ +const defaultThinkingLevel: ThinkingLevel = 'medium' + +/** The two choices we surface for a built-in tool-call permission prompt. + * Stable ids so the response can be mapped back to allow/deny by kind. */ +const permissionOptions: readonly PermissionOption[] = [ + { optionId: 'allow', name: 'Allow', kind: 'allow_once' }, + { optionId: 'reject', name: 'Reject', kind: 'reject_once' }, +] + +/** Pi tools that run unguarded — pure reads with no side effects. Mirrors the + * CLI's gate (`cli/src/agent/permissions.ts`): only `read` auto-allows; + * `bash`/`write`/`edit` and every MCP tool still prompt. Prompting on reads is + * noise, and the legacy built-in path never prompted at all. */ +const readOnlyTools = new Set(['read']) + +/** Map a Pi coding-tool name to the closest ACP {@link ToolKind} so the + * permission dialog renders a sensible label. Unknown (e.g. MCP) tools fall + * back to `other`. */ +const toToolKind = (toolName: string): ToolKind => { + switch (toolName) { + case 'bash': + return 'execute' + case 'read': + return 'read' + case 'write': + case 'edit': + return 'edit' + default: + return 'other' + } +} + +/** Translate the user's permission response into a Pi `tool_call` hook result. + * A cancelled prompt or a reject-kind selection blocks the tool (Pi encodes a + * blocked call as an error tool result); anything else allows it. */ +const toToolCallResult = (response: RequestPermissionResponse): ToolCallResult | undefined => { + const { outcome } = response + if (outcome.outcome === 'cancelled') { + return { block: true, reason: 'Tool call was not approved.' } + } + const selected = permissionOptions.find((option) => option.optionId === outcome.optionId) + if (selected?.kind.startsWith('reject')) { + return { block: true, reason: 'Tool call was rejected.' } + } + return undefined +} + +/** The latest user turn to prompt with, plus the prior turns to seed as history. */ +type PreparedConversation = { + /** Prior conversation turns, oldest first, seeded into the harness session. */ + readonly history: SeedTurn[] + /** The latest user turn's text, used to start the run (skill-prefixed). */ + readonly prompt: string +} + +/** Concatenate a UI message's text parts (dropping tool/reasoning/file parts). */ +const messageText = (message: ThunderboltUIMessage): string => + message.parts + .filter((part): part is { type: 'text'; text: string } => part.type === 'text') + .map((part) => part.text) + .join('\n') + +/** Reduce a UI message to a seed turn, dropping non-conversational roles + * (`system`) and content-less turns (e.g. an assistant turn that only ran tools). */ +const toTurn = (message: ThunderboltUIMessage): SeedTurn[] => { + if (message.role !== 'user' && message.role !== 'assistant') { + return [] + } + const text = messageText(message) + return text.length > 0 ? [{ role: message.role, text }] : [] +} + +/** Collapse consecutive same-role turns into one (joining their text). The seeded + * transcript must strictly alternate: Anthropic rejects two same-role messages in + * a row and Pi's `convertToLlm` does not guard it, so dropping a content-less + * assistant turn (or a thread that already has same-role runs) must not leak two + * user/two assistant messages back-to-back. */ +const coalesceTurns = (turns: readonly SeedTurn[]): SeedTurn[] => + turns.reduce((acc, turn) => { + const prev = acc.at(-1) + if (prev && prev.role === turn.role) { + acc[acc.length - 1] = { role: turn.role, text: `${prev.text}\n\n${turn.text}` } + return acc + } + acc.push(turn) + return acc + }, []) + +/** Split the AI SDK request body into the latest user prompt and the prior turns + * to seed as multi-turn history. The chat transport posts the full + * `{ messages: ThunderboltUIMessage[], id }`; the transcript is reduced to + * alternating text turns whose trailing entry is always the latest user turn — + * that becomes the prompt (optionally skill-prefixed), and everything before it is + * seeded as history so the agent remembers the conversation. */ +const prepareConversation = (init: RequestInit, skillInstructions: string[] | undefined): PreparedConversation => { + if (typeof init.body !== 'string') { + throw new Error('Built-in adapter expects a string body on init') + } + const { messages } = JSON.parse(init.body) as { messages: ThunderboltUIMessage[] } + const lastUserIndex = messages.findLastIndex((message) => message.role === 'user') + if (lastUserIndex === -1) { + throw new Error('Built-in adapter: no user message in request body') + } + const turns = coalesceTurns([ + ...messages.slice(0, lastUserIndex).flatMap(toTurn), + { role: 'user', text: messageText(messages[lastUserIndex]) }, + ]) + const promptTurn = turns[turns.length - 1] + const history = turns.slice(0, -1) + const prompt = + skillInstructions && skillInstructions.length > 0 + ? `${skillInstructions.join('\n\n')}\n\n${promptTurn.text}` + : promptTurn.text + return { history, prompt } +} + +/** Resolve to a cancelled outcome when `signal` aborts. Raced against the + * permission dialog so stopping generation mid-prompt settles the harness's + * pending tool-call hook instead of leaving it awaiting a dialog that will + * never be answered (which would dangle the aborted run). */ +const cancelledOnAbort = (signal: AbortSignal): Promise => + new Promise((resolve) => { + if (signal.aborted) { + resolve({ outcome: { outcome: 'cancelled' } }) + return + } + signal.addEventListener('abort', () => resolve({ outcome: { outcome: 'cancelled' } }), { once: true }) + }) + +/** Run the built-in request on the in-browser Pi harness and return its stream + * as the AI SDK UI message stream `Response`. */ +const fetchViaHarness = async (init: RequestInit, context: AgentAdapterContext): Promise => { + // Sanctioned route-splitting exception (CLAUDE.md "Route-level Code Splitting"). + // The Pi engine (`pi-*`, `zenfs`, `just-bash`, `@anthropic-ai/sdk` — ~8MB) must + // NOT sit in the chat entry chunk on the critical landing path. This dynamic + // import keeps it in a separate async chunk that loads only when a built-in + // Anthropic agent actually runs; the legacy path's imports stay static. + const { buildAppHarness, piHarnessToUiMessageStream, toPiAgentTools } = await import('@shared/agent-core') + + const { history, prompt } = prepareConversation(init, context.skillInstructions) + + // The thread's MCP servers become Pi tools (namespaced `_`), reusing + // the legacy pipeline's merge/prefix logic. Only tool-capable models reach here — + // the harness always adds the four coding tools, so no-tools models route to legacy. + const { toolset } = await mergeMcpTools({}, context.mcpClients, context.reconnectClient) + const tools = await toPiAgentTools(toolset) + + const harness = await buildAppHarness({ + apiKey: context.selectedModel.apiKey ?? '', + fetch: context.getProxyFetch(), + modelId: context.selectedModel.model, + systemPrompt: context.selectedMode.systemPrompt ?? '', + thinkingLevel: defaultThinkingLevel, + tools, + history, + }) + + // Gate side-effecting tool calls on the chat layer's permission dialog; read-only + // tools auto-allow (no prompt). Without a `requestPermission` sink the hook is + // left unregistered so every tool auto-runs. + const { requestPermission } = context + const signal = init.signal + if (requestPermission) { + harness.on('tool_call', async (event: ToolCallEvent) => { + if (readOnlyTools.has(event.toolName)) { + return undefined + } + const ask = requestPermission({ + sessionId: context.threadId, + toolCall: { + toolCallId: event.toolCallId, + title: event.toolName, + kind: toToolKind(event.toolName), + rawInput: event.input, + status: 'pending', + }, + options: [...permissionOptions], + }) + const response = signal ? await Promise.race([ask, cancelledOnAbort(signal)]) : await ask + return toToolCallResult(response) + }) + } + + return new Response( + piHarnessToUiMessageStream(harness, async () => { + await harness.prompt(prompt) + await harness.waitForIdle() + }), + { status: 200, headers: { 'Content-Type': 'text/event-stream' } }, + ) +} + +/** + * Build the built-in agent's {@link AgentAdapter}. Its `fetch` routes Anthropic + * models to the in-browser Pi harness and every other provider to the legacy + * `aiFetchStreamingResponse` pipeline (overridable via `options.aiFetch`). + * + * @param agent - the built-in `Agent` row this adapter represents + * @param options - test/override seam for the legacy fetch engine + * @returns an adapter with `capabilities: null` and no-op session lifecycle + */ export const createBuiltInAdapter = (agent: Agent, options: BuiltInAdapterOptions = {}): AgentAdapter => { const aiFetch = options.aiFetch ?? aiFetchStreamingResponse - const fetch = (init: RequestInit, context: AgentAdapterContext): Promise => + /** Legacy engine — every provider the Pi harness doesn't (yet) serve. */ + const fetchViaLegacyPipeline = (init: RequestInit, context: AgentAdapterContext): Promise => aiFetch({ init, modelId: context.selectedModel.id, @@ -35,11 +266,19 @@ export const createBuiltInAdapter = (agent: Agent, options: BuiltInAdapterOption getProxyFetch: context.getProxyFetch, }) + // Route tool-capable Anthropic models to the in-browser Pi harness; everything + // else (other providers, or a no-tools Anthropic model the harness can't honor + // since it always activates coding tools) stays on the legacy pipeline. + const fetch = (init: RequestInit, context: AgentAdapterContext): Promise => + context.selectedModel.provider === 'anthropic' && context.selectedModel.toolUsage !== 0 + ? fetchViaHarness(init, context) + : fetchViaLegacyPipeline(init, context) + return { agent, capabilities: null, fetch, - // No ACP session to warm — the built-in pipeline advertises no commands. + // No ACP session and no persistent harness — the engine is built per fetch. ensureSession: async () => {}, disconnect: () => {}, } diff --git a/vite.config.ts b/vite.config.ts index 220035ee2..3a94d1098 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -113,6 +113,61 @@ export default defineConfig({ // machinery into the lazy PowerSync chunk. Like powersync-web-internal above, // lib/ is an internal path — verify it still exists when upgrading the package. '@powersync/common': path.resolve(__dirname, 'node_modules/@powersync/common/lib/index.js'), + // The in-browser Pi harness (lazy `@shared/agent-core` chunk) pulls Pi's Node + // child-process helper, which imports `cross-spawn` (and, transitively, `which`). + // Both evaluate `process.platform` at module scope, throwing + // `ReferenceError: process is not defined` on import in the browser — before any + // LLM call. The harness never resolves OS executables (bash runs through + // BrowserExecutionEnv / just-bash over ZenFS), so these modules are dead weight + // on the browser path; alias them to throw-on-call stubs (they load fine; only a + // real call throws). A bare-specifier alias catches every copy regardless of + // nesting and is honored by both the dev dep optimizer and the production build + // (both Rolldown-based in Vite 8). + 'cross-spawn': path.resolve(__dirname, './shared/agent-core/browser-stubs/cross-spawn.ts'), + which: path.resolve(__dirname, './shared/agent-core/browser-stubs/which.ts'), + // Pi is a Node CLI: a few of its modules import these builtins at module scope + // (`config.js` → url+path, the clipboard helper → url+module+path). Vite's + // default `browser-external:*` leaves the named exports undefined, so importing + // Pi throws (e.g. "fileURLToPath is not a function"). Map them to browser shims: + // `path` to the battle-tested `path-browserify` (its functions also run at + // browser runtime when the read/write/edit tools resolve paths), and `url`/ + // `module` to tiny stubs that satisfy the module-scope reads. (The bare + // `process` global is handled separately in shared/agent-core/index.ts.) + url: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-url.ts'), + 'node:url': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-url.ts'), + module: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-module.ts'), + 'node:module': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-module.ts'), + path: 'path-browserify', + 'node:path': 'path-browserify', + // Pi also touches `fs`/`os` (config/package detection) and `crypto` + // (runtime id generation) — Vite's `browser-external:*` leaves these + // undefined. `crypto` delegates to the browser's native Web Crypto (real + // `randomUUID`/`randomBytes`); `fs`/`os` present an empty filesystem so Pi + // falls back to defaults (the harness's real I/O goes through ZenFS, never + // these). No app code imports these in the browser — only Pi does. + // NOTE: `fs/promises` MUST precede `fs` — a string alias matches `find` and + // `find/*`, so `fs` would otherwise swallow `fs/promises` → `node-fs.ts/promises`. + 'fs/promises': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-fs-promises.ts'), + 'node:fs/promises': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-fs-promises.ts'), + // node-fs is CommonJS (not ESM) so `graceful-fs` can monkey-patch it in place. + fs: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-fs.cjs'), + 'node:fs': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-fs.cjs'), + // `graceful-fs` calls `require('constants').hasOwnProperty(...)`; the + // browser-external proxy's `hasOwnProperty` isn't callable, so give it a real object. + constants: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-constants.cjs'), + 'node:constants': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-constants.cjs'), + os: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-os.ts'), + 'node:os': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-os.ts'), + crypto: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-crypto.ts'), + 'node:crypto': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-crypto.ts'), + // pi-tui extends `EventEmitter`; map `events` to its browser polyfill (explicit + // file path so the alias can't resolve back to the externalized Node builtin). + events: path.resolve(__dirname, './node_modules/events/events.js'), + 'node:events': path.resolve(__dirname, './node_modules/events/events.js'), + // `undici` (Pi's Node HTTP dispatcher) extends Node stream/net/tls classes at + // module scope and is never used in the browser (model calls go through the + // injected proxy fetch). Stub it so its Node-only graph stays out of the bundle. + undici: path.resolve(__dirname, './shared/agent-core/browser-stubs/undici.ts'), }, conditions: ['browser'], }, From b8c246195687e8a7a49614f19e20cacbbdef18fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Menezes?= Date: Sun, 28 Jun 2026 21:47:51 -0300 Subject: [PATCH 03/86] feat: add iroh P2P transport for the acp/mcp bridges --- cli/bun.lock | 25 ++++++++ cli/package.json | 3 +- cli/src/agent/types.ts | 41 +++++++++++-- cli/src/cli.ts | 123 ++++++++++++++++++++++++++++++------- cli/src/commands/bridge.ts | 15 +++-- cli/src/index.ts | 22 ++++++- cli/src/iroh/admin.ts | 54 ++++++++++++++++ cli/src/iroh/allowlist.ts | 50 +++++++++++++++ cli/src/iroh/bridge.ts | 116 ++++++++++++++++++++++++++++++++++ cli/src/iroh/connect.ts | 93 ++++++++++++++++++++++++++++ cli/src/iroh/endpoint.ts | 89 +++++++++++++++++++++++++++ cli/src/iroh/identity.ts | 54 ++++++++++++++++ cli/src/iroh/paths.ts | 27 ++++++++ cli/src/iroh/pump.ts | 57 +++++++++++++++++ cli/src/iroh/storage.ts | 63 +++++++++++++++++++ 15 files changed, 798 insertions(+), 34 deletions(-) create mode 100644 cli/src/iroh/admin.ts create mode 100644 cli/src/iroh/allowlist.ts create mode 100644 cli/src/iroh/bridge.ts create mode 100644 cli/src/iroh/connect.ts create mode 100644 cli/src/iroh/endpoint.ts create mode 100644 cli/src/iroh/identity.ts create mode 100644 cli/src/iroh/paths.ts create mode 100644 cli/src/iroh/pump.ts create mode 100644 cli/src/iroh/storage.ts diff --git a/cli/bun.lock b/cli/bun.lock index 6f506ebff..ee94594ef 100644 --- a/cli/bun.lock +++ b/cli/bun.lock @@ -8,6 +8,7 @@ "@earendil-works/pi-agent-core": "0.80.2", "@earendil-works/pi-ai": "0.80.2", "@earendil-works/pi-coding-agent": "0.80.2", + "@number0/iroh": "^1.0.0", }, "devDependencies": { "@types/bun": "^1.2.20", @@ -104,6 +105,30 @@ "@mistralai/mistralai": ["@mistralai/mistralai@2.2.6", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.40.0", "ws": "^8.18.0", "zod": "^3.25.0 || ^4.0.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-W8pX7zHxjJvMIpw8JMxeJEleapXX0Q9NPszdNzqkM3MIEoIGPObdodujj+WHteXEvGfaP/AMwlNyRfEzSY6dQQ=="], + "@number0/iroh": ["@number0/iroh@1.0.0", "", { "optionalDependencies": { "@number0/iroh-android-arm-eabi": "1.0.0", "@number0/iroh-android-arm64": "1.0.0", "@number0/iroh-darwin-arm64": "1.0.0", "@number0/iroh-linux-arm-gnueabihf": "1.0.0", "@number0/iroh-linux-arm-musleabihf": "1.0.0", "@number0/iroh-linux-arm64-gnu": "1.0.0", "@number0/iroh-linux-arm64-musl": "1.0.0", "@number0/iroh-linux-x64-gnu": "1.0.0", "@number0/iroh-linux-x64-musl": "1.0.0", "@number0/iroh-win32-arm64-msvc": "1.0.0", "@number0/iroh-win32-x64-msvc": "1.0.0" } }, "sha512-QeuRYxfLPm8HGbWKYpZZA//hCn8J+WO8hVrEAU2VQG0BLnfHTX9tcqGbQJLzcePFdtFVVXVIkm3IkSAUWajOXg=="], + + "@number0/iroh-android-arm-eabi": ["@number0/iroh-android-arm-eabi@1.0.0", "", { "os": "android", "cpu": "arm" }, "sha512-AkrdmoQ2YhC+X0JgD14SNE+KOSGLKC8z5HSWnPY5tvSXrASPbwCtvWFCVmyPKWj2kQHv0blMI5lBGeGFe+v54w=="], + + "@number0/iroh-android-arm64": ["@number0/iroh-android-arm64@1.0.0", "", { "os": "android", "cpu": "arm64" }, "sha512-EkZh6hl5XJ1JQlWWANc2yDdScP5yGbi9IlF9bttd4DuUelAI8yqEMzXq4YdPB0kQqPlmPk8nEGLEtPWbVCNTLg=="], + + "@number0/iroh-darwin-arm64": ["@number0/iroh-darwin-arm64@1.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zmf9CE1l6TWy9zDlNs3EvcxPxHfVQKvkod7wuF6llkGi/2WaSRc+x1vaaMEfpguaxnRfP4NNvIKyy8Ni4imIQg=="], + + "@number0/iroh-linux-arm-gnueabihf": ["@number0/iroh-linux-arm-gnueabihf@1.0.0", "", { "os": "linux", "cpu": "arm" }, "sha512-obp3eZIJrOGD0rUL1Y0SSCFUNa6NQAsZS+z2khmurqD/rOIIjzvVNYakS4+MEWQLzF1acuUvN7aprHAceUkiuQ=="], + + "@number0/iroh-linux-arm-musleabihf": ["@number0/iroh-linux-arm-musleabihf@1.0.0", "", { "os": "linux", "cpu": "arm" }, "sha512-5OXTzmdej7CPaQCReg3vf0/jDCRdVgiOsbC0gcyoPBOdNPs7tZgSoXRBQsod7ioObrjegPM2UfvdF+bIyGst4Q=="], + + "@number0/iroh-linux-arm64-gnu": ["@number0/iroh-linux-arm64-gnu@1.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-whQ36eFP+9aYRJxpZn/Q35EVlvEJm45AFSO2mfctVYvZFJKC/YjZWue4p60VWuW4/yBdjBTErwUum5mMppoeLQ=="], + + "@number0/iroh-linux-arm64-musl": ["@number0/iroh-linux-arm64-musl@1.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Xb4Yy9I2MXlv2SeZZcEIkJIgG1do+5F4R5GkXb4L0if/5vTuuKj7KGQE/ehaIJjNcv+TE+KIOhUvGCxO02l7Nw=="], + + "@number0/iroh-linux-x64-gnu": ["@number0/iroh-linux-x64-gnu@1.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ZOOWURPAWhnBmj5ElLaB/wCjoWNdrjOblaOs0YViW+dlTc5qwInSGJdYEDRdSoZ61MIP0gI2H9EwENe8UYWRcg=="], + + "@number0/iroh-linux-x64-musl": ["@number0/iroh-linux-x64-musl@1.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-sJzuehJ9BnuZe4lnP6cWA1wDedC+rbOiI/Hu4V9BGTUE50Z/s28rXDQFJCqVWz1qseXCqHYQ/Jt3U1XdX+Gmtw=="], + + "@number0/iroh-win32-arm64-msvc": ["@number0/iroh-win32-arm64-msvc@1.0.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-7KgpUvinndcJnQgbYdV0zs7nGTxKi9zZDBxyTX9PRlQm/9TfTDZhSkur+sZYW2xca2P31XGkjZYZ78yAjYviqQ=="], + + "@number0/iroh-win32-x64-msvc": ["@number0/iroh-win32-x64-msvc@1.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-mNgHds9US3IWfrvZn+yBuyE/kjrM//jSFpWn1llu3aiNgGq8Rf7yW2TJWvmrFT+eeTi2osOsh1nJfykXTe9xYQ=="], + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.41.1", "", {}, "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA=="], diff --git a/cli/package.json b/cli/package.json index a08193b11..e16615ae3 100644 --- a/cli/package.json +++ b/cli/package.json @@ -22,7 +22,8 @@ "dependencies": { "@earendil-works/pi-agent-core": "0.80.2", "@earendil-works/pi-ai": "0.80.2", - "@earendil-works/pi-coding-agent": "0.80.2" + "@earendil-works/pi-coding-agent": "0.80.2", + "@number0/iroh": "^1.0.0" }, "devDependencies": { "@types/bun": "^1.2.20", diff --git a/cli/src/agent/types.ts b/cli/src/agent/types.ts index b770218a7..139bf412e 100644 --- a/cli/src/agent/types.ts +++ b/cli/src/agent/types.ts @@ -27,9 +27,13 @@ export type HarnessBundle = { export type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' /** Wire protocol whose local stdio process the bridge exposes over the network. - * Drives only logging — the stdio↔WebSocket pump is byte-identical for both. */ + * Drives only logging — the stdio↔transport pump is byte-identical for both. */ export type BridgeProtocol = 'acp' | 'mcp' +/** Network transport a bridge exposes its stdio process over. `wss` is a + * loopback-only WebSocket; `iroh` is the authenticated P2P/E2E transport. */ +export type BridgeTransport = 'wss' | 'iroh' + /** * Fully-resolved configuration for an `acp`/`mcp` bridge invocation, produced by * {@link parseArgs} and consumed by the bridge runner. @@ -37,14 +41,35 @@ export type BridgeProtocol = 'acp' | 'mcp' export type BridgeConfig = { /** Which protocol's stdio process is being bridged. */ readonly protocol: BridgeProtocol - /** Network transport exposing the process. Only `wss` exists today. */ - readonly transport: 'wss' - /** TCP port the WebSocket server listens on (`0` lets the OS assign one). */ + /** Network transport exposing the process. */ + readonly transport: BridgeTransport + /** TCP port the WebSocket server listens on (`wss` only; ignored by `iroh`). */ readonly port: number /** The spawned stdio agent command: `command[0]` is the executable. */ readonly command: readonly string[] } +/** + * Configuration for an `acp`/`mcp connect` invocation: dial a remote iroh bridge + * and pump a local client into it. + */ +export type ConnectConfig = { + /** Which protocol the local client speaks (drives only logging). */ + readonly protocol: BridgeProtocol + /** The remote bridge to dial: a connection ticket or a bare NodeId. */ + readonly target: string + /** Optional local stdio client to spawn; empty means bridge this process's + * own stdin/stdout (so a JSON-RPC line can be piped through). */ + readonly command: readonly string[] +} + +/** A `thunderbolt iroh` admin action: inspect identity, mint a pairing ticket, + * or extend the peer allowlist. */ +export type IrohAdminAction = + | { readonly kind: 'id' } + | { readonly kind: 'pair' } + | { readonly kind: 'allow'; readonly nodeId: string } + /** Settings common to every run, independent of oneshot vs REPL mode. */ type RunConfigBase = { /** Anthropic model id (defaults to `claude-opus-4-8`). */ @@ -63,12 +88,16 @@ type RunConfigBase = { * makes `prompt` present exactly when (and only when) it's a oneshot run. */ export type RunConfig = - (RunConfigBase & { readonly mode: 'oneshot'; readonly prompt: string }) | (RunConfigBase & { readonly mode: 'repl' }) + | (RunConfigBase & { readonly mode: 'oneshot'; readonly prompt: string }) + | (RunConfigBase & { readonly mode: 'repl' }) -/** Result of parsing argv: a run, a bridge, or a terminal info action. */ +/** Result of parsing argv: a run, a bridge, a connect, an iroh admin action, + * or a terminal info action. */ export type ParsedArgs = | { readonly kind: 'run'; readonly config: RunConfig } | { readonly kind: 'bridge'; readonly config: BridgeConfig } + | { readonly kind: 'connect'; readonly config: ConnectConfig } + | { readonly kind: 'iroh-admin'; readonly action: IrohAdminAction } | { readonly kind: 'help' } | { readonly kind: 'version' } | { readonly kind: 'error'; readonly message: string } diff --git a/cli/src/cli.ts b/cli/src/cli.ts index fc376f247..f882a0288 100644 --- a/cli/src/cli.ts +++ b/cli/src/cli.ts @@ -8,7 +8,14 @@ * No I/O happens here — the caller decides what to do with the result. */ -import type { BridgeConfig, BridgeProtocol, ParsedArgs, RunConfig, ThinkingLevel } from './agent/types.ts' +import type { + BridgeConfig, + BridgeProtocol, + BridgeTransport, + ParsedArgs, + RunConfig, + ThinkingLevel, +} from './agent/types.ts' /** Released version of the CLI, surfaced by `--version` and the banner. */ export const VERSION = '0.1.0' @@ -19,8 +26,11 @@ const DEFAULT_MODEL = 'claude-opus-4-8' /** All valid `--thinking` levels, in increasing depth. */ const THINKING_LEVELS: readonly ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh'] -/** The only `--transport` value supported today. `iroh` (P2P) is planned. */ -const SUPPORTED_TRANSPORT = 'wss' +/** Default `--transport` when omitted (loopback WebSocket). */ +const DEFAULT_TRANSPORT: BridgeTransport = 'wss' + +/** All supported `--transport` values: `wss` (loopback) and `iroh` (P2P/E2E). */ +const TRANSPORTS: readonly BridgeTransport[] = ['wss', 'iroh'] /** Default `--port` per bridge protocol — distinct so `acp` and `mcp` bridges * can run side by side without colliding on their defaults. */ @@ -32,16 +42,19 @@ export const HELP_TEXT = `⚡ thunderbolt v${VERSION} — a single-binary termin USAGE thunderbolt [options] [prompt] thunderbolt agent [options] [prompt] - thunderbolt acp --transport ${SUPPORTED_TRANSPORT} [--port N] -- - thunderbolt mcp --transport ${SUPPORTED_TRANSPORT} [--port N] -- + thunderbolt acp --transport [--port N] -- + thunderbolt mcp --transport [--port N] -- + thunderbolt acp connect [-- ] + thunderbolt iroh > With a prompt, runs it once and exits. With no prompt, starts an interactive REPL. Built on the Pi harness; talks to Claude. SUBCOMMANDS agent run the coding agent (default when omitted) - acp bridge a local stdio ACP agent onto a WebSocket the app can reach - mcp bridge a local stdio MCP server onto a WebSocket the app can reach + acp bridge a local stdio ACP agent over the network the app can reach + mcp bridge a local stdio MCP server over the network the app can reach + iroh manage the P2P identity / pairing ticket / peer allowlist TOOLS bash run shell commands @@ -58,17 +71,27 @@ OPTIONS -v, --version print the version and exit BRIDGE OPTIONS (acp / mcp) - --transport network transport: ${SUPPORTED_TRANSPORT} (default: ${SUPPORTED_TRANSPORT}) - --port listen port (default: acp ${DEFAULT_BRIDGE_PORT.acp}, mcp ${DEFAULT_BRIDGE_PORT.mcp}) + --transport network transport: ${TRANSPORTS.join(' | ')} (default: ${DEFAULT_TRANSPORT}) + --port listen port, wss only (default: acp ${DEFAULT_BRIDGE_PORT.acp}, mcp ${DEFAULT_BRIDGE_PORT.mcp}) -- everything after this is the stdio command to spawn +IROH TRANSPORT (P2P, end-to-end encrypted) + thunderbolt iroh id print this node's NodeId + connection ticket + thunderbolt iroh pair print a ticket to share out-of-band + thunderbolt iroh allow trust a peer (the allowlist is the auth gate) + Only allowlisted peers may drive an iroh bridge; the NodeId is an ed25519 key, + so the QUIC handshake authenticates and end-to-end encrypts every session. + EXAMPLES thunderbolt "fix the failing test in utils.ts" thunderbolt --thinking high "refactor the auth module" thunderbolt --yolo "run the test suite and fix what breaks" thunderbolt - thunderbolt acp --transport ${SUPPORTED_TRANSPORT} -- npx @zed-industries/claude-code-acp - thunderbolt mcp --transport ${SUPPORTED_TRANSPORT} --port 9001 -- uvx mcp-server-fetch + thunderbolt acp --transport wss -- npx @zed-industries/claude-code-acp + thunderbolt mcp --transport wss --port 9001 -- uvx mcp-server-fetch + thunderbolt acp --transport iroh -- npx @zed-industries/claude-code-acp + thunderbolt iroh id + thunderbolt acp connect endpoint1abc… # dial a remote iroh bridge Requires ANTHROPIC_API_KEY (https://console.anthropic.com).` @@ -128,12 +151,15 @@ const scanTokens = (tokens: readonly string[], index: number, flags: Flags): Sca } /** Bridge flag state accumulated while scanning the tokens before `--`. */ -type BridgeFlags = { readonly transport: 'wss'; readonly port: number } +type BridgeFlags = { readonly transport: BridgeTransport; readonly port: number } type BridgeScanResult = | { readonly ok: true; readonly flags: BridgeFlags } | { readonly ok: false; readonly message: string } +/** Type guard: is `value` a supported {@link BridgeTransport}? */ +const isTransport = (value: string): value is BridgeTransport => (TRANSPORTS as readonly string[]).includes(value) + /** * Folds the bridge flag tokens (everything before the `--` separator) into * {@link BridgeFlags}. Only `--transport` and `--port` are recognized; an @@ -147,13 +173,13 @@ const scanBridgeFlags = (tokens: readonly string[], index: number, flags: Bridge if (token === '--transport') { if (next === undefined) return { ok: false, message: 'thunderbolt: --transport requires a value' } - if (next === 'iroh') { - return { ok: false, message: "thunderbolt: --transport 'iroh' is not available yet (P2P transport is planned); use 'wss'" } - } - if (next !== SUPPORTED_TRANSPORT) { - return { ok: false, message: `thunderbolt: invalid --transport '${next}' (only '${SUPPORTED_TRANSPORT}' is supported)` } + if (!isTransport(next)) { + return { + ok: false, + message: `thunderbolt: invalid --transport '${next}' (expected one of: ${TRANSPORTS.join(', ')})`, + } } - return scanBridgeFlags(tokens, index + 2, { ...flags, transport: SUPPORTED_TRANSPORT }) + return scanBridgeFlags(tokens, index + 2, { ...flags, transport: next }) } if (token === '--port') { @@ -165,7 +191,10 @@ const scanBridgeFlags = (tokens: readonly string[], index: number, flags: Bridge return scanBridgeFlags(tokens, index + 2, { ...flags, port: Number(next) }) } - return { ok: false, message: `thunderbolt: unrecognized bridge option '${token}' (did you forget '--' before the command?)` } + return { + ok: false, + message: `thunderbolt: unrecognized bridge option '${token}' (did you forget '--' before the command?)`, + } } /** @@ -179,13 +208,13 @@ const parseBridgeArgs = (protocol: BridgeProtocol, rest: string[]): ParsedArgs = if (flagTokens.includes('--help') || flagTokens.includes('-h')) return { kind: 'help' } - const scan = scanBridgeFlags(flagTokens, 0, { transport: SUPPORTED_TRANSPORT, port: DEFAULT_BRIDGE_PORT[protocol] }) + const scan = scanBridgeFlags(flagTokens, 0, { transport: DEFAULT_TRANSPORT, port: DEFAULT_BRIDGE_PORT[protocol] }) if (!scan.ok) return { kind: 'error', message: scan.message } if (command.length === 0) { return { kind: 'error', - message: `thunderbolt ${protocol}: missing agent command (e.g. thunderbolt ${protocol} --transport ${SUPPORTED_TRANSPORT} -- )`, + message: `thunderbolt ${protocol}: missing agent command (e.g. thunderbolt ${protocol} --transport ${DEFAULT_TRANSPORT} -- )`, } } @@ -193,6 +222,52 @@ const parseBridgeArgs = (protocol: BridgeProtocol, rest: string[]): ParsedArgs = return { kind: 'bridge', config } } +/** + * Parses an `acp`/`mcp connect` invocation: dial a remote iroh bridge by ticket + * or NodeId, optionally spawning a local client after `--`. The first token is + * the dial target; everything after `--` is the local stdio command. + */ +const parseConnectArgs = (protocol: BridgeProtocol, rest: string[]): ParsedArgs => { + if (rest.includes('--help') || rest.includes('-h')) return { kind: 'help' } + + const separator = rest.indexOf('--') + const before = separator === -1 ? rest : rest.slice(0, separator) + const command = separator === -1 ? [] : rest.slice(separator + 1) + + const target = before[0] + if (target === undefined) { + return { kind: 'error', message: `thunderbolt ${protocol} connect: missing to dial` } + } + if (before.length > 1) { + return { + kind: 'error', + message: `thunderbolt ${protocol} connect: unexpected argument '${before[1]}' (did you forget '--' before the command?)`, + } + } + + return { kind: 'connect', config: { protocol, target, command } } +} + +/** + * Parses a `thunderbolt iroh` admin invocation into its sub-action + * (`id` | `pair` | `allow `). + */ +const parseIrohAdminArgs = (rest: string[]): ParsedArgs => { + const action = rest[0] + if (action === undefined || action === '--help' || action === '-h') return { kind: 'help' } + if (action === 'id') return { kind: 'iroh-admin', action: { kind: 'id' } } + if (action === 'pair') return { kind: 'iroh-admin', action: { kind: 'pair' } } + if (action === 'allow') { + const nodeId = rest[1] + if (nodeId === undefined) return { kind: 'error', message: 'thunderbolt iroh allow: missing ' } + return { kind: 'iroh-admin', action: { kind: 'allow', nodeId } } + } + return { + kind: 'error', + message: `thunderbolt iroh: unknown action '${action}' (expected: id | pair | allow )`, + } +} + /** * Parses CLI arguments (already stripped of runtime/script — pass * `Bun.argv.slice(2)`) into a {@link ParsedArgs}. Pure: no I/O, no exits. @@ -203,7 +278,11 @@ const parseBridgeArgs = (protocol: BridgeProtocol, rest: string[]): ParsedArgs = */ export const parseArgs = (argv: string[]): ParsedArgs => { const subcommand = argv[0] - if (subcommand === 'acp' || subcommand === 'mcp') return parseBridgeArgs(subcommand, argv.slice(1)) + if (subcommand === 'iroh') return parseIrohAdminArgs(argv.slice(1)) + if (subcommand === 'acp' || subcommand === 'mcp') { + if (argv[1] === 'connect') return parseConnectArgs(subcommand, argv.slice(2)) + return parseBridgeArgs(subcommand, argv.slice(1)) + } if (argv.includes('--help') || argv.includes('-h')) return { kind: 'help' } if (argv.includes('--version') || argv.includes('-v')) return { kind: 'version' } diff --git a/cli/src/commands/bridge.ts b/cli/src/commands/bridge.ts index 4e22a6b73..87d26a191 100644 --- a/cli/src/commands/bridge.ts +++ b/cli/src/commands/bridge.ts @@ -30,7 +30,10 @@ type BridgeSocketData = { } type BridgeSocket = ServerWebSocket -type BridgeProc = Subprocess<'pipe', 'pipe', 'inherit'> + +/** A bridged stdio subprocess: piped stdin/stdout, inherited stderr. Shared by + * the WebSocket and iroh transports, which pump it identically. */ +export type BridgeProc = Subprocess<'pipe', 'pipe', 'inherit'> /** One-shot decoder for the rare binary inbound frame. Safe to share: it's only * ever called without `{ stream: true }`, so it holds no cross-call state. The @@ -70,11 +73,13 @@ const pumpStdoutToSocket = async (proc: BridgeProc, ws: BridgeSocket): Promise { +export const spawnAgent = (command: readonly string[]): BridgeProc | null => { try { return Bun.spawn({ cmd: [...command], stdin: 'pipe', stdout: 'pipe', stderr: 'inherit' }) } catch (err) { - process.stderr.write(`thunderbolt bridge: failed to spawn '${command[0]}': ${err instanceof Error ? err.message : String(err)}\n`) + process.stderr.write( + `thunderbolt bridge: failed to spawn '${command[0]}': ${err instanceof Error ? err.message : String(err)}\n`, + ) return null } } @@ -108,7 +113,9 @@ export const runBridge = async (config: BridgeConfig): Promise => { try { await pumpStdoutToSocket(proc, ws) } catch (err) { - process.stderr.write(`thunderbolt bridge: stdout pump error: ${err instanceof Error ? err.message : String(err)}\n`) + process.stderr.write( + `thunderbolt bridge: stdout pump error: ${err instanceof Error ? err.message : String(err)}\n`, + ) } })() void (async () => { diff --git a/cli/src/index.ts b/cli/src/index.ts index 34c7c9f82..70a1dd27b 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -12,6 +12,9 @@ import { HELP_TEXT, VERSION, parseArgs } from './cli.ts' import { runAgent } from './agent/run.ts' import { runBridge } from './commands/bridge.ts' +import { runIrohBridge } from './iroh/bridge.ts' +import { runIrohConnect } from './iroh/connect.ts' +import { runIrohAdmin } from './iroh/admin.ts' const parsed = parseArgs(Bun.argv.slice(2)) @@ -36,7 +39,24 @@ switch (parsed.kind) { break case 'bridge': try { - await runBridge(parsed.config) + if (parsed.config.transport === 'iroh') await runIrohBridge(parsed.config) + else await runBridge(parsed.config) + } catch (err) { + process.stderr.write(`thunderbolt: ${err instanceof Error ? err.message : String(err)}\n`) + process.exitCode = 1 + } + break + case 'connect': + try { + await runIrohConnect(parsed.config) + } catch (err) { + process.stderr.write(`thunderbolt: ${err instanceof Error ? err.message : String(err)}\n`) + process.exitCode = 1 + } + break + case 'iroh-admin': + try { + await runIrohAdmin(parsed.action) } catch (err) { process.stderr.write(`thunderbolt: ${err instanceof Error ? err.message : String(err)}\n`) process.exitCode = 1 diff --git a/cli/src/iroh/admin.ts b/cli/src/iroh/admin.ts new file mode 100644 index 000000000..b6044bae9 --- /dev/null +++ b/cli/src/iroh/admin.ts @@ -0,0 +1,54 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * `thunderbolt iroh` admin actions: inspect this node's identity, hand out a + * pairing ticket, and manage the peer allowlist. + * + * id print this node's NodeId and a fresh connection ticket + * pair print a ticket as the out-of-band pairing primitive + * allow add a peer NodeId to the allowlist (the authorization gate) + */ + +import { EndpointId } from '@number0/iroh' +import type { IrohAdminAction } from '../agent/types.ts' +import { add } from './allowlist.ts' +import { bindServer } from './endpoint.ts' + +/** Bind briefly to mint a current ticket (needs a live home relay), print it + * alongside the NodeId, then release the endpoint. The ticket is just an + * address, so the bind protocol is immaterial here. */ +const printIdentity = async (headline: string): Promise => { + const { endpoint, nodeId, ticket } = await bindServer('acp') + process.stdout.write(`${headline}\n node id: ${nodeId}\n ticket: ${ticket}\n`) + await endpoint.close() +} + +/** + * Run an `iroh` admin action. + * + * @param action - the parsed sub-action (`id` | `pair` | `allow`) + */ +export const runIrohAdmin = async (action: IrohAdminAction): Promise => { + if (action.kind === 'id') { + await printIdentity('⚡ thunderbolt iroh identity') + return + } + + if (action.kind === 'pair') { + await printIdentity('⚡ thunderbolt iroh pairing ticket — share this out-of-band') + process.stdout.write( + ' the peer connects with: thunderbolt acp connect \n' + + ' then allow them here: thunderbolt iroh allow \n' + + ' (QR-code encoding of the ticket is deferred)\n', + ) + return + } + + // Validate the NodeId is a real ed25519 key before trusting it — parsing + // throws on a malformed id, which surfaces as a clean CLI error. + EndpointId.fromString(action.nodeId) + const added = await add(action.nodeId) + process.stdout.write(added ? `⚡ allowed ${action.nodeId}\n` : `⚡ ${action.nodeId} was already allowed\n`) +} diff --git a/cli/src/iroh/allowlist.ts b/cli/src/iroh/allowlist.ts new file mode 100644 index 000000000..3a277fd66 --- /dev/null +++ b/cli/src/iroh/allowlist.ts @@ -0,0 +1,50 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Peer allowlist for the iroh bridge — the authorization gate for the transport. + * + * Because an iroh NodeId is an ed25519 public key, the QUIC handshake already + * authenticates *who* a peer is for free; this list decides *whether* that peer + * may drive a local agent. Only NodeIds present here are permitted to open a + * bridged session. Stored one NodeId per line at `~/.thunderbolt/iroh/allowlist`. + */ + +import { irohDir, allowlistPath } from './paths.ts' +import { readFileOrNull, writeSecureFile } from './storage.ts' + +/** + * The current allowlist as an ordered, de-duplicated list of NodeId strings. + * An absent file yields an empty list (no peer is trusted by default). + */ +export const list = async (): Promise => { + const raw = await readFileOrNull(allowlistPath()) + if (raw === null) return [] + const seen = new Set() + for (const line of raw.split('\n')) { + const id = line.trim() + if (id) seen.add(id) + } + return [...seen] +} + +/** Whether `nodeId` is permitted to open a bridged session. */ +export const isAllowed = async (nodeId: string): Promise => { + const ids = await list() + return ids.includes(nodeId.trim()) +} + +/** + * Add a NodeId to the allowlist (idempotent). Returns `true` if it was newly + * added, `false` if it was already present. + * + * @param nodeId - the peer NodeId (base32) to trust + */ +export const add = async (nodeId: string): Promise => { + const id = nodeId.trim() + const ids = await list() + if (ids.includes(id)) return false + await writeSecureFile(irohDir(), allowlistPath(), [...ids, id].join('\n') + '\n') + return true +} diff --git a/cli/src/iroh/bridge.ts b/cli/src/iroh/bridge.ts new file mode 100644 index 000000000..85fce2900 --- /dev/null +++ b/cli/src/iroh/bridge.ts @@ -0,0 +1,116 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * iroh transport for the ACP/MCP bridge — the authenticated, P2P counterpart to + * the loopback-only WebSocket bridge. + * + * Binds a server endpoint on this machine's persistent identity and accepts + * incoming connections from the n0 relays. The QUIC handshake authenticates the + * peer's NodeId (an ed25519 key) for free; the allowlist is the authorization + * gate on top of it. For each *allowed* connection the bridge spawns its own + * stdio agent and pumps it over one bidi stream using the same ndjson framing as + * the WebSocket path. Lifecycle is 1:1: a dropped connection kills the agent, + * and an exiting agent ends the session by finishing its stream. + */ + +import type { Incoming } from '@number0/iroh' +import type { BridgeConfig } from '../agent/types.ts' +import { spawnAgent, type BridgeProc } from '../commands/bridge.ts' +import { isAllowed } from './allowlist.ts' +import { bindServer } from './endpoint.ts' +import { forwardFromRecv, forwardToSend } from './pump.ts' + +/** QUIC application close code for a connection we actively reject (allowlist + * miss or spawn failure). Normal end-of-session is signalled by finishing the + * stream and letting the client close, never by an active server-side close. */ +const CLOSE_REFUSED = 1n + +/** Encode a human-readable connection-close reason as the byte array iroh wants. */ +const reasonBytes = (reason: string): number[] => Array.from(Buffer.from(reason, 'utf8')) + +/** + * Handle a single incoming connection: complete the handshake to learn the + * authenticated remote NodeId, enforce the allowlist, wait for the client to + * open the data stream, and only then bridge a freshly-spawned agent over it. + */ +const handleConnection = async ( + incoming: Incoming, + config: BridgeConfig, + activeProcs: Set, +): Promise => { + const connection = await (await incoming.accept()).connect() + const remoteId = connection.remoteId().toString() + + if (!(await isAllowed(remoteId))) { + process.stderr.write(`⚡ iroh bridge: refused ${remoteId} (not allowlisted)\n`) + connection.close(CLOSE_REFUSED, reasonBytes('not allowlisted')) + return + } + + // Commit a subprocess only once the client actually opens the data stream, so + // an allowlisted-but-idle peer can't pin a spawned agent, and the agent never + // runs before its data plane exists. + const bi = await connection.acceptBi() + + const proc = spawnAgent(config.command) + if (!proc) { + connection.close(CLOSE_REFUSED, reasonBytes(`failed to spawn '${config.command[0]}'`)) + return + } + activeProcs.add(proc) + void proc.exited.then(() => activeProcs.delete(proc)) + // A dropped connection kills the agent. The reverse (agent exit) is signalled + // by finishing the send stream below — never by an active connection close — + // so the final JSON-RPC response can't be truncated mid-flight; the client + // tears the connection down once it has drained that stream. + void connection.closed().then(() => proc.kill()) + process.stdout.write(`⚡ iroh bridge: accepted ${remoteId} → spawned ${config.command.join(' ')}\n`) + + // `.finally` (not `.then`) so the agent always gets stdin EOF, even if the + // recv pump errors as the connection tears down. + const toAgent = forwardFromRecv(bi.recv, (chunk) => { + proc.stdin.write(chunk) + proc.stdin.flush() + }).finally(() => proc.stdin.end()) + const fromAgent = forwardToSend(proc.stdout, bi.send) + // A pump rejecting here is the expected end-of-session (the stream errors as + // the connection closes); the lifecycle hooks above have already cleaned up. + await Promise.allSettled([toAgent, fromAgent]) +} + +/** + * Start the iroh bridge: advertise this node's NodeId + ticket, then accept and + * bridge connections until interrupted. Each connection is handled concurrently + * so a slow or stalled session never blocks new peers; a SIGINT/SIGTERM kills + * every spawned agent before exit so none are orphaned. + */ +export const runIrohBridge = async (config: BridgeConfig): Promise => { + const { endpoint, nodeId, ticket } = await bindServer(config.protocol) + const activeProcs = new Set() + + process.stdout.write( + `⚡ thunderbolt ${config.protocol} bridge (iroh) ready\n` + + ` node id: ${nodeId}\n` + + ` ticket: ${ticket}\n` + + ` spawning per connection: ${config.command.join(' ')}\n` + + ` allow a peer with: thunderbolt iroh allow \n`, + ) + + const shutdown = (): void => { + for (const proc of activeProcs) proc.kill() + void endpoint.close() + process.exit(0) + } + process.on('SIGINT', shutdown) + process.on('SIGTERM', shutdown) + + while (true) { + const incoming = await endpoint.acceptNext() + if (!incoming) break + void handleConnection(incoming, config, activeProcs).catch((err) => { + process.stderr.write(`⚡ iroh bridge: connection error: ${err instanceof Error ? err.message : String(err)}\n`) + }) + } +} diff --git a/cli/src/iroh/connect.ts b/cli/src/iroh/connect.ts new file mode 100644 index 000000000..d7ec97ca9 --- /dev/null +++ b/cli/src/iroh/connect.ts @@ -0,0 +1,93 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Client side of the iroh transport: dial a remote bridge and pump a local + * stdio ACP/MCP client into it. The mirror image of {@link runIrohBridge} — + * the same ndjson byte pump, just sourced from this side's stdio (or a spawned + * local client) instead of a server-spawned agent. + * + * With `-- ` it spawns that local client and bridges its stdio; without a + * command it bridges this process's own stdin/stdout, so a JSON-RPC line can be + * piped straight through to prove the round-trip. A bidi stream erroring as the + * connection closes is the normal end-of-pipe, so the pumps settle rather than + * throw; the caller decides success from whether any bytes came back. + */ + +import type { Connection } from '@number0/iroh' +import type { ConnectConfig } from '../agent/types.ts' +import { spawnAgent } from '../commands/bridge.ts' +import { dial } from './endpoint.ts' +import { forwardFromRecv, forwardToSend } from './pump.ts' + +/** Wait until the pumps settle *or* the connection closes — whichever first — + * so a peer that refuses us mid-pump is observed (and its close reason is + * populated) rather than leaving us blocked on a half that will never end. */ +const settleOrClose = (connection: Connection, pumps: Promise[]): Promise => + Promise.race([Promise.allSettled(pumps), connection.closed()]) + +/** Pump a spawned local client's stdio over the connection's bidi stream, + * returning the number of bytes received back from the remote agent. */ +const bridgeLocalCommand = async (connection: Connection, command: readonly string[]): Promise => { + const proc = spawnAgent(command) + if (!proc) throw new Error(`failed to spawn local client '${command[0]}'`) + void connection.closed().then(() => proc.kill()) + + let received = 0 + const bi = await connection.openBi() + const toRemote = forwardToSend(proc.stdout, bi.send) + // `.finally` so the local client always gets stdin EOF, even on a torn stream. + const fromRemote = forwardFromRecv(bi.recv, (chunk) => { + received += chunk.length + proc.stdin.write(chunk) + proc.stdin.flush() + }).finally(() => proc.stdin.end()) + await settleOrClose(connection, [toRemote, fromRemote]) + return received +} + +/** Pump this process's own stdin/stdout over the connection's bidi stream, + * returning the number of bytes received back from the remote agent. */ +const bridgeProcessStdio = async (connection: Connection): Promise => { + let received = 0 + const bi = await connection.openBi() + const toRemote = forwardToSend(Bun.stdin.stream(), bi.send) + const fromRemote = forwardFromRecv(bi.recv, (chunk) => { + received += chunk.length + process.stdout.write(chunk) + }) + await settleOrClose(connection, [toRemote, fromRemote]) + return received +} + +/** + * Dial the remote bridge identified by `config.target` and bridge a local + * client to it. If the remote rejects this node (not allowlisted) it closes the + * connection before any data flows; with no bytes received and a peer-supplied + * close reason, that surfaces here as a clear, non-zero-exit error. + */ +export const runIrohConnect = async (config: ConnectConfig): Promise => { + const { endpoint, connection } = await dial(config.target, config.protocol) + + let received = 0 + let failure: unknown = null + try { + received = + config.command.length > 0 + ? await bridgeLocalCommand(connection, config.command) + : await bridgeProcessStdio(connection) + } catch (err) { + failure = err + } + + // Capture the peer's close reason before tearing down our endpoint, which + // would otherwise overwrite it with our own local close. + const reason = connection.closeReason() + await endpoint.close() + + if (received === 0 && (failure !== null || reason !== null)) { + const detail = reason ?? (failure instanceof Error ? failure.message : String(failure)) + throw new Error(`iroh connect: refused or no response from remote (${detail})`) + } +} diff --git a/cli/src/iroh/endpoint.ts b/cli/src/iroh/endpoint.ts new file mode 100644 index 000000000..aa31e8b46 --- /dev/null +++ b/cli/src/iroh/endpoint.ts @@ -0,0 +1,89 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * iroh endpoint helpers: bind a server (agent host) or dial a peer (controller), + * both pinned to this machine's persistent identity and speaking one ALPN. + * + * Transport shape (verified against the n0 relays): + * builder → presetN0 (relays + discovery + crypto) → secretKey (stable NodeId) + * → [server only] alpns → bind → online (home relay ready). + * A connection ticket embeds the NodeId + home-relay URL, so it is the natural + * out-of-band pairing primitive; a bare NodeId also dials via n0 DNS discovery. + */ + +import { Endpoint, EndpointAddr, EndpointId, EndpointTicket, presetN0 } from '@number0/iroh' +import type { Connection } from '@number0/iroh' +import type { BridgeProtocol } from '../agent/types.ts' +import { loadOrCreateIdentity } from './identity.ts' + +/** Per-protocol ALPN: one string per protocol version. Both peers must match or + * the handshake is refused — so an ACP client can't drive an MCP bridge (or + * vice-versa) even though both bind on the same identity. */ +const alpnStringFor = (protocol: BridgeProtocol): string => `thunderbolt/${protocol}/0` + +/** The protocol's ALPN as the byte array the iroh API expects. */ +export const alpnFor = (protocol: BridgeProtocol): number[] => Array.from(Buffer.from(alpnStringFor(protocol), 'utf8')) + +/** A bound server endpoint plus the two identifiers operators share to be + * reached: the bare NodeId and a full connection ticket (NodeId + relay). */ +export type ServerEndpoint = { + readonly endpoint: Endpoint + readonly nodeId: string + readonly ticket: string +} + +/** A dialed peer: the live connection and the local endpoint backing it. */ +export type DialedEndpoint = { + readonly endpoint: Endpoint + readonly connection: Connection +} + +/** + * Bind a server endpoint on this machine's persistent identity, advertising the + * protocol's ALPN, and wait until a home relay is usable so the returned ticket + * is dialable. + * + * @param protocol - the protocol whose ALPN to advertise + */ +export const bindServer = async (protocol: BridgeProtocol): Promise => { + const { secretKeyBytes } = await loadOrCreateIdentity() + const builder = Endpoint.builder() + presetN0(builder) + builder.secretKey([...secretKeyBytes]) + builder.alpns([alpnFor(protocol)]) + const endpoint = await builder.bind() + await endpoint.online() + const ticket = EndpointTicket.fromAddr(endpoint.addr()).toString() + return { endpoint, nodeId: endpoint.id().toString(), ticket } +} + +/** Resolve a `--connect` argument (ticket *or* bare NodeId) to an address. A + * ticket carries the home-relay URL; a bare NodeId relies on n0 discovery. */ +const resolveTarget = (target: string): EndpointAddr => { + try { + return EndpointTicket.fromString(target).endpointAddr() + } catch { + return new EndpointAddr(EndpointId.fromString(target), null, []) + } +} + +/** + * Dial a peer by ticket or NodeId over the protocol's ALPN, using this machine's + * persistent identity so the remote can recognize (and allowlist) us. + * + * @param target - a connection ticket or a bare NodeId + * @param protocol - the protocol whose ALPN to request + */ +export const dial = async (target: string, protocol: BridgeProtocol): Promise => { + const addr = resolveTarget(target) + const { secretKeyBytes } = await loadOrCreateIdentity() + const builder = Endpoint.builder() + presetN0(builder) + builder.secretKey([...secretKeyBytes]) + const endpoint = await builder.bind() + await endpoint.online() + const connection = await endpoint.connect(addr, alpnFor(protocol)) + return { endpoint, connection } +} diff --git a/cli/src/iroh/identity.ts b/cli/src/iroh/identity.ts new file mode 100644 index 000000000..30fcb2918 --- /dev/null +++ b/cli/src/iroh/identity.ts @@ -0,0 +1,54 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Persistent node identity for the iroh transport. + * + * An iroh NodeId is the base32 form of a 32-byte ed25519 public key, so the + * identity *is* the cryptographic peer credential: persisting the secret key + * keeps this machine's NodeId stable across runs, which is what makes a peer + * allowlist (and, later, device-binding into the E2E key hierarchy) meaningful. + * The secret is stored hex-encoded at `~/.thunderbolt/iroh/identity` with 0600 + * permissions. + */ + +import { SecretKey } from '@number0/iroh' +import { irohDir, identityPath } from './paths.ts' +import { enforceSecureFile, readFileOrNull, writeSecureFile } from './storage.ts' + +/** A loaded node identity: the raw secret-key bytes to pin onto an endpoint, + * plus the derived public NodeId (base32) to share and allowlist. */ +export type IrohIdentity = { + /** 32-byte ed25519 secret key, ready for `EndpointBuilder.secretKey`. */ + readonly secretKeyBytes: readonly number[] + /** Base32 NodeId (the ed25519 public key) identifying this node to peers. */ + readonly nodeId: string +} + +/** Derive the NodeId (base32-ish key string) from secret-key bytes. */ +const nodeIdOf = (secretKeyBytes: readonly number[]): string => + SecretKey.fromBytes([...secretKeyBytes]) + .public() + .toString() + +/** + * Load this machine's persisted node identity, generating and saving a fresh + * one on first use. The secret is stored hex-encoded; its file is forced to + * `0600` on every load so a key restored with lax permissions self-heals. + * + * @returns the secret-key bytes and the derived NodeId + */ +export const loadOrCreateIdentity = async (): Promise => { + const path = identityPath() + const existing = await readFileOrNull(path) + if (existing !== null) { + await enforceSecureFile(path) + const secretKeyBytes = [...Buffer.from(existing.trim(), 'hex')] + return { secretKeyBytes, nodeId: nodeIdOf(secretKeyBytes) } + } + + const secretKeyBytes = SecretKey.generate().toBytes() + await writeSecureFile(irohDir(), path, Buffer.from(secretKeyBytes).toString('hex')) + return { secretKeyBytes, nodeId: nodeIdOf(secretKeyBytes) } +} diff --git a/cli/src/iroh/paths.ts b/cli/src/iroh/paths.ts new file mode 100644 index 000000000..937c01740 --- /dev/null +++ b/cli/src/iroh/paths.ts @@ -0,0 +1,27 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Filesystem locations for the iroh transport's persistent state (identity and + * peer allowlist). Everything lives under a single per-user home directory, + * `~/.thunderbolt/iroh/`, overridable via `THUNDERBOLT_HOME` — the override is + * what lets a second identity be exercised on the same machine (e.g. proving + * the allowlist gate rejects an unknown peer). + */ + +import { homedir } from 'node:os' +import { join } from 'node:path' + +/** Root for all thunderbolt CLI state. `THUNDERBOLT_HOME` overrides the default + * `~/.thunderbolt`, enabling isolated identities for testing/multi-account. */ +const baseDir = (): string => process.env.THUNDERBOLT_HOME ?? join(homedir(), '.thunderbolt') + +/** Directory holding the iroh identity and allowlist. */ +export const irohDir = (): string => join(baseDir(), 'iroh') + +/** Path to the persisted 32-byte node secret key (hex-encoded, mode 0600). */ +export const identityPath = (): string => join(irohDir(), 'identity') + +/** Path to the newline-delimited list of allowed peer NodeIds. */ +export const allowlistPath = (): string => join(irohDir(), 'allowlist') diff --git a/cli/src/iroh/pump.ts b/cli/src/iroh/pump.ts new file mode 100644 index 000000000..21c50a17a --- /dev/null +++ b/cli/src/iroh/pump.ts @@ -0,0 +1,57 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Byte pumps between a process's stdio and an iroh bidirectional QUIC stream. + * + * Unlike the WebSocket bridge, an iroh bidi stream is a raw byte pipe with no + * frame boundaries — but ACP/MCP stdio is newline-delimited JSON, which is + * self-delimiting, so each direction is a verbatim byte copy. The ndjson + * newlines that the WebSocket path has to re-insert/re-split are carried + * through untouched here, keeping both halves symmetric and framing-agnostic. + */ + +import type { RecvStream, SendStream } from '@number0/iroh' + +/** Max bytes pulled per `recv.read`; a comfortably large ceiling for JSON-RPC. */ +const READ_CHUNK_LIMIT = 1 << 16 + +/** + * Copy a readable byte source (e.g. a subprocess `stdout` or `Bun.stdin`) into + * an iroh send stream, finishing the stream when the source ends. + * + * @param source - the readable side to drain + * @param send - the iroh send half to write into + */ +export const forwardToSend = async (source: ReadableStream, send: SendStream): Promise => { + const reader = source.getReader() + try { + while (true) { + const { value, done } = await reader.read() + if (done) break + if (value && value.length > 0) await send.writeAll(Array.from(value)) + } + } finally { + // Finish the send half on both the clean-EOF and error paths so the peer + // always observes the stream end (and never blocks on its read side). + reader.releaseLock() + await send.finish() + } +} + +/** + * Copy an iroh recv stream into a byte sink (e.g. a subprocess `stdin` or this + * process's `stdout`), returning when the remote finishes the stream (a zero- + * length read signals EOF). + * + * @param recv - the iroh recv half to drain + * @param sink - called with each received chunk + */ +export const forwardFromRecv = async (recv: RecvStream, sink: (chunk: Uint8Array) => void): Promise => { + while (true) { + const chunk = await recv.read(READ_CHUNK_LIMIT) + if (chunk.length === 0) break + sink(Uint8Array.from(chunk)) + } +} diff --git a/cli/src/iroh/storage.ts b/cli/src/iroh/storage.ts new file mode 100644 index 000000000..31eea84dc --- /dev/null +++ b/cli/src/iroh/storage.ts @@ -0,0 +1,63 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Filesystem helpers shared by the iroh identity and allowlist stores. + * + * Both files are security-sensitive — the identity *is* the node's private key, + * and the allowlist *is* the authorization gate — so they are always written and + * re-`chmod`ed to owner-only (`0600` files inside a `0700` dir). Enforcing the + * mode on every read/write means a key restored from a lax backup or synced with + * loose permissions self-heals on next use rather than silently staying exposed. + * + * A not-yet-created file is an expected first-run condition, not a failure — so + * it maps to `null`; any other read error surfaces loudly. + */ + +import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises' + +/** Owner-only file mode for the secret/allowlist files. */ +const FILE_MODE = 0o600 +/** Owner-only directory mode for the iroh state dir. */ +const DIR_MODE = 0o700 + +/** + * Read a UTF-8 file, returning `null` only when it does not exist. All other + * errors propagate so genuine problems aren't masked as a missing file. + * + * @param path - absolute path to read + */ +export const readFileOrNull = async (path: string): Promise => { + try { + return await readFile(path, 'utf8') + } catch (err) { + if (err instanceof Error && (err as NodeJS.ErrnoException).code === 'ENOENT') return null + throw err + } +} + +/** Create (if needed) and lock down a directory to owner-only (`0700`). */ +export const ensureSecureDir = async (dir: string): Promise => { + await mkdir(dir, { recursive: true, mode: DIR_MODE }) + await chmod(dir, DIR_MODE) +} + +/** Force a file to owner-only (`0600`). Idempotent; safe to call on every load. */ +export const enforceSecureFile = async (path: string): Promise => { + await chmod(path, FILE_MODE) +} + +/** + * Write a security-sensitive file owner-only: ensure the parent dir is `0700`, + * write `0600`, then re-`chmod` to defeat a permissive umask. + * + * @param dir - the owning directory (created + locked down if absent) + * @param path - absolute file path within `dir` + * @param contents - the bytes/text to write + */ +export const writeSecureFile = async (dir: string, path: string, contents: string): Promise => { + await ensureSecureDir(dir) + await writeFile(path, contents, { mode: FILE_MODE }) + await chmod(path, FILE_MODE) +} From b0756325d9950adb585639255077fff4ba83cac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Menezes?= Date: Mon, 29 Jun 2026 02:12:58 -0300 Subject: [PATCH 04/86] =?UTF-8?q?feat:=20harden=20the=20in-app=20Pi=20engi?= =?UTF-8?q?ne=20=E2=80=94=20browser-native=20tools,=20per-thread=20session?= =?UTF-8?q?s,=20more=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/agent-core/anthropic-model.ts | 14 + .../browser-env/browser-execution-env.ts | 25 +- .../browser-env/coding-tool-operations.ts | 47 +- .../browser-env/workspace-jail.test.ts | 51 ++ .../agent-core/browser-env/workspace-jail.ts | 37 ++ .../browser-env/zen-bash-fs.test.ts | 82 +++ shared/agent-core/browser-env/zen-bash-fs.ts | 69 ++- .../agent-core/browser-stubs/cross-spawn.ts | 47 -- .../browser-stubs/install-process.ts | 17 +- .../browser-stubs/node-constants.cjs | 33 -- shared/agent-core/browser-stubs/node-fs.cjs | 23 +- .../agent-core/browser-stubs/node-module.ts | 37 +- shared/agent-core/browser-stubs/node-os.ts | 37 -- shared/agent-core/browser-stubs/node-url.ts | 33 -- shared/agent-core/browser-stubs/undici.ts | 35 -- shared/agent-core/browser-stubs/which.ts | 33 -- shared/agent-core/build-app-harness.ts | 131 +++-- .../coding-tools/edit-apply.test.ts | 43 ++ shared/agent-core/coding-tools/edit-apply.ts | 294 ++++++++++ shared/agent-core/coding-tools/index.ts | 368 +++++++++++++ shared/agent-core/coding-tools/truncate.ts | 229 ++++++++ shared/agent-core/index.ts | 15 +- shared/agent-core/openai-compat-model.ts | 184 +++++++ src/acp/built-in-adapter.test.ts | 101 ++++ src/acp/built-in-adapter.ts | 500 +++++++++++++++--- src/ai/fetch.ts | 113 +++- vite.config.ts | 63 +-- 27 files changed, 2182 insertions(+), 479 deletions(-) create mode 100644 shared/agent-core/browser-env/workspace-jail.test.ts create mode 100644 shared/agent-core/browser-env/workspace-jail.ts create mode 100644 shared/agent-core/browser-env/zen-bash-fs.test.ts delete mode 100644 shared/agent-core/browser-stubs/cross-spawn.ts delete mode 100644 shared/agent-core/browser-stubs/node-constants.cjs delete mode 100644 shared/agent-core/browser-stubs/node-os.ts delete mode 100644 shared/agent-core/browser-stubs/node-url.ts delete mode 100644 shared/agent-core/browser-stubs/undici.ts delete mode 100644 shared/agent-core/browser-stubs/which.ts create mode 100644 shared/agent-core/coding-tools/edit-apply.test.ts create mode 100644 shared/agent-core/coding-tools/edit-apply.ts create mode 100644 shared/agent-core/coding-tools/index.ts create mode 100644 shared/agent-core/coding-tools/truncate.ts create mode 100644 shared/agent-core/openai-compat-model.ts create mode 100644 src/acp/built-in-adapter.test.ts diff --git a/shared/agent-core/anthropic-model.ts b/shared/agent-core/anthropic-model.ts index 5a5db2458..0e90a7fc0 100644 --- a/shared/agent-core/anthropic-model.ts +++ b/shared/agent-core/anthropic-model.ts @@ -77,6 +77,20 @@ export type BuildAnthropicModelOptions = { readonly modelId: string } +/** + * Whether Pi's built-in Anthropic catalog can resolve `modelId` as an + * anthropic-messages model. The adapter's routing gate calls this so a model id + * Pi doesn't know (e.g. a brand-new claude the catalog lacks) falls back to the + * legacy pipeline instead of crashing the chat. Cheap — the catalog is in-memory. + * + * @param modelId - the Anthropic model id to probe, e.g. `claude-opus-4-8` + * @returns true if the catalog has an anthropic-messages model with that id + */ +export const isKnownAnthropicModel = (modelId: string): boolean => { + const resolved = builtinModels().getModel(PROVIDER, modelId) + return Boolean(resolved && hasApi(resolved, API)) +} + /** * Narrows a dispatched `Model` to the anthropic-messages model this * provider exclusively serves, surfacing misuse loudly rather than guessing. diff --git a/shared/agent-core/browser-env/browser-execution-env.ts b/shared/agent-core/browser-env/browser-execution-env.ts index 7352e3a92..1c123f6b9 100644 --- a/shared/agent-core/browser-env/browser-execution-env.ts +++ b/shared/agent-core/browser-env/browser-execution-env.ts @@ -40,20 +40,30 @@ import * as fsp from '@zenfs/core/promises' import { dirname, join, resolve } from '@zenfs/core/path' import { Bash } from 'just-bash' import { abortedResult, fileInfoFrom, splitLines, toFileError } from './fs-helpers.ts' +import { isWithinWorkspace } from './workspace-jail.ts' import { ZenBashFileSystem } from './zen-bash-fs.ts' -/** Mount-relative root under which {@link BrowserExecutionEnv.createTempDir} carves unique directories. */ -const TEMP_ROOT = '/tmp' +/** Per-env subdirectory (relative to the env's root) under which + * {@link BrowserExecutionEnv.createTempDir} carves unique directories. Kept + * INSIDE the env root so temp files stay within the workspace jail (readable by + * the jailed coding tools, e.g. bash's "Full output" file) and are torn down + * with the workspace instead of leaking into a shared `/tmp`. */ +const TEMP_SUBDIR = '.tmp' export class BrowserExecutionEnv implements ExecutionEnv { cwd: string private readonly env: Record private readonly bashFs: ZenBashFileSystem + /** Absolute temp root for this env, inside its (jailed) workspace root. */ + private readonly tempRoot: string constructor(options: { cwd: string; env?: Record }) { this.cwd = options.cwd this.env = options.env ?? {} - this.bashFs = new ZenBashFileSystem() + this.tempRoot = join(options.cwd, TEMP_SUBDIR) + // The shell is jailed to the env's root (the thread's workspace) so bash + // commands can't read or write a sibling thread's files on the shared mount. + this.bashFs = new ZenBashFileSystem(options.cwd) } async absolutePath(path: string): Promise> { @@ -71,6 +81,9 @@ export class BrowserExecutionEnv implements ExecutionEnv { if (options?.abortSignal?.aborted) return err(new ExecutionError('aborted', 'aborted')) const cwd = options?.cwd ? resolve(this.cwd, options.cwd) : this.cwd + if (!isWithinWorkspace(this.cwd, cwd)) { + return err(new ExecutionError('unknown', `cwd escapes workspace: ${options?.cwd}`)) + } const env = { ...this.env, ...options?.env } const controller = new AbortController() const state = { timedOut: false } @@ -247,12 +260,12 @@ export class BrowserExecutionEnv implements ExecutionEnv { // `crypto.randomUUID()` is generated inside the try: outside a secure // context the browser leaves it undefined, so calling it throws — which // would break the never-throw contract if it ran before the try. - const dir = join(TEMP_ROOT, `${prefix}${crypto.randomUUID()}`) - await fsp.mkdir(TEMP_ROOT, { recursive: true }) + const dir = join(this.tempRoot, `${prefix}${crypto.randomUUID()}`) + await fsp.mkdir(this.tempRoot, { recursive: true }) await fsp.mkdir(dir) return ok(dir) } catch (error) { - return err(toFileError(error, TEMP_ROOT)) + return err(toFileError(error, this.tempRoot)) } } diff --git a/shared/agent-core/browser-env/coding-tool-operations.ts b/shared/agent-core/browser-env/coding-tool-operations.ts index 757ea0cd8..f9880f414 100644 --- a/shared/agent-core/browser-env/coding-tool-operations.ts +++ b/shared/agent-core/browser-env/coding-tool-operations.ts @@ -3,34 +3,61 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** - * Pluggable {@link BrowserExecutionEnv}-backed operations for Pi's four coding - * tools (bash/read/write/edit). The tools default to Pi's local Node shell and - * `node:fs` backend, which don't exist in the browser; these adapters redirect - * each tool onto the same process-global ZenFS mount the harness runs over. + * {@link BrowserExecutionEnv}-backed operations for the four browser coding tools + * (bash/read/write/edit, see `../coding-tools`). They redirect each tool's I/O + * onto the same process-global ZenFS mount the harness runs over, replacing the + * Node shell + `node:fs` backend the CLI tools assume. * * The bash operation delegates to {@link BrowserExecutionEnv.exec} (just-bash * over ZenFS); the file operations call `@zenfs/core/promises` directly — the * very same singleton — so a file the shell writes is instantly visible to the * read tool and vice versa. All four therefore share one consistent mount. * - * The env is never-throwing (it encodes failures in a `Result`); Pi's bash tool, + * The env is never-throwing (it encodes failures in a `Result`); the bash tool, * by contrast, decodes failures from a thrown error (and detects timeouts via a * `timeout:` message). The bash adapter re-throws the env's * `ExecutionError` — whose `.message` already carries that exact framing — so the - * tool's existing error/timeout handling works unchanged. This is the - * architectural boundary translation Pi's contract calls for, not defensive - * wrapping. + * tool's error/timeout handling works unchanged. This is the architectural + * boundary translation, not defensive wrapping. * * Runtime note: the read/edit operations and the bash output bridge construct - * Node `Buffer`s (Pi's operation contracts are typed in terms of `Buffer`). The + * Node `Buffer`s (the operation contracts are typed in terms of `Buffer`). The * app entry must ensure a global `Buffer` polyfill exists in the browser (the * standard `buffer` package shim) before driving the harness. */ -import type { BashOperations, EditOperations, ReadOperations, WriteOperations } from '@earendil-works/pi-coding-agent' import * as fsp from '@zenfs/core/promises' import type { BrowserExecutionEnv } from './browser-execution-env.ts' +/** Streamed-execution backend for the bash tool. Throws on failure (aborted / + * `timeout:` / other), matching the tool's error-decoding contract. */ +export type BashOperations = { + exec: ( + command: string, + cwd: string, + options: { onData: (data: Buffer) => void; signal?: AbortSignal; timeout?: number }, + ) => Promise<{ exitCode: number | null }> +} + +/** File-read backend for the read tool. */ +export type ReadOperations = { + readFile: (absolutePath: string) => Promise + access: (absolutePath: string) => Promise +} + +/** File-write backend for the write tool. */ +export type WriteOperations = { + writeFile: (absolutePath: string, content: string) => Promise + mkdir: (dir: string) => Promise +} + +/** File read/write backend for the edit tool. */ +export type EditOperations = { + readFile: (absolutePath: string) => Promise + writeFile: (absolutePath: string, content: string) => Promise + access: (absolutePath: string) => Promise +} + /** * Build bash operations that run every command through `env` (just-bash over the * shared ZenFS mount). Streams stdout and stderr to the tool via `onData` and diff --git a/shared/agent-core/browser-env/workspace-jail.test.ts b/shared/agent-core/browser-env/workspace-jail.test.ts new file mode 100644 index 000000000..f3842bed1 --- /dev/null +++ b/shared/agent-core/browser-env/workspace-jail.test.ts @@ -0,0 +1,51 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * `workspace-jail` tests — the single guard every browser coding tool uses to keep + * a thread's file/shell access inside its own `/workspace/` subtree. + */ + +import { describe, expect, it } from 'bun:test' +import { isWithinWorkspace, resolveInWorkspace } from './workspace-jail.ts' + +const WS = '/workspace/thread-1' + +describe('resolveInWorkspace', () => { + it('resolves a relative path inside the workspace', () => { + expect(resolveInWorkspace(WS, 'notes/todo.md')).toBe(`${WS}/notes/todo.md`) + }) + + it('allows the workspace root itself', () => { + expect(resolveInWorkspace(WS, '.')).toBe(WS) + }) + + it('throws on an absolute path outside the workspace', () => { + expect(() => resolveInWorkspace(WS, '/etc/passwd')).toThrow('path escapes workspace') + }) + + it('throws on a `..` traversal into a sibling thread', () => { + expect(() => resolveInWorkspace(WS, '../thread-2/secret')).toThrow('path escapes workspace') + }) + + it('throws on a `..` chain that climbs above the workspace root', () => { + expect(() => resolveInWorkspace(WS, 'a/../../thread-2/x')).toThrow('path escapes workspace') + }) + + it('does not treat a sibling whose name shares a prefix as inside', () => { + expect(() => resolveInWorkspace(WS, '/workspace/thread-12/x')).toThrow('path escapes workspace') + }) +}) + +describe('isWithinWorkspace', () => { + it('accepts the root and its descendants', () => { + expect(isWithinWorkspace(WS, WS)).toBe(true) + expect(isWithinWorkspace(WS, `${WS}/a/b`)).toBe(true) + }) + + it('rejects siblings and prefix-aliased siblings', () => { + expect(isWithinWorkspace(WS, '/workspace/thread-2')).toBe(false) + expect(isWithinWorkspace(WS, '/workspace/thread-1-evil')).toBe(false) + }) +}) diff --git a/shared/agent-core/browser-env/workspace-jail.ts b/shared/agent-core/browser-env/workspace-jail.ts new file mode 100644 index 000000000..575fb0206 --- /dev/null +++ b/shared/agent-core/browser-env/workspace-jail.ts @@ -0,0 +1,37 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * The single workspace jail shared by every browser coding tool. Each thread's + * tools are rooted at its isolated workspace + * ({@link import('../build-app-harness.ts').workspaceDirFor}); this asserts that a + * resolved path stays inside that subtree, so a model-supplied absolute path + * (`/etc/passwd`) or `..` traversal (`..//secret`) can't reach a + * sibling thread's files on the shared process-global ZenFS mount. + * + * Throwing on an escape is the loud, architectural failure the project's rules + * favour over silently clamping or ignoring the path. + */ + +import { resolve } from '@zenfs/core/path' + +/** True when `resolvedPath` is the workspace root itself or inside its subtree. */ +export const isWithinWorkspace = (workspaceDir: string, resolvedPath: string): boolean => + resolvedPath === workspaceDir || resolvedPath.startsWith(`${workspaceDir}/`) + +/** + * Resolve `path` against `workspaceDir` and assert it stays inside the workspace + * subtree, throwing `path escapes workspace` otherwise. + * + * @param workspaceDir - the thread's absolute workspace root (the jail boundary) + * @param path - a model-supplied relative or absolute path + * @returns the resolved absolute path, guaranteed within `workspaceDir` + */ +export const resolveInWorkspace = (workspaceDir: string, path: string): string => { + const resolved = resolve(workspaceDir, path) + if (!isWithinWorkspace(workspaceDir, resolved)) { + throw new Error(`path escapes workspace: ${path}`) + } + return resolved +} diff --git a/shared/agent-core/browser-env/zen-bash-fs.test.ts b/shared/agent-core/browser-env/zen-bash-fs.test.ts new file mode 100644 index 000000000..4e0aa3640 --- /dev/null +++ b/shared/agent-core/browser-env/zen-bash-fs.test.ts @@ -0,0 +1,82 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * `ZenBashFileSystem` jail tests — the shell's only I/O channel. They lock the + * security boundary: every path-accepting method must reject access outside the + * thread's workspace, so a future method added without the jail is caught here. + */ + +import { beforeAll, describe, expect, it } from 'bun:test' +import * as fsp from '@zenfs/core/promises' +import { mountInMemoryFs } from './mount.ts' +import { ZenBashFileSystem } from './zen-bash-fs.ts' + +const JAIL = '/workspace/t1' + +beforeAll(async () => { + await mountInMemoryFs() + await fsp.mkdir('/workspace/t1', { recursive: true }) + await fsp.mkdir('/workspace/t2', { recursive: true }) + await fsp.writeFile('/workspace/t1/mine.txt', 'mine') + await fsp.writeFile('/workspace/t2/secret.txt', 'secret') + await fsp.mkdir('/etc', { recursive: true }) + await fsp.writeFile('/etc/passwd', 'root') +}) + +const fs = new ZenBashFileSystem(JAIL) + +describe('ZenBashFileSystem jail', () => { + it('reads files inside the workspace (absolute and relative)', async () => { + expect(await fs.readFile('/workspace/t1/mine.txt')).toBe('mine') + expect(await fs.readFile('mine.txt')).toBe('mine') + }) + + it('blocks reading a sibling thread workspace', async () => { + await expect(fs.readFile('/workspace/t2/secret.txt')).rejects.toThrow('path escapes workspace') + }) + + it('blocks reading an absolute system path', async () => { + await expect(fs.readFile('/etc/passwd')).rejects.toThrow('path escapes workspace') + }) + + it('blocks `..` traversal into a sibling', async () => { + await expect(fs.readFile('../t2/secret.txt')).rejects.toThrow('path escapes workspace') + }) + + it('blocks enumerating the parent workspace root', async () => { + await expect(fs.readdir('/workspace')).rejects.toThrow('path escapes workspace') + await expect(fs.readdirWithFileTypes('/workspace')).rejects.toThrow('path escapes workspace') + }) + + it('blocks stat outside the workspace', async () => { + await expect(fs.stat('/workspace/t2/secret.txt')).rejects.toThrow('path escapes workspace') + }) + + it('blocks writing outside the workspace', async () => { + await expect(fs.writeFile('/workspace/t2/pwned.txt', 'x')).rejects.toThrow('path escapes workspace') + }) + + it('blocks removing outside the workspace', async () => { + await expect(fs.rm('/workspace/t2/secret.txt')).rejects.toThrow('path escapes workspace') + }) + + it('blocks copy/move that escape the workspace', async () => { + await expect(fs.cp('mine.txt', '/workspace/t2/copy.txt')).rejects.toThrow('path escapes workspace') + await expect(fs.mv('/workspace/t2/secret.txt', 'stolen.txt')).rejects.toThrow('path escapes workspace') + }) + + it('blocks creating a symlink whose target escapes', async () => { + await expect(fs.symlink('/workspace/t2/secret.txt', '/workspace/t1/link')).rejects.toThrow('path escapes workspace') + }) + + it('exists() returns false for out-of-jail paths instead of throwing', async () => { + expect(await fs.exists('/etc/passwd')).toBe(false) + expect(await fs.exists('/workspace/t1/mine.txt')).toBe(true) + }) + + it('keeps resolvePath pure (un-jailed) so ancestor walks still compute', () => { + expect(fs.resolvePath('/workspace/t1', '..')).toBe('/workspace') + }) +}) diff --git a/shared/agent-core/browser-env/zen-bash-fs.ts b/shared/agent-core/browser-env/zen-bash-fs.ts index ebdbd34f5..6a6924177 100644 --- a/shared/agent-core/browser-env/zen-bash-fs.ts +++ b/shared/agent-core/browser-env/zen-bash-fs.ts @@ -16,12 +16,22 @@ * just-bash expects filesystem methods to THROW on failure (it catches and maps * them to shell exit codes internally), so this adapter deliberately forwards * ZenFS' Node-style errors unchanged rather than wrapping them. + * + * Isolation: every path-accepting method is jailed to the thread's workspace + * ({@link jailRoot}) via {@link resolveInWorkspace}, so a shell command using an + * absolute path (`cat /etc/passwd`) or a `..`/sibling path (`cat + * /workspace//secret`, `ls /workspace`) throws and just-bash maps it + * to a non-zero exit — a thread's shell can only touch its own files. + * `resolvePath` stays a pure resolve (NOT jailed) so just-bash's internal + * ancestor walks — e.g. resolving `..` up to `/` while discovering `.gitignore` — + * still compute correctly; the subsequent file access is what enforces the jail. */ import * as fsp from '@zenfs/core/promises' -import { resolve } from '@zenfs/core/path' +import { dirname, resolve } from '@zenfs/core/path' import type { BufferEncoding, CpOptions, FileContent, FsStat, IFileSystem, MkdirOptions, RmOptions } from 'just-bash' import type { ZenStats } from './fs-helpers.ts' +import { isWithinWorkspace, resolveInWorkspace } from './workspace-jail.ts' // just-bash declares these structurally in its `IFileSystem` module but does not // re-export them from the package root; mirror them locally. Structural identity @@ -47,46 +57,61 @@ const toFsStat = (stat: ZenStats): FsStat => ({ }) export class ZenBashFileSystem implements IFileSystem { + /** + * @param jailRoot - the thread's absolute workspace dir; every path this + * adapter touches is asserted to stay inside it (see file header). + */ + constructor(private readonly jailRoot: string) {} + + /** Resolve `path` against the jail root and assert it stays in the workspace, + * throwing on escape so just-bash maps it to a non-zero exit. */ + private jailed(path: string): string { + return resolveInWorkspace(this.jailRoot, path) + } + async readFile(path: string, options?: ReadFileOptions | BufferEncoding): Promise { - return await fsp.readFile(path, { encoding: encodingOf(options) ?? 'utf8' }) + return await fsp.readFile(this.jailed(path), { encoding: encodingOf(options) ?? 'utf8' }) } async readFileBuffer(path: string): Promise { - return new Uint8Array(await fsp.readFile(path)) + return new Uint8Array(await fsp.readFile(this.jailed(path))) } async writeFile(path: string, content: FileContent, options?: WriteFileOptions | BufferEncoding): Promise { const encoding = encodingOf(options) - await fsp.writeFile(path, content, encoding ? { encoding } : undefined) + await fsp.writeFile(this.jailed(path), content, encoding ? { encoding } : undefined) } async appendFile(path: string, content: FileContent, options?: WriteFileOptions | BufferEncoding): Promise { const encoding = encodingOf(options) - await fsp.appendFile(path, content, encoding ? { encoding } : undefined) + await fsp.appendFile(this.jailed(path), content, encoding ? { encoding } : undefined) } async exists(path: string): Promise { - return await fsp.exists(path) + const resolved = resolve(this.jailRoot, path) + // A path outside the jail simply "doesn't exist" for this thread, so `[ -e ]` + // tests resolve to false rather than erroring on the jail throw. + return isWithinWorkspace(this.jailRoot, resolved) ? await fsp.exists(resolved) : false } async stat(path: string): Promise { - return toFsStat(await fsp.stat(path)) + return toFsStat(await fsp.stat(this.jailed(path))) } async lstat(path: string): Promise { - return toFsStat(await fsp.lstat(path)) + return toFsStat(await fsp.lstat(this.jailed(path))) } async mkdir(path: string, options?: MkdirOptions): Promise { - await fsp.mkdir(path, { recursive: options?.recursive ?? false }) + await fsp.mkdir(this.jailed(path), { recursive: options?.recursive ?? false }) } async readdir(path: string): Promise { - return await fsp.readdir(path) + return await fsp.readdir(this.jailed(path)) } async readdirWithFileTypes(path: string): Promise { - const entries = await fsp.readdir(path, { withFileTypes: true }) + const entries = await fsp.readdir(this.jailed(path), { withFileTypes: true }) return entries.map((entry) => ({ name: entry.name, isFile: entry.isFile(), @@ -96,15 +121,15 @@ export class ZenBashFileSystem implements IFileSystem { } async rm(path: string, options?: RmOptions): Promise { - await fsp.rm(path, { recursive: options?.recursive ?? false, force: options?.force ?? false }) + await fsp.rm(this.jailed(path), { recursive: options?.recursive ?? false, force: options?.force ?? false }) } async cp(src: string, dest: string, options?: CpOptions): Promise { - await fsp.cp(src, dest, { recursive: options?.recursive ?? false }) + await fsp.cp(this.jailed(src), this.jailed(dest), { recursive: options?.recursive ?? false }) } async mv(src: string, dest: string): Promise { - await fsp.rename(src, dest) + await fsp.rename(this.jailed(src), this.jailed(dest)) } resolvePath(base: string, path: string): string { @@ -116,26 +141,30 @@ export class ZenBashFileSystem implements IFileSystem { } async chmod(path: string, mode: number): Promise { - await fsp.chmod(path, mode) + await fsp.chmod(this.jailed(path), mode) } async symlink(target: string, linkPath: string): Promise { - await fsp.symlink(target, linkPath) + const resolvedLink = this.jailed(linkPath) + // The target must also stay inside the workspace: ZenFS follows links when + // reading, so an escaping target would leak through an in-jail link. + resolveInWorkspace(this.jailRoot, resolve(dirname(resolvedLink), target)) + await fsp.symlink(target, resolvedLink) } async link(existingPath: string, newPath: string): Promise { - await fsp.link(existingPath, newPath) + await fsp.link(this.jailed(existingPath), this.jailed(newPath)) } async readlink(path: string): Promise { - return await fsp.readlink(path) + return await fsp.readlink(this.jailed(path)) } async realpath(path: string): Promise { - return await fsp.realpath(path) + return await fsp.realpath(this.jailed(path)) } async utimes(path: string, atime: Date, mtime: Date): Promise { - await fsp.utimes(path, atime, mtime) + await fsp.utimes(this.jailed(path), atime, mtime) } } diff --git a/shared/agent-core/browser-stubs/cross-spawn.ts b/shared/agent-core/browser-stubs/cross-spawn.ts deleted file mode 100644 index 1b0c22715..000000000 --- a/shared/agent-core/browser-stubs/cross-spawn.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/** - * Browser stub for `cross-spawn`, aliased in `vite.config.ts` for the in-browser - * Pi harness path. - * - * Why this exists: Pi's `@earendil-works/pi-coding-agent` pulls `cross-spawn` in - * through its Node child-process helper. The real package evaluates - * `process.platform` at *module scope* (`lib/parse.js`, `lib/enoent.js`), so - * merely importing it throws `ReferenceError: process is not defined` in the - * browser — before any LLM call. A runtime `globalThis.process` shim can't help - * because the optimized dep evaluates `process` the moment the chunk loads, so - * the fix must be build-level: replace the module entirely. - * - * Why it's safe: the app harness never resolves OS executables. Bash runs through - * {@link BrowserExecutionEnv} (just-bash over ZenFS), and the read/write/edit - * tools are bound to the same ZenFS mount — none of them touch `child_process`. - * This module is therefore dead weight on the browser path. - * - * Why it throws rather than no-ops: reaching this code would mean execution was - * wrongly routed through Node's `child_process`, which is an architectural bug we - * want to surface loudly, not silence. - */ - -/** Loudly reject any browser call into the Node child-process path. */ -const browserUnsupported = (..._args: unknown[]): never => { - throw new Error('cross-spawn is unavailable in the browser; execution runs through BrowserExecutionEnv') -} - -/** Mirrors the shape `cross-spawn` consumers expect (callable + `.sync`/`.spawn`). */ -type CrossSpawn = { - (...args: unknown[]): never - sync: (...args: unknown[]) => never - spawn: (...args: unknown[]) => never -} - -const crossSpawn = browserUnsupported as CrossSpawn -crossSpawn.sync = browserUnsupported -crossSpawn.spawn = browserUnsupported - -// Named exports too, so every access path (`import cs`, `import { sync }`) throws -// loudly rather than relying on CJS-interop synthesizing the named bindings. -export const sync = browserUnsupported -export const spawn = browserUnsupported -export default crossSpawn diff --git a/shared/agent-core/browser-stubs/install-process.ts b/shared/agent-core/browser-stubs/install-process.ts index 130f8050d..1d8367e45 100644 --- a/shared/agent-core/browser-stubs/install-process.ts +++ b/shared/agent-core/browser-stubs/install-process.ts @@ -6,14 +6,15 @@ * Installs the Node globals (`process`, `global`) the lazily-loaded Pi engine * expects but the browser lacks. * - * Why this exists: Pi is a Node CLI. Several of its modules read the bare - * `process` global — `config.js` (`process.versions.bun`), `timings.js` - * (`process.env.PI_TIMING`), the clipboard helper (`process.execPath`, - * `process.platform`, `process.env`) — and others reference the bare `global` - * object, so loading Pi throws `ReferenceError: process is not defined` / - * `global is not defined` in the browser. Because these are bare globals (not - * `import … from 'process'`), a module alias can't reach them; the globals must - * exist when Pi evaluates. + * Why this exists: Pi's runtime (`@earendil-works/pi-ai`) and the Anthropic SDK + * still read the bare `process` global to detect their environment — + * `process.versions?.node`/`process.env.*` in provider/auth helpers — and some + * dependency code references the bare `global` object, so loading them throws + * `ReferenceError: process is not defined` / `global is not defined` in the + * browser. Because these are bare globals (not `import … from 'process'`), a + * module alias can't reach them; the globals must exist when those modules + * evaluate. (The pi-coding-agent CLI modules that previously needed this — its + * `config.js`/`timings.js`/clipboard helper — are no longer on the app path.) * * Why a side-effecting import rather than a runtime shim: ES module imports are * hoisted and evaluated in source order, so a `globalThis.process = …` assignment diff --git a/shared/agent-core/browser-stubs/node-constants.cjs b/shared/agent-core/browser-stubs/node-constants.cjs deleted file mode 100644 index ab777f8ba..000000000 --- a/shared/agent-core/browser-stubs/node-constants.cjs +++ /dev/null @@ -1,33 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/** - * Browser shim for Node's legacy `constants` / `node:constants` module, aliased in - * `vite.config.ts` for the in-browser Pi harness path. - * - * Why this exists: `graceful-fs` (pulled in transitively by Pi) does - * `require('constants')` and then calls `constants.hasOwnProperty('O_SYMLINK')`. - * Vite's default `browser-external:constants` returns a proxy whose - * `hasOwnProperty` is not callable, throwing during graceful-fs's patch step. A - * plain CommonJS object restores `hasOwnProperty`; omitting the exotic flags - * (e.g. `O_SYMLINK`) makes graceful-fs skip the `lchmod`/`lchown` patches it would - * otherwise install — none of which the browser harness needs. - */ - -module.exports = { - F_OK: 0, - R_OK: 4, - W_OK: 2, - X_OK: 1, - O_RDONLY: 0, - O_WRONLY: 1, - O_RDWR: 2, - O_CREAT: 64, - O_EXCL: 128, - O_TRUNC: 512, - O_APPEND: 1024, - S_IFMT: 61440, - S_IFREG: 32768, - S_IFDIR: 16384, -} diff --git a/shared/agent-core/browser-stubs/node-fs.cjs b/shared/agent-core/browser-stubs/node-fs.cjs index 001f36408..e52b0d426 100644 --- a/shared/agent-core/browser-stubs/node-fs.cjs +++ b/shared/agent-core/browser-stubs/node-fs.cjs @@ -6,20 +6,17 @@ * Browser shim for Node's `fs` / `node:fs`, aliased in `vite.config.ts` for the * in-browser Pi harness path. * - * Why this exists: Pi's package/config detection probes the disk with sync `fs` - * calls (`existsSync`, `readFileSync`, …). Vite's default `browser-external:fs` - * leaves them undefined, throwing on call. The harness does its REAL file I/O - * through the ZenFS-backed operation adapters (see `coding-tool-operations.ts`), - * never through these — so this shim presents an *empty* filesystem: `existsSync` - * returns false (Pi falls back to its defaults), reads throw `ENOENT`, and writes - * are inert no-ops. + * Why this exists: `@earendil-works/pi-ai`'s `utils/provider-env.js` does a + * `require("node:fs")` for a Bun-sandbox `/proc/self/environ` fallback. The call + * is guarded by `process.versions?.bun` (always falsy in the browser) so it never + * runs here, but rolldown still resolves the specifier statically — without this + * alias it falls back to `browser-external:fs`, a build warning whose members + * throw on access. This shim resolves it cleanly to an *empty* filesystem: + * `existsSync` returns false, reads throw `ENOENT`, writes are inert no-ops. (The + * harness's REAL file I/O goes through the ZenFS adapters, never through these.) * - * Why CommonJS (not the ESM `.ts` used by the sibling shims): `graceful-fs` - * monkey-patches the `fs` module in place (`fs.closeSync = …`). ES module named - * exports are read-only bindings, so an ESM shim throws - * "Cannot set property closeSync … which has only a getter". A CJS `module.exports` - * object is plain and mutable, so the (harmless, browser-irrelevant) patching - * succeeds and the harness loads. + * Why CommonJS: the sole consumer reaches it via `require("node:fs")`, so a plain + * `module.exports` object is the natural, interop-free target. */ /** Build a Node-style ENOENT error so Pi's error handling reads it as "missing". */ diff --git a/shared/agent-core/browser-stubs/node-module.ts b/shared/agent-core/browser-stubs/node-module.ts index 899fc2e8d..f7e538ba3 100644 --- a/shared/agent-core/browser-stubs/node-module.ts +++ b/shared/agent-core/browser-stubs/node-module.ts @@ -6,42 +6,31 @@ * Browser shim for Node's `module` / `node:module`, aliased in `vite.config.ts` * for the in-browser Pi harness path. * - * Why this exists: Pi builds a CommonJS `require` via `createRequire(import.meta.url)` - * — at module scope (its clipboard probe) and lazily at runtime (some modules - * `require('fs')` rather than import it). Vite's `browser-external:module` leaves - * `createRequire` undefined, throwing on import. + * Why this exists: `just-bash`'s browser bundle evaluates + * `createRequire(import.meta.url)` at MODULE SCOPE. Vite's `browser-external:module` + * leaves `createRequire` undefined, so that top-level call throws on import (the + * production build tree-shakes the unused `require`, but the dev server does not). * - * The returned `require` resolves the Node builtins Pi reaches for to the same - * browser shims the static `vite.config.ts` aliases use, so a dynamic - * `require('fs')` behaves identically to `import … from 'fs'`. Anything else - * (e.g. an optional native addon) throws — the only such caller wraps the lookup - * in try/catch and falls back to `null`, so the harness still loads cleanly. + * The returned `require` resolves the handful of Node builtins still aliased on + * this path (`crypto`/`fs/promises`/`path`) to their browser shims, so a lazy + * `require('crypto')` behaves like the static `import`. Anything else throws — + * loudly, since a real native `require` cannot be satisfied in the browser. */ -// All imported via their bare builtin specifiers: typed by @types/node for the -// type-checker, redirected to the browser shims by vite.config.ts's resolve.alias -// at build time (so a dynamic `require('fs')` matches the static `import` path). +// Imported via bare builtin specifiers: typed by @types/node for the type-checker, +// redirected to the browser shims by vite.config.ts's resolve.alias at build time. import nodeCrypto from 'node:crypto' -import nodeFs from 'node:fs' import nodeFsPromises from 'node:fs/promises' -import nodeOs from 'node:os' -import nodeUrl from 'node:url' import nodePath from 'node:path' -/** Node builtins Pi may `require()` at runtime, mapped to their browser shims. */ +/** Node builtins that may be `require()`-d lazily, mapped to their browser shims. */ const browserBuiltins: Record = { - fs: nodeFs, - 'node:fs': nodeFs, - 'fs/promises': nodeFsPromises, - 'node:fs/promises': nodeFsPromises, - os: nodeOs, - 'node:os': nodeOs, crypto: nodeCrypto, 'node:crypto': nodeCrypto, + 'fs/promises': nodeFsPromises, + 'node:fs/promises': nodeFsPromises, path: nodePath, 'node:path': nodePath, - url: nodeUrl, - 'node:url': nodeUrl, } /** A CommonJS `require` over the browser shims; unknown ids fail loudly. */ diff --git a/shared/agent-core/browser-stubs/node-os.ts b/shared/agent-core/browser-stubs/node-os.ts deleted file mode 100644 index 5d4e730b1..000000000 --- a/shared/agent-core/browser-stubs/node-os.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/** - * Browser shim for Node's `os` / `node:os`, aliased in `vite.config.ts` for the - * in-browser Pi harness path. - * - * Why this exists: Pi resolves its config directory from `os.homedir()` and a few - * helpers read `os.tmpdir()`/`os.platform()`. Vite's default `browser-external:os` - * leaves them undefined, throwing on call. The harness keeps no on-disk config - * (it uses an in-memory session repo and a ZenFS sandbox), so these only need to - * return stable, sane values rather than reflect a real host. - */ - -/** A stable virtual home directory; the harness never reads it. */ -export const homedir = (): string => '/home/user' - -/** A stable virtual temp directory; real temp I/O goes through ZenFS. */ -export const tmpdir = (): string => '/tmp' - -/** Report a browser "platform" so Pi takes its non-Windows code paths. */ -export const platform = (): string => 'browser' - -/** WebAssembly-ish arch label; only used in diagnostics Pi never shows here. */ -export const arch = (): string => 'wasm' - -/** Browsers are LF-only. */ -export const EOL = '\n' - -/** No CPU topology in the browser. */ -export const cpus = (): unknown[] => [] - -/** Stable host label. */ -export const hostname = (): string => 'browser' - -export default { homedir, tmpdir, platform, arch, EOL, cpus, hostname } diff --git a/shared/agent-core/browser-stubs/node-url.ts b/shared/agent-core/browser-stubs/node-url.ts deleted file mode 100644 index caf485d27..000000000 --- a/shared/agent-core/browser-stubs/node-url.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/** - * Browser shim for Node's `url` / `node:url`, aliased in `vite.config.ts` for the - * in-browser Pi harness path. - * - * Why this exists: Pi's `config.js` derives `__dirname` at MODULE SCOPE via - * `fileURLToPath(import.meta.url)`, and its clipboard helper calls - * `pathToFileURL` at load. Vite's default `browser-external:url` leaves both - * undefined, so importing Pi throws "fileURLToPath is not a function" before any - * LLM call. The browser harness never reads on-disk Pi config/assets, so the - * derived paths are inert — these implementations only need to return a value - * rather than throw. `URL`/`URLSearchParams` are browser globals, re-exported for - * parity with the Node module surface. - */ - -/** Browser `fileURLToPath`: return the URL's pathname (file:// or http(s)://). */ -export const fileURLToPath = (url: string | URL): string => new globalThis.URL(url).pathname - -/** Browser `pathToFileURL`: wrap an absolute path as a `file://` URL. */ -export const pathToFileURL = (path: string): URL => new globalThis.URL(`file://${path}`) - -// Re-export the browser globals under the Node module's names (globals can't be -// re-exported directly, so alias through local bindings). -const url = globalThis.URL -const urlSearchParams = globalThis.URLSearchParams - -const nodeUrl = { fileURLToPath, pathToFileURL, URL: url, URLSearchParams: urlSearchParams } - -export { url as URL, urlSearchParams as URLSearchParams } -export default nodeUrl diff --git a/shared/agent-core/browser-stubs/undici.ts b/shared/agent-core/browser-stubs/undici.ts deleted file mode 100644 index 742744edd..000000000 --- a/shared/agent-core/browser-stubs/undici.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/** - * Browser stub for `undici`, aliased in `vite.config.ts` for the in-browser Pi - * harness path. - * - * Why this exists: Pi's `core/http-dispatcher.js` does `import * as undici from - * 'undici'` to install a custom Node HTTP dispatcher. `undici` is a Node-only - * HTTP stack — its modules `extends` Node `stream`/`net`/`tls` classes at module - * scope, throwing "Class extends value undefined" in the browser (those builtins - * are externalized). The harness routes every model request through the app's - * injected proxy `fetch`, never undici, so the whole library is dead weight here. - * - * Replacing it with this stub keeps undici's heavy Node graph out of the browser - * bundle entirely. The dispatcher-config calls (`setGlobalDispatcher`, `install`, - * `new EnvHttpProxyAgent(...)`) become harmless no-ops; `fetch` delegates to the - * browser's native implementation in case anything reaches for it. - */ - -/** No-op stand-in for undici's proxy agent — constructed but never used. */ -class EnvHttpProxyAgent {} -class Agent {} -class ProxyAgent {} -class Pool {} - -const setGlobalDispatcher = (): void => {} -const getGlobalDispatcher = (): undefined => undefined -const install = (): void => {} -const fetch = (input: RequestInfo | URL, init?: RequestInit): Promise => globalThis.fetch(input, init) - -export { EnvHttpProxyAgent, Agent, ProxyAgent, Pool, setGlobalDispatcher, getGlobalDispatcher, install, fetch } - -export default { EnvHttpProxyAgent, Agent, ProxyAgent, Pool, setGlobalDispatcher, getGlobalDispatcher, install, fetch } diff --git a/shared/agent-core/browser-stubs/which.ts b/shared/agent-core/browser-stubs/which.ts deleted file mode 100644 index 68f8f9cd3..000000000 --- a/shared/agent-core/browser-stubs/which.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/** - * Browser stub for `which`, aliased in `vite.config.ts` for the in-browser Pi - * harness path. See `./cross-spawn.ts` for the full rationale — `which` is the - * sibling executable-resolution module (`cross-spawn` resolves commands through - * it) and likewise evaluates `process.platform`/`process.env` at module scope, - * throwing `ReferenceError: process is not defined` on import in the browser. - * - * The harness never resolves OS executables (bash runs through - * {@link BrowserExecutionEnv}), so this module is dead weight on the browser - * path. It throws if ever called so a mis-routed execution surfaces loudly - * instead of silently no-op'ing. - */ - -/** Loudly reject any browser call into OS executable resolution. */ -const browserUnsupported = (..._args: unknown[]): never => { - throw new Error('which is unavailable in the browser; execution runs through BrowserExecutionEnv') -} - -/** Mirrors the shape `which` consumers expect (callable + `.sync`). */ -type Which = { - (...args: unknown[]): never - sync: (...args: unknown[]) => never -} - -const which = browserUnsupported as Which -which.sync = browserUnsupported - -export default which -export const sync = browserUnsupported diff --git a/shared/agent-core/build-app-harness.ts b/shared/agent-core/build-app-harness.ts index da6eafa80..5b2645a28 100644 --- a/shared/agent-core/build-app-harness.ts +++ b/shared/agent-core/build-app-harness.ts @@ -13,41 +13,94 @@ * - the execution environment is a {@link BrowserExecutionEnv} over an * OPFS-backed ZenFS mount ({@link mountAgentFs}), with an in-memory fallback; * - the four coding tools (bash/read/write/edit) are bound to that same mount - * through {@link createBashOperations} and the file-operation adapters. + * via {@link createBrowserCodingTools} — plain Pi `AgentTool`s over the + * {@link BrowserExecutionEnv}, with no `@earendil-works/pi-coding-agent` (and + * hence no Node child-process/`undici`/TUI) cascade on the app path. * * Extra `tools` (e.g. the app's MCP tools converted via `./mcp-tools.ts`) are * appended and made active alongside the coding tools. */ import { AgentHarness, InMemorySessionRepo, type AgentTool, type ThinkingLevel } from '@earendil-works/pi-agent-core' -import { createBashTool, createEditTool, createReadTool, createWriteTool } from '@earendil-works/pi-coding-agent' import { buildAnthropicModel, type AgentFetch } from './anthropic-model.ts' +import { buildOpenAiCompatModel } from './openai-compat-model.ts' import { BrowserExecutionEnv } from './browser-env/browser-execution-env.ts' -import { - createBashOperations, - createEditOperations, - createReadOperations, - createWriteOperations, -} from './browser-env/coding-tool-operations.ts' import { mountAgentFs } from './browser-env/mount.ts' +import { createBrowserCodingTools } from './coding-tools/index.ts' import { ensureBufferPolyfill } from './ensure-buffer.ts' import { buildSeedMessages, type SeedTurn } from './seed-history.ts' -/** Absolute mount-relative directory the agent's tools are bound to. */ -const AGENT_CWD = '/workspace' +/** Mount-relative root under which every thread carves its isolated workspace. */ +const WORKSPACE_ROOT = '/workspace' + +/** + * Absolute mount-relative workspace directory for a thread. Each thread gets its + * own subtree under {@link WORKSPACE_ROOT} so concurrent threads never see each + * other's files even though they share the one process-global ZenFS mount. + * + * @param threadId - the chat thread id (an app-generated id, e.g. a UUID) + * @returns the thread's absolute workspace directory, e.g. `/workspace/` + */ +export const workspaceDirFor = (threadId: string): string => { + // The workspace dir is also the jail boundary for every coding tool, so a + // threadId containing `/` or `..` would move the boundary and defeat the jail. + // App thread ids are UUID-shaped; reject anything else loudly rather than + // silently weakening isolation. + if (!/^[A-Za-z0-9._-]+$/.test(threadId) || threadId === '.' || threadId === '..') { + throw new Error(`unsafe threadId for workspace: ${threadId}`) + } + return `${WORKSPACE_ROOT}/${threadId}` +} + +/** + * The model the harness runs, tagged by Pi engine family. Both variants route + * their LLM HTTP through an injected `fetch` (the app's proxy / SSO fetch): + * + * - `anthropic` resolves a model from Pi's built-in catalog and wires the + * `@anthropic-ai/sdk` client through `fetch` ({@link buildAnthropicModel}). + * - `openai-compat` synthesizes an `openai-completions` model for the app's + * OpenAI-wire providers (`openai`/`custom`/`openrouter`/`thunderbolt`) and + * injects `fetch` around client construction ({@link buildOpenAiCompatModel}). + */ +export type PiModelDescriptor = + | { + readonly kind: 'anthropic' + /** Anthropic model id to resolve from Pi's catalog, e.g. `claude-opus-4-8`. */ + readonly modelId: string + /** Anthropic API key (HTTP still flows through `fetch`). */ + readonly apiKey: string + /** Fetch every request is routed through — the app's proxy fetch. */ + readonly fetch: AgentFetch + } + | { + readonly kind: 'openai-compat' + /** App provider name, also used as the Pi provider id. */ + readonly providerId: string + /** Upstream model id sent on the wire. */ + readonly modelId: string + /** OpenAI-compatible base URL. */ + readonly baseURL: string + /** Bearer key for the OpenAI SDK (placeholder when `fetch` supplies auth). */ + readonly apiKey: string + /** Provider-specific app fetch (proxy fetch, or thunderbolt SSO fetch). */ + readonly fetch: AgentFetch + /** Whether to request a reasoning effort (else Pi sends none). */ + readonly reasoning: boolean + /** Optional upstream context window. */ + readonly contextWindow?: number + } /** Inputs for {@link buildAppHarness}. */ export type BuildAppHarnessOptions = { - /** Anthropic API key (HTTP still flows through `fetch`). */ - readonly apiKey: string - /** Fetch every request is routed through — the app passes its proxy fetch. */ - readonly fetch: AgentFetch - /** Anthropic model id to run, e.g. `claude-opus-4-8`. */ - readonly modelId: string + /** The model to run, tagged by Pi engine family. */ + readonly model: PiModelDescriptor /** System prompt sent with each model request. */ readonly systemPrompt: string /** Reasoning depth for the harness. */ readonly thinkingLevel: ThinkingLevel + /** Chat thread this harness serves. Its tools are bound to the thread's + * isolated workspace ({@link workspaceDirFor}). */ + readonly threadId: string /** Extra tools to register and activate alongside the four coding tools. */ readonly tools?: AgentTool[] /** Prior conversation turns to seed into the session before the first prompt, @@ -56,36 +109,44 @@ export type BuildAppHarnessOptions = { } /** - * Build a ready-to-run app harness. Mounts the ZenFS singleton (once), binds the - * coding tools to it, resolves the proxied anthropic model, and returns the - * constructed harness. No teardown is needed — {@link BrowserExecutionEnv} owns - * no per-instance resources (ZenFS is a process-global singleton). + * Build a ready-to-run app harness for a thread. Mounts the ZenFS singleton + * (once), carves the thread's isolated workspace under {@link WORKSPACE_ROOT}, + * binds the coding tools to it, resolves the proxied model (anthropic or + * openai-compatible), and returns the constructed harness. The workspace persists + * with the harness; tear it down by removing {@link workspaceDirFor}`(threadId)` + * when the thread is disposed. * - * @param options - api key, injected fetch, model id, prompt, thinking level, extra tools + * @param options - model descriptor, prompt, thinking level, thread id, extra tools, history * @returns the constructed {@link AgentHarness} */ export const buildAppHarness = async (options: BuildAppHarnessOptions): Promise => { ensureBufferPolyfill() await mountAgentFs() - const env = new BrowserExecutionEnv({ cwd: AGENT_CWD }) - const created = await env.createDir(AGENT_CWD) + const workspaceDir = workspaceDirFor(options.threadId) + const env = new BrowserExecutionEnv({ cwd: workspaceDir }) + const created = await env.createDir(workspaceDir) if (!created.ok) { throw created.error } const session = await new InMemorySessionRepo().create({}) - const { models, model } = buildAnthropicModel({ - apiKey: options.apiKey, - fetch: options.fetch, - modelId: options.modelId, - }) + const { models, model } = + options.model.kind === 'anthropic' + ? buildAnthropicModel({ + apiKey: options.model.apiKey, + fetch: options.model.fetch, + modelId: options.model.modelId, + }) + : buildOpenAiCompatModel({ + providerId: options.model.providerId, + modelId: options.model.modelId, + baseURL: options.model.baseURL, + apiKey: options.model.apiKey, + fetch: options.model.fetch, + reasoning: options.model.reasoning, + contextWindow: options.model.contextWindow, + }) - const tools: AgentTool[] = [ - createBashTool(AGENT_CWD, { operations: createBashOperations(env) }), - createReadTool(AGENT_CWD, { operations: createReadOperations() }), - createWriteTool(AGENT_CWD, { operations: createWriteOperations() }), - createEditTool(AGENT_CWD, { operations: createEditOperations() }), - ...(options.tools ?? []), - ] + const tools: AgentTool[] = [...createBrowserCodingTools(env, { cwd: workspaceDir }), ...(options.tools ?? [])] const harness = new AgentHarness({ env, diff --git a/shared/agent-core/coding-tools/edit-apply.test.ts b/shared/agent-core/coding-tools/edit-apply.test.ts new file mode 100644 index 000000000..c52357aa7 --- /dev/null +++ b/shared/agent-core/coding-tools/edit-apply.test.ts @@ -0,0 +1,43 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * `edit-apply` tests — focused on the empty/whitespace-only oldText guard. A + * whitespace-only oldText is non-empty after LF normalization but collapses to '' + * under fuzzy normalization, so it must be rejected up front rather than fuzzy- + * matching at index 0. + */ + +import { describe, expect, it } from 'bun:test' +import { applyEditsToNormalizedContent } from './edit-apply.ts' + +describe('applyEditsToNormalizedContent', () => { + it('applies a straightforward exact replacement', () => { + const { newContent } = applyEditsToNormalizedContent('hello world', [{ oldText: 'world', newText: 'pi' }], 'f.txt') + expect(newContent).toBe('hello pi') + }) + + it('rejects an empty oldText', () => { + expect(() => applyEditsToNormalizedContent('abc', [{ oldText: '', newText: 'x' }], 'f.txt')).toThrow( + 'oldText must not be empty', + ) + }) + + it('rejects a whitespace-only oldText (collapses to empty under fuzzy match)', () => { + expect(() => applyEditsToNormalizedContent('a b', [{ oldText: ' ', newText: 'x' }], 'f.txt')).toThrow( + 'oldText must not be empty', + ) + }) + + it('rejects a tab-only oldText', () => { + expect(() => applyEditsToNormalizedContent('a\tb', [{ oldText: '\t', newText: 'x' }], 'f.txt')).toThrow( + 'oldText must not be empty', + ) + }) + + it('still accepts a newline-only oldText (fuzzy keeps the newline)', () => { + const { newContent } = applyEditsToNormalizedContent('a\n\nb', [{ oldText: '\n\n', newText: '\n' }], 'f.txt') + expect(newContent).toBe('a\nb') + }) +}) diff --git a/shared/agent-core/coding-tools/edit-apply.ts b/shared/agent-core/coding-tools/edit-apply.ts new file mode 100644 index 000000000..7ad8d7e31 --- /dev/null +++ b/shared/agent-core/coding-tools/edit-apply.ts @@ -0,0 +1,294 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Exact-text replacement engine for the browser `edit` tool, ported from Pi's + * `core/tools/edit-diff.ts` (the matching/applying half only — the `diff`-based + * preview rendering and the `node:fs` preview helper are dropped because the app + * never renders the edit tool's diff details). + * + * The matcher tries an exact match first, then a fuzzy match (NFKC + trailing- + * whitespace + smart-quote/dash/space normalization) so the model's `oldText` + * still lands when it differs only in invisible/cosmetic characters. All edits in + * a call are matched against the SAME original content and applied in reverse + * offset order so earlier edits cannot shift later offsets. Errors mirror Pi's + * wording verbatim — the model is tuned to recover from these exact messages. + * + * Every function here is pure string manipulation: no Node builtins, no `Buffer`. + */ + +/** A single exact-text replacement requested by the model. */ +export type EditReplacement = { oldText: string; newText: string } + +/** Normalize all line endings to LF. */ +export const normalizeToLF = (text: string): string => text.replace(/\r\n/g, '\n').replace(/\r/g, '\n') + +/** Detect whether the original content predominantly used CRLF or LF endings. */ +export const detectLineEnding = (content: string): '\r\n' | '\n' => { + const crlfIdx = content.indexOf('\r\n') + const lfIdx = content.indexOf('\n') + if (lfIdx === -1) { + return '\n' + } + if (crlfIdx === -1) { + return '\n' + } + return crlfIdx < lfIdx ? '\r\n' : '\n' +} + +/** Restore the original line ending after editing in LF space. */ +export const restoreLineEndings = (text: string, ending: '\r\n' | '\n'): string => + ending === '\r\n' ? text.replace(/\n/g, '\r\n') : text + +/** Strip a leading UTF-8 BOM, returning it separately so it can be re-applied. */ +export const stripBom = (content: string): { bom: string; text: string } => + content.startsWith('\uFEFF') ? { bom: '\uFEFF', text: content.slice(1) } : { bom: '', text: content } + +/** + * Normalize text for fuzzy matching: NFKC, strip per-line trailing whitespace, + * and fold smart quotes / Unicode dashes / exotic spaces to their ASCII forms. + */ +export const normalizeForFuzzyMatch = (text: string): string => + text + .normalize('NFKC') + // Strip trailing whitespace per line. + .split('\n') + .map((line) => line.trimEnd()) + .join('\n') + // Smart single quotes -> ' + .replace(/[\u2018\u2019\u201A\u201B]/g, "'") + // Smart double quotes -> " + .replace(/[\u201C\u201D\u201E\u201F]/g, '"') + // Hyphens/dashes/minus -> - + .replace(/[\u2010\u2011\u2012\u2013\u2014\u2015\u2212]/g, '-') + // Exotic spaces -> regular space + .replace(/[\u00A0\u2002-\u200A\u202F\u205F\u3000]/g, ' ') + +type LineSpan = { start: number; end: number } + +type MatchedEdit = { editIndex: number; matchIndex: number; matchLength: number; newText: string } + +/** Split content into lines, preserving each line's trailing newline. */ +const splitLinesWithEndings = (content: string): string[] => content.match(/[^\n]*\n|[^\n]+/g) ?? [] + +/** Compute the character span of each line within `content`. */ +const getLineSpans = (content: string): LineSpan[] => { + let offset = 0 + return splitLinesWithEndings(content).map((line) => { + const span = { start: offset, end: offset + line.length } + offset = span.end + return span + }) +} + +/** Find the inclusive-exclusive line range a replacement touches within `lines`. */ +const getReplacementLineRange = ( + lines: LineSpan[], + replacement: MatchedEdit, +): { startLine: number; endLine: number } => { + const replacementStart = replacement.matchIndex + const replacementEnd = replacement.matchIndex + replacement.matchLength + let startLine = -1 + for (let i = 0; i < lines.length; i++) { + const line = lines[i] + if (replacementStart >= line.start && replacementStart < line.end) { + startLine = i + break + } + } + if (startLine === -1) { + throw new Error('Replacement range is outside the base content.') + } + let endLine = startLine + while (endLine < lines.length && lines[endLine].end < replacementEnd) { + endLine++ + } + if (endLine >= lines.length) { + throw new Error('Replacement range is outside the base content.') + } + return { startLine, endLine: endLine + 1 } +} + +/** Apply replacements (in reverse offset order) to `content`. */ +const applyReplacements = (content: string, replacements: MatchedEdit[], offset = 0): string => { + let result = content + for (let i = replacements.length - 1; i >= 0; i--) { + const replacement = replacements[i] + const matchIndex = replacement.matchIndex - offset + result = + result.substring(0, matchIndex) + replacement.newText + result.substring(matchIndex + replacement.matchLength) + } + return result +} + +/** + * Apply replacements matched against a normalized `baseContent` to the original + * content while preserving unchanged line blocks byte-for-byte. Used when fuzzy + * matching rewrote the matching space. + */ +const applyReplacementsPreservingUnchangedLines = ( + originalContent: string, + baseContent: string, + replacements: MatchedEdit[], +): string => { + const originalLines = splitLinesWithEndings(originalContent) + const baseLines = getLineSpans(baseContent) + if (originalLines.length !== baseLines.length) { + throw new Error('Cannot preserve unchanged lines because the base content has a different line count.') + } + const groups: { startLine: number; endLine: number; replacements: MatchedEdit[] }[] = [] + const sortedReplacements = [...replacements].sort((a, b) => a.matchIndex - b.matchIndex) + for (const replacement of sortedReplacements) { + const range = getReplacementLineRange(baseLines, replacement) + const current = groups[groups.length - 1] + if (current && range.startLine < current.endLine) { + current.endLine = Math.max(current.endLine, range.endLine) + current.replacements.push(replacement) + continue + } + groups.push({ ...range, replacements: [replacement] }) + } + let originalLineIndex = 0 + let result = '' + for (const group of groups) { + result += originalLines.slice(originalLineIndex, group.startLine).join('') + const groupStartOffset = baseLines[group.startLine].start + const groupEndOffset = baseLines[group.endLine - 1].end + result += applyReplacements( + baseContent.slice(groupStartOffset, groupEndOffset), + group.replacements, + groupStartOffset, + ) + originalLineIndex = group.endLine + } + result += originalLines.slice(originalLineIndex).join('') + return result +} + +type FuzzyMatch = { + found: boolean + index: number + matchLength: number + usedFuzzyMatch: boolean +} + +/** Find `oldText` in `content`, exact first then fuzzy-normalized. */ +const fuzzyFindText = (content: string, oldText: string): FuzzyMatch => { + const exactIndex = content.indexOf(oldText) + if (exactIndex !== -1) { + return { found: true, index: exactIndex, matchLength: oldText.length, usedFuzzyMatch: false } + } + const fuzzyContent = normalizeForFuzzyMatch(content) + const fuzzyOldText = normalizeForFuzzyMatch(oldText) + const fuzzyIndex = fuzzyContent.indexOf(fuzzyOldText) + if (fuzzyIndex === -1) { + return { found: false, index: -1, matchLength: 0, usedFuzzyMatch: false } + } + return { found: true, index: fuzzyIndex, matchLength: fuzzyOldText.length, usedFuzzyMatch: true } +} + +/** Count fuzzy occurrences of `oldText` in `content`. */ +const countOccurrences = (content: string, oldText: string): number => { + const fuzzyContent = normalizeForFuzzyMatch(content) + const fuzzyOldText = normalizeForFuzzyMatch(oldText) + return fuzzyContent.split(fuzzyOldText).length - 1 +} + +const getNotFoundError = (path: string, editIndex: number, totalEdits: number): Error => + totalEdits === 1 + ? new Error( + `Could not find the exact text in ${path}. The old text must match exactly including all whitespace and newlines.`, + ) + : new Error( + `Could not find edits[${editIndex}] in ${path}. The oldText must match exactly including all whitespace and newlines.`, + ) + +const getDuplicateError = (path: string, editIndex: number, totalEdits: number, occurrences: number): Error => + totalEdits === 1 + ? new Error( + `Found ${occurrences} occurrences of the text in ${path}. The text must be unique. Please provide more context to make it unique.`, + ) + : new Error( + `Found ${occurrences} occurrences of edits[${editIndex}] in ${path}. Each oldText must be unique. Please provide more context to make it unique.`, + ) + +const getEmptyOldTextError = (path: string, editIndex: number, totalEdits: number): Error => + totalEdits === 1 + ? new Error(`oldText must not be empty in ${path}.`) + : new Error(`edits[${editIndex}].oldText must not be empty in ${path}.`) + +const getNoChangeError = (path: string, totalEdits: number): Error => + totalEdits === 1 + ? new Error( + `No changes made to ${path}. The replacement produced identical content. This might indicate an issue with special characters or the text not existing as expected.`, + ) + : new Error(`No changes made to ${path}. The replacements produced identical content.`) + +/** + * Apply one or more exact-text replacements to LF-normalized content. Throws Pi's + * exact error messages on empty/missing/duplicate/overlapping/no-op edits. + * + * @param normalizedContent - the file content, already normalized to LF + * @param edits - the replacements to apply + * @param path - the file path, only used to build human error messages + * @returns the original (`baseContent`) and edited (`newContent`) content + */ +export const applyEditsToNormalizedContent = ( + normalizedContent: string, + edits: readonly EditReplacement[], + path: string, +): { baseContent: string; newContent: string } => { + const normalizedEdits = edits.map((edit) => ({ + oldText: normalizeToLF(edit.oldText), + newText: normalizeToLF(edit.newText), + })) + for (let i = 0; i < normalizedEdits.length; i++) { + // Guard against the FUZZY-normalized length, not the raw LF length: a + // whitespace-only oldText is non-empty after LF normalization but collapses + // to '' under normalizeForFuzzyMatch (which trims trailing whitespace per + // line), and a fuzzy match of '' would otherwise land at index 0. + if (normalizeForFuzzyMatch(normalizedEdits[i].oldText).length === 0) { + throw getEmptyOldTextError(path, i, normalizedEdits.length) + } + } + const initialMatches = normalizedEdits.map((edit) => fuzzyFindText(normalizedContent, edit.oldText)) + const usedFuzzyMatch = initialMatches.some((match) => match.usedFuzzyMatch) + const replacementBaseContent = usedFuzzyMatch ? normalizeForFuzzyMatch(normalizedContent) : normalizedContent + const matchedEdits: MatchedEdit[] = [] + for (let i = 0; i < normalizedEdits.length; i++) { + const edit = normalizedEdits[i] + const matchResult = fuzzyFindText(replacementBaseContent, edit.oldText) + if (!matchResult.found) { + throw getNotFoundError(path, i, normalizedEdits.length) + } + const occurrences = countOccurrences(replacementBaseContent, edit.oldText) + if (occurrences > 1) { + throw getDuplicateError(path, i, normalizedEdits.length, occurrences) + } + matchedEdits.push({ + editIndex: i, + matchIndex: matchResult.index, + matchLength: matchResult.matchLength, + newText: edit.newText, + }) + } + matchedEdits.sort((a, b) => a.matchIndex - b.matchIndex) + for (let i = 1; i < matchedEdits.length; i++) { + const previous = matchedEdits[i - 1] + const current = matchedEdits[i] + if (previous.matchIndex + previous.matchLength > current.matchIndex) { + throw new Error( + `edits[${previous.editIndex}] and edits[${current.editIndex}] overlap in ${path}. Merge them into one edit or target disjoint regions.`, + ) + } + } + const baseContent = normalizedContent + const newContent = usedFuzzyMatch + ? applyReplacementsPreservingUnchangedLines(normalizedContent, replacementBaseContent, matchedEdits) + : applyReplacements(replacementBaseContent, matchedEdits) + if (baseContent === newContent) { + throw getNoChangeError(path, normalizedEdits.length) + } + return { baseContent, newContent } +} diff --git a/shared/agent-core/coding-tools/index.ts b/shared/agent-core/coding-tools/index.ts new file mode 100644 index 000000000..69b54cf6d --- /dev/null +++ b/shared/agent-core/coding-tools/index.ts @@ -0,0 +1,368 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * The four coding tools (bash/read/write/edit) as PLAIN Pi {@link AgentTool} + * objects bound directly to a {@link BrowserExecutionEnv}. + * + * This is the in-browser replacement for Pi's `@earendil-works/pi-coding-agent` + * tool factories. Those factories are a Node CLI: importing them transitively + * pulls `cross-spawn`/`which`/`undici`/`graceful-fs` and a TUI renderer, forcing + * a stack of browser stubs and vite aliases. The model, however, only ever sees a + * tool's `name`, `description`, and parameter schema — so we replicate those + * verbatim from Pi (the model's priors depend on the exact wording) while + * implementing `execute` over the same ZenFS-backed operation adapters the CLI + * tools were given via their `operations` option (see + * `../browser-env/coding-tool-operations.ts`). The Node-coupled factories are + * therefore never imported on the app path, and their dependency cascade is gone. + * + * Dropped vs. the CLI tools (all TUI/CLI-only, invisible to the model): + * - `renderCall`/`renderResult` (pi-tui terminal rendering); + * - the edit tool's `diff`/`patch` details (the app never renders them); + * - the per-file mutation queue — replaced by marking the mutating tools + * (`bash`/`write`/`edit`) `executionMode: 'sequential'`. Pi's agent loop runs + * a tool batch in parallel by default, but serializes the whole batch as soon + * as one of its tools is sequential, so a model that emits `write` + `edit` on + * the same file in one turn can't race them over the shared ZenFS mount. + * + * `Buffer` is used for byte-accurate truncation and to decode operation output; + * the app installs the global `Buffer` polyfill before any tool runs. + */ + +import type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core' +import type { TextContent } from '@earendil-works/pi-ai' +import { dirname } from '@zenfs/core/path' +import { Type, type Static } from 'typebox' +import type { BrowserExecutionEnv } from '../browser-env/browser-execution-env.ts' +import { resolveInWorkspace } from '../browser-env/workspace-jail.ts' +import { + createBashOperations, + createEditOperations, + createReadOperations, + createWriteOperations, +} from '../browser-env/coding-tool-operations.ts' +import { + applyEditsToNormalizedContent, + detectLineEnding, + normalizeToLF, + restoreLineEndings, + stripBom, + type EditReplacement, +} from './edit-apply.ts' +import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, truncateTail } from './truncate.ts' + +/** Wrap plain text as a single-block tool result with no structured details. */ +const textResult = (text: string): AgentToolResult => ({ + content: [{ type: 'text', text } satisfies TextContent], + details: undefined, +}) + +/** Throw Pi's abort error if the run was cancelled. Checked between awaits so an + * in-flight ZenFS operation settles before we bail. */ +const throwIfAborted = (signal?: AbortSignal): void => { + if (signal?.aborted) { + throw new Error('Operation aborted') + } +} + +// --------------------------------------------------------------------------- +// bash +// --------------------------------------------------------------------------- + +const bashSchema = Type.Object({ + command: Type.String({ description: 'Bash command to execute' }), + timeout: Type.Optional(Type.Number({ description: 'Timeout in seconds (optional, no default timeout)' })), +}) + +/** Persist full (untruncated) bash output to a ZenFS temp file so the model can + * `cat` it; returns the path, or undefined if the write failed. */ +const persistFullOutput = async (env: BrowserExecutionEnv, output: string): Promise => { + const tmp = await env.createTempFile({ prefix: 'pi-bash-', suffix: '.log' }) + if (!tmp.ok) { + return undefined + } + const written = await env.writeFile(tmp.value, output) + return written.ok ? tmp.value : undefined +} + +/** Tail-truncate bash output and, when truncated, append Pi's "[Showing lines …]" + * footer pointing at the persisted full-output file. */ +const formatBashOutput = async (env: BrowserExecutionEnv, output: string, emptyText: string): Promise => { + const truncation = truncateTail(output) + if (!truncation.truncated) { + return truncation.content || emptyText + } + const fullOutputPath = await persistFullOutput(env, output) + const fullOutputNote = fullOutputPath ? ` Full output: ${fullOutputPath}` : '' + const startLine = truncation.totalLines - truncation.outputLines + 1 + const endLine = truncation.totalLines + if (truncation.lastLinePartial) { + return `${truncation.content}\n\n[Showing last ${formatSize(truncation.outputBytes)} of line ${endLine}.${fullOutputNote}]` + } + if (truncation.truncatedBy === 'lines') { + return `${truncation.content}\n\n[Showing lines ${startLine}-${endLine} of ${truncation.totalLines}.${fullOutputNote}]` + } + return `${truncation.content}\n\n[Showing lines ${startLine}-${endLine} of ${truncation.totalLines} (${formatSize(DEFAULT_MAX_BYTES)} limit).${fullOutputNote}]` +} + +/** `${text}\n\n${status}`, or just `status` when there is no captured output. */ +const appendStatus = (text: string, status: string): string => `${text ? `${text}\n\n` : ''}${status}` + +const buildBashTool = (env: BrowserExecutionEnv, cwd: string): AgentTool => { + const operations = createBashOperations(env) + return { + name: 'bash', + label: 'bash', + description: `Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.`, + parameters: bashSchema, + // Mutates the shared ZenFS mount (redirects, file writes); serialize the batch. + executionMode: 'sequential', + async execute(_toolCallId, { command, timeout }, signal) { + const chunks: string[] = [] + const onData = (data: Buffer): void => { + chunks.push(data.toString('utf-8')) + } + let exitCode: number | null + try { + const result = await operations.exec(command, cwd, { onData, signal, timeout }) + exitCode = result.exitCode + } catch (error) { + // operations.exec re-throws the env's ExecutionError, whose `.message` + // already carries Pi's `aborted` / `timeout:` framing. + const text = await formatBashOutput(env, chunks.join(''), '') + if (error instanceof Error && error.message === 'aborted') { + throw new Error(appendStatus(text, 'Command aborted')) + } + if (error instanceof Error && error.message.startsWith('timeout:')) { + throw new Error(appendStatus(text, `Command timed out after ${error.message.split(':')[1]} seconds`)) + } + throw error + } + const text = await formatBashOutput(env, chunks.join(''), '(no output)') + if (exitCode !== 0 && exitCode !== null) { + throw new Error(appendStatus(text, `Command exited with code ${exitCode}`)) + } + return textResult(text) + }, + } +} + +// --------------------------------------------------------------------------- +// read +// --------------------------------------------------------------------------- + +const readSchema = Type.Object({ + path: Type.String({ description: 'Path to the file to read (relative or absolute)' }), + offset: Type.Optional(Type.Number({ description: 'Line number to start reading from (1-indexed)' })), + limit: Type.Optional(Type.Number({ description: 'Maximum number of lines to read' })), +}) + +/** Build the read tool's text output: applies offset/limit, head-truncates, and + * appends Pi's actionable continuation hints (`Use offset=N to continue`). */ +const formatReadOutput = ( + rawPath: string, + textContent: string, + offset: number | undefined, + limit: number | undefined, +): string => { + const allLines = textContent.split('\n') + const totalFileLines = allLines.length + const startLine = offset ? Math.max(0, offset - 1) : 0 + const startLineDisplay = startLine + 1 + if (startLine >= allLines.length) { + throw new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`) + } + + const endLine = limit !== undefined ? Math.min(startLine + limit, allLines.length) : allLines.length + const userLimitedLines = limit !== undefined ? endLine - startLine : undefined + const selectedContent = allLines.slice(startLine, endLine).join('\n') + const truncation = truncateHead(selectedContent) + + if (truncation.firstLineExceedsLimit) { + const firstLineSize = formatSize(Buffer.byteLength(allLines[startLine], 'utf-8')) + return `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${rawPath} | head -c ${DEFAULT_MAX_BYTES}]` + } + if (truncation.truncated) { + const endLineDisplay = startLineDisplay + truncation.outputLines - 1 + const nextOffset = endLineDisplay + 1 + const limitNote = truncation.truncatedBy === 'lines' ? '' : ` (${formatSize(DEFAULT_MAX_BYTES)} limit)` + return `${truncation.content}\n\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}${limitNote}. Use offset=${nextOffset} to continue.]` + } + if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) { + const remaining = allLines.length - (startLine + userLimitedLines) + const nextOffset = startLine + userLimitedLines + 1 + return `${truncation.content}\n\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]` + } + return truncation.content +} + +const buildReadTool = (cwd: string): AgentTool => { + const operations = createReadOperations() + return { + name: 'read', + label: 'read', + description: `Read the contents of a file. For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`, + parameters: readSchema, + async execute(_toolCallId, { path, offset, limit }, signal) { + const absolutePath = resolveInWorkspace(cwd, path) + throwIfAborted(signal) + await operations.access(absolutePath) + throwIfAborted(signal) + const buffer = await operations.readFile(absolutePath) + return textResult(formatReadOutput(path, buffer.toString('utf-8'), offset, limit)) + }, + } +} + +// --------------------------------------------------------------------------- +// write +// --------------------------------------------------------------------------- + +const writeSchema = Type.Object({ + path: Type.String({ description: 'Path to the file to write (relative or absolute)' }), + content: Type.String({ description: 'Content to write to the file' }), +}) + +const buildWriteTool = (cwd: string): AgentTool => { + const operations = createWriteOperations() + return { + name: 'write', + label: 'write', + description: + "Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.", + parameters: writeSchema, + // Serialize against other file mutations in the same batch (no per-path queue). + executionMode: 'sequential', + async execute(_toolCallId, { path, content }, signal) { + const absolutePath = resolveInWorkspace(cwd, path) + throwIfAborted(signal) + await operations.mkdir(dirname(absolutePath)) + throwIfAborted(signal) + await operations.writeFile(absolutePath, content) + return textResult(`Successfully wrote ${content.length} bytes to ${path}`) + }, + } +} + +// --------------------------------------------------------------------------- +// edit +// --------------------------------------------------------------------------- + +const replaceEditSchema = Type.Object( + { + oldText: Type.String({ + description: + 'Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call.', + }), + newText: Type.String({ description: 'Replacement text for this targeted edit.' }), + }, + { additionalProperties: false }, +) + +const editSchema = Type.Object( + { + path: Type.String({ description: 'Path to the file to edit (relative or absolute)' }), + edits: Type.Array(replaceEditSchema, { + description: + 'One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead.', + }), + }, + { additionalProperties: false }, +) + +type EditInput = Static + +/** Drop `oldText`/`newText` from a record, keeping every other key. */ +const withoutLegacyEditKeys = (args: Record): Record => { + const rest: Record = {} + for (const [key, value] of Object.entries(args)) { + if (key !== 'oldText' && key !== 'newText') { + rest[key] = value + } + } + return rest +} + +/** + * Normalize raw model arguments into the edit schema's shape before validation. + * Some models emit `edits` as a JSON string (Opus 4.6, GLM-5.1) or a single + * top-level `oldText`/`newText` pair instead of the `edits[]` array; fold both + * into `edits[]` so the tool's contract stays uniform. + */ +const prepareEditArguments = (input: unknown): EditInput => { + if (!input || typeof input !== 'object') { + return input as EditInput + } + const args: Record = { ...(input as Record) } + if (typeof args.edits === 'string') { + try { + const parsed: unknown = JSON.parse(args.edits) + if (Array.isArray(parsed)) { + args.edits = parsed + } + } catch { + // Not JSON — leave `edits` untouched so validation surfaces a clear error. + } + } + if (typeof args.oldText !== 'string' || typeof args.newText !== 'string') { + return args as EditInput + } + const edits = Array.isArray(args.edits) ? [...args.edits] : [] + edits.push({ oldText: args.oldText, newText: args.newText }) + return { ...withoutLegacyEditKeys(args), edits } as EditInput +} + +/** Validate that at least one replacement was provided. */ +const validateEditInput = (input: EditInput): { path: string; edits: EditReplacement[] } => { + if (!Array.isArray(input.edits) || input.edits.length === 0) { + throw new Error('Edit tool input is invalid. edits must contain at least one replacement.') + } + return { path: input.path, edits: input.edits } +} + +const buildEditTool = (cwd: string): AgentTool => { + const operations = createEditOperations() + return { + name: 'edit', + label: 'edit', + description: + 'Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.', + parameters: editSchema, + // Serialize against other file mutations in the same batch (no per-path queue). + executionMode: 'sequential', + prepareArguments: prepareEditArguments, + async execute(_toolCallId, input, signal) { + const { path, edits } = validateEditInput(input) + const absolutePath = resolveInWorkspace(cwd, path) + throwIfAborted(signal) + try { + await operations.access(absolutePath) + } catch (error) { + const reason = error instanceof Error && 'code' in error ? `Error code: ${error.code}` : String(error) + throw new Error(`Could not edit file: ${path}. ${reason}.`) + } + throwIfAborted(signal) + const buffer = await operations.readFile(absolutePath) + const { bom, text: content } = stripBom(buffer.toString('utf-8')) + const originalEnding = detectLineEnding(content) + const { newContent } = applyEditsToNormalizedContent(normalizeToLF(content), edits, path) + throwIfAborted(signal) + await operations.writeFile(absolutePath, bom + restoreLineEndings(newContent, originalEnding)) + return textResult(`Successfully replaced ${edits.length} block(s) in ${path}.`) + }, + } +} + +/** + * Build the four browser coding tools (bash/read/write/edit) bound to `env` and + * rooted at `options.cwd`. Returned as plain {@link AgentTool}s ready to register + * on an {@link import('@earendil-works/pi-agent-core').AgentHarness}. + * + * @param env - the ZenFS-backed execution environment the tools operate over + * @param options - `cwd` the tools resolve relative paths against + */ +export const createBrowserCodingTools = (env: BrowserExecutionEnv, options: { cwd: string }): AgentTool[] => { + const { cwd } = options + return [buildBashTool(env, cwd), buildReadTool(cwd), buildWriteTool(cwd), buildEditTool(cwd)] +} diff --git a/shared/agent-core/coding-tools/truncate.ts b/shared/agent-core/coding-tools/truncate.ts new file mode 100644 index 000000000..af1fa1bf3 --- /dev/null +++ b/shared/agent-core/coding-tools/truncate.ts @@ -0,0 +1,229 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Output-truncation utilities for the browser coding tools, ported verbatim (in + * behaviour) from Pi's `core/tools/truncate.ts`. The tool descriptions promise a + * specific contract — "last/first N lines or KKB, whichever is hit first" — so the + * model's priors depend on this exact framing; replicating it keeps the in-browser + * tools indistinguishable from the CLI's for the model. + * + * Truncation honours two independent limits (whichever is hit first wins): + * - line limit ({@link DEFAULT_MAX_LINES}) + * - byte limit ({@link DEFAULT_MAX_BYTES}) + * + * `Buffer` is used for byte counting (UTF-8 aware); the app installs the global + * `Buffer` polyfill (`ensureBufferPolyfill`) before any tool runs. + */ + +/** Maximum lines retained before truncation kicks in. */ +export const DEFAULT_MAX_LINES = 2000 +/** Maximum bytes retained before truncation kicks in (50KB). */ +export const DEFAULT_MAX_BYTES = 50 * 1024 + +/** Result of a head/tail truncation pass. */ +export type TruncationResult = { + content: string + truncated: boolean + truncatedBy: 'lines' | 'bytes' | null + totalLines: number + totalBytes: number + outputLines: number + outputBytes: number + lastLinePartial: boolean + firstLineExceedsLimit: boolean + maxLines: number + maxBytes: number +} + +/** Options accepted by the truncation helpers. */ +export type TruncateOptions = { maxLines?: number; maxBytes?: number } + +/** Split content into lines for counting, dropping the trailing empty entry a + * final newline would otherwise produce. */ +const splitLinesForCounting = (content: string): string[] => { + if (content.length === 0) { + return [] + } + const lines = content.split('\n') + if (content.endsWith('\n')) { + lines.pop() + } + return lines +} + +/** Format a byte count as a human-readable size (B/KB/MB). */ +export const formatSize = (bytes: number): string => { + if (bytes < 1024) { + return `${bytes}B` + } + if (bytes < 1024 * 1024) { + return `${(bytes / 1024).toFixed(1)}KB` + } + return `${(bytes / (1024 * 1024)).toFixed(1)}MB` +} + +/** + * Truncate content from the head (keep the first N lines/bytes) — used by the + * read tool. Never returns partial lines; if the first line alone exceeds the + * byte limit, returns empty content with `firstLineExceedsLimit`. + * + * @param content - the text to truncate + * @param options - optional line/byte limit overrides + */ +export const truncateHead = (content: string, options: TruncateOptions = {}): TruncationResult => { + const maxLines = options.maxLines ?? DEFAULT_MAX_LINES + const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES + const totalBytes = Buffer.byteLength(content, 'utf-8') + const lines = splitLinesForCounting(content) + const totalLines = lines.length + + if (totalLines <= maxLines && totalBytes <= maxBytes) { + return { + content, + truncated: false, + truncatedBy: null, + totalLines, + totalBytes, + outputLines: totalLines, + outputBytes: totalBytes, + lastLinePartial: false, + firstLineExceedsLimit: false, + maxLines, + maxBytes, + } + } + + const firstLineBytes = Buffer.byteLength(lines[0], 'utf-8') + if (firstLineBytes > maxBytes) { + return { + content: '', + truncated: true, + truncatedBy: 'bytes', + totalLines, + totalBytes, + outputLines: 0, + outputBytes: 0, + lastLinePartial: false, + firstLineExceedsLimit: true, + maxLines, + maxBytes, + } + } + + const outputLinesArr: string[] = [] + let outputBytesCount = 0 + let truncatedBy: 'lines' | 'bytes' = 'lines' + for (let i = 0; i < lines.length && i < maxLines; i++) { + const line = lines[i] + const lineBytes = Buffer.byteLength(line, 'utf-8') + (i > 0 ? 1 : 0) + if (outputBytesCount + lineBytes > maxBytes) { + truncatedBy = 'bytes' + break + } + outputLinesArr.push(line) + outputBytesCount += lineBytes + } + if (outputLinesArr.length >= maxLines && outputBytesCount <= maxBytes) { + truncatedBy = 'lines' + } + const outputContent = outputLinesArr.join('\n') + return { + content: outputContent, + truncated: true, + truncatedBy, + totalLines, + totalBytes, + outputLines: outputLinesArr.length, + outputBytes: Buffer.byteLength(outputContent, 'utf-8'), + lastLinePartial: false, + firstLineExceedsLimit: false, + maxLines, + maxBytes, + } +} + +/** Truncate a string to fit within a byte limit, keeping the END and respecting + * UTF-8 character boundaries. */ +const truncateStringToBytesFromEnd = (text: string, maxBytes: number): string => { + const buf = Buffer.from(text, 'utf-8') + if (buf.length <= maxBytes) { + return text + } + let start = buf.length - maxBytes + while (start < buf.length && (buf[start] & 0xc0) === 0x80) { + start++ + } + return buf.subarray(start).toString('utf-8') +} + +/** + * Truncate content from the tail (keep the last N lines/bytes) — used by the bash + * tool, where the end (errors, final results) matters most. May return a partial + * first line when the original's last line alone exceeds the byte limit. + * + * @param content - the text to truncate + * @param options - optional line/byte limit overrides + */ +export const truncateTail = (content: string, options: TruncateOptions = {}): TruncationResult => { + const maxLines = options.maxLines ?? DEFAULT_MAX_LINES + const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES + const totalBytes = Buffer.byteLength(content, 'utf-8') + const lines = splitLinesForCounting(content) + const totalLines = lines.length + + if (totalLines <= maxLines && totalBytes <= maxBytes) { + return { + content, + truncated: false, + truncatedBy: null, + totalLines, + totalBytes, + outputLines: totalLines, + outputBytes: totalBytes, + lastLinePartial: false, + firstLineExceedsLimit: false, + maxLines, + maxBytes, + } + } + + const outputLinesArr: string[] = [] + let outputBytesCount = 0 + let truncatedBy: 'lines' | 'bytes' = 'lines' + let lastLinePartial = false + for (let i = lines.length - 1; i >= 0 && outputLinesArr.length < maxLines; i--) { + const line = lines[i] + const lineBytes = Buffer.byteLength(line, 'utf-8') + (outputLinesArr.length > 0 ? 1 : 0) + if (outputBytesCount + lineBytes > maxBytes) { + truncatedBy = 'bytes' + if (outputLinesArr.length === 0) { + const truncatedLine = truncateStringToBytesFromEnd(line, maxBytes) + outputLinesArr.unshift(truncatedLine) + outputBytesCount = Buffer.byteLength(truncatedLine, 'utf-8') + lastLinePartial = true + } + break + } + outputLinesArr.unshift(line) + outputBytesCount += lineBytes + } + if (outputLinesArr.length >= maxLines && outputBytesCount <= maxBytes) { + truncatedBy = 'lines' + } + const outputContent = outputLinesArr.join('\n') + return { + content: outputContent, + truncated: true, + truncatedBy, + totalLines, + totalBytes, + outputLines: outputLinesArr.length, + outputBytes: Buffer.byteLength(outputContent, 'utf-8'), + lastLinePartial, + firstLineExceedsLimit: false, + maxLines, + maxBytes, + } +} diff --git a/shared/agent-core/index.ts b/shared/agent-core/index.ts index b605a7740..bbfca604f 100644 --- a/shared/agent-core/index.ts +++ b/shared/agent-core/index.ts @@ -13,8 +13,19 @@ // browser throws `ReferenceError: process is not defined`. See ./browser-stubs/install-process.ts. import './browser-stubs/install-process.ts' -export { buildAnthropicModel, type AgentFetch, type BuildAnthropicModelOptions } from './anthropic-model.ts' -export { buildAppHarness, type BuildAppHarnessOptions } from './build-app-harness.ts' +export { + buildAnthropicModel, + isKnownAnthropicModel, + type AgentFetch, + type BuildAnthropicModelOptions, +} from './anthropic-model.ts' +export { buildOpenAiCompatModel, type BuildOpenAiCompatModelOptions } from './openai-compat-model.ts' +export { + buildAppHarness, + workspaceDirFor, + type BuildAppHarnessOptions, + type PiModelDescriptor, +} from './build-app-harness.ts' export { ensureBufferPolyfill } from './ensure-buffer.ts' export { toPiAgentTools } from './mcp-tools.ts' export type { SeedTurn } from './seed-history.ts' diff --git a/shared/agent-core/openai-compat-model.ts b/shared/agent-core/openai-compat-model.ts new file mode 100644 index 000000000..3722d2953 --- /dev/null +++ b/shared/agent-core/openai-compat-model.ts @@ -0,0 +1,184 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Builds a Pi-compatible OpenAI-completions model whose HTTP goes through an + * injected `fetch`. This is the OpenAI-family analogue of + * {@link buildAnthropicModel}: it serves every provider the app talks to over the + * OpenAI Chat Completions wire — `openai`, `custom`, `openrouter`, and + * `thunderbolt` (the backend proxy = openai-compatible against `cloudUrl`). + * + * Unlike the anthropic API, Pi's `openai-completions` provider exposes NO public + * `client?`/`fetch?` seam: its `stream`/`streamSimple` construct the `openai` SDK + * client internally via `new OpenAI({ apiKey, baseURL, defaultHeaders })` with no + * `fetch` override, so the SDK resolves its fetch from `getDefaultFetch()` — the + * global `fetch`. We therefore inject the app's proxy fetch by SYNCHRONOUSLY + * swapping `globalThis.fetch` for the exact window in which Pi constructs that + * client (see {@link withInjectedFetch}), then restoring it. + * + * Why the swap is race-free: + * - Pi's `stream()` runs an async IIFE whose SYNCHRONOUS prefix builds the + * OpenAI client (`createClient`) before the first `await`; `streamSimple()` + * calls `stream()` synchronously. The SDK captures `this.fetch` at + * construction, so the client is bound to our fetch inside the synchronous + * body of our wrapper. + * - JS is single-threaded and our swap window contains NO `await`, so no other + * code can observe the swapped global; we restore it in a `finally`. The + * captured fetch is what the SDK uses for the (later, async) HTTP, so the + * request flows through our fetch even after the global is restored. + * + * Documented reliances (re-verify on `@earendil-works/pi-ai` / `openai` bumps): + * 1. openai-completions constructs its SDK client synchronously, before any + * `await`, inside `stream()`/`streamSimple()`. + * 2. The `openai` SDK reads the global `fetch` via `getDefaultFetch()` when no + * `fetch` is passed to its constructor. + * + * Auth: the synthetic model carries `reasoning` (whether to request a reasoning + * effort at all). The provider's advisory `auth` mirrors anthropic; the real + * api key rides on the per-call options ({@link buildOpenAiCompatModel}'s `api` + * injects `opts.apiKey`), since Pi's openai client reads `options.apiKey`. + */ + +import { + type Api, + type Model, + type Models, + type ProviderStreams, + createModels, + createProvider, + envApiKeyAuth, + hasApi, +} from '@earendil-works/pi-ai' +import { + stream as openaiStream, + streamSimple as openaiStreamSimple, +} from '@earendil-works/pi-ai/api/openai-completions' +import type { AgentFetch } from './anthropic-model.ts' + +/** The Pi API this provider exclusively serves. */ +const API = 'openai-completions' + +/** Context window used when the app model carries none. Only consumed by Pi's + * token-budget math (irrelevant to openai-completions, which never caps tokens + * unless the caller passes `maxTokens`), so a generous default is harmless. */ +const DEFAULT_CONTEXT_WINDOW = 128_000 +/** Advisory max-output budget on the synthetic model. openai-completions only + * sends `max_completion_tokens` when the caller sets `options.maxTokens` (the + * harness does not), so this value never reaches the wire — it exists solely to + * satisfy the `Model` shape. */ +const DEFAULT_MAX_TOKENS = 8_192 + +/** Inputs for {@link buildOpenAiCompatModel}. */ +export type BuildOpenAiCompatModelOptions = { + /** Pi provider id; must equal the synthetic model's `provider` so the + * `MutableModels` dispatch resolves this provider. Carries the app provider + * name (`openai` | `custom` | `openrouter` | `thunderbolt`). */ + readonly providerId: string + /** Upstream model id sent on the wire, e.g. `opus-4.8` or `gpt-5`. */ + readonly modelId: string + /** OpenAI-compatible base URL (e.g. `cloudUrl`, `https://openrouter.ai/api/v1`). */ + readonly baseURL: string + /** Bearer key handed to the OpenAI SDK (may be a placeholder when the injected + * fetch supplies auth itself, e.g. thunderbolt SSO). */ + readonly apiKey: string + /** Fetch every request is routed through — the provider-specific app fetch + * (proxy fetch, or the SSO-aware fetch for thunderbolt). */ + readonly fetch: AgentFetch + /** Whether the model should request a reasoning effort. When false, Pi clamps + * any thinking level to `off` and sends no `reasoning_effort`. */ + readonly reasoning: boolean + /** Optional upstream context window for the synthetic model descriptor. */ + readonly contextWindow?: number +} + +/** + * Synchronously route `globalThis.fetch` through `fetchImpl` for the duration of + * `run()` — the window in which Pi constructs the OpenAI SDK client (which + * captures the global fetch). Restores the original fetch unconditionally. + * + * The window spans Pi's synchronous prefix up to its first `await` (which builds + * the client and then evaluates the `onPayload` hook). It contains NO `await`, so + * it is race-free (see the module header). The only app code that can run in it is + * the *synchronous* prefix of a harness `onPayload`/`onResponse` listener; the + * built-in harness registers none that issue a fetch there, so nothing observes + * the swapped global before it is restored. + */ +const withInjectedFetch = (fetchImpl: AgentFetch, run: () => T): T => { + const original = globalThis.fetch + globalThis.fetch = fetchImpl as unknown as typeof globalThis.fetch + try { + return run() + } finally { + globalThis.fetch = original + } +} + +/** + * Narrows a dispatched `Model` to the openai-completions model this provider + * exclusively serves, surfacing misuse loudly rather than guessing. Mirrors + * {@link buildAnthropicModel}'s `requireAnthropic`. + */ +const requireOpenAiCompletions = (model: Model): Model => { + if (!hasApi(model, API)) { + throw new Error(`Expected an "${API}" model, got "${model.api}".`) + } + return model +} + +/** Synthesize the Pi `Model<"openai-completions">` descriptor. The app's models + * live outside Pi's built-in catalog (custom URLs, backend-proxied ids), so we + * build the descriptor directly rather than resolving it. */ +const synthesizeModel = (opts: BuildOpenAiCompatModelOptions): Model => ({ + id: opts.modelId, + name: opts.modelId, + api: API, + provider: opts.providerId, + baseUrl: opts.baseURL, + reasoning: opts.reasoning, + input: ['text'], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: opts.contextWindow ?? DEFAULT_CONTEXT_WINDOW, + maxTokens: DEFAULT_MAX_TOKENS, +}) + +/** + * Resolves an OpenAI-compatible model and wires it through a provider whose HTTP + * flows through `opts.fetch`. Drop-in sibling of {@link buildAnthropicModel}: + * returns the same `{ models, model }` shape the harness consumes. + * + * @param opts - provider id, model id, base URL, api key, injected fetch, reasoning flag + * @returns the wired provider collection and the synthetic model + */ +export const buildOpenAiCompatModel = (opts: BuildOpenAiCompatModelOptions): { models: Models; model: Model } => { + const model = synthesizeModel(opts) + + // Inject the api key on every call (Pi's openai client reads `options.apiKey`) + // and bind the fetch only around client construction via the synchronous swap. + const api: ProviderStreams = { + stream: (resolved, context, options) => + withInjectedFetch(opts.fetch, () => + openaiStream(requireOpenAiCompletions(resolved), context, { ...options, apiKey: opts.apiKey }), + ), + streamSimple: (resolved, context, options) => + withInjectedFetch(opts.fetch, () => + openaiStreamSimple(requireOpenAiCompletions(resolved), context, { ...options, apiKey: opts.apiKey }), + ), + } + + const models = createModels() + models.setProvider( + createProvider({ + id: opts.providerId, + name: opts.providerId, + baseUrl: opts.baseURL, + // Advisory only: the real credential rides on the per-call options above. + // An empty env list makes resolution a graceful no-op in the browser. + auth: { apiKey: envApiKeyAuth(`${opts.providerId} API key`, []) }, + models: [model], + api, + }), + ) + + return { models, model } +} diff --git a/src/acp/built-in-adapter.test.ts b/src/acp/built-in-adapter.test.ts new file mode 100644 index 000000000..7e50653d8 --- /dev/null +++ b/src/acp/built-in-adapter.test.ts @@ -0,0 +1,101 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * `harnessSignature` tests — the fingerprint that drives the per-thread harness + * cache. A stable signature for unchanged config keeps the live harness; any + * change to model / provider / key / base url / reasoning / thinking level / + * system prompt must produce a different signature so a mid-thread config switch + * rebuilds the harness instead of silently reusing the first turn's config. + */ + +import '@/testing-library' + +import { describe, expect, it } from 'bun:test' +import { harnessSignature, type ResolvedPiModel } from './built-in-adapter' +import type { PiModelDescriptor } from '@shared/agent-core' + +const noopFetch = (async () => new Response('')) as PiModelDescriptor['fetch'] + +const anthropic = (overrides: Partial> = {}): ResolvedPiModel => ({ + descriptor: { kind: 'anthropic', modelId: 'claude-opus-4-8', apiKey: 'sk-a', fetch: noopFetch, ...overrides }, + thinkingLevel: 'medium', +}) + +const openaiCompat = ( + overrides: Partial> = {}, +): ResolvedPiModel => ({ + descriptor: { + kind: 'openai-compat', + providerId: 'openai', + modelId: 'gpt-5', + baseURL: 'https://api.openai.com/v1', + apiKey: 'sk-o', + fetch: noopFetch, + reasoning: false, + ...overrides, + }, + thinkingLevel: 'medium', +}) + +const noMcp = '' + +describe('harnessSignature', () => { + it('is stable for identical config', () => { + expect(harnessSignature(anthropic(), 'sys', noMcp)).toBe(harnessSignature(anthropic(), 'sys', noMcp)) + }) + + it('changes when the model id changes', () => { + expect(harnessSignature(anthropic(), 'sys', noMcp)).not.toBe( + harnessSignature(anthropic({ modelId: 'claude-sonnet-4-8' }), 'sys', noMcp), + ) + }) + + it('changes when the api key changes', () => { + expect(harnessSignature(anthropic(), 'sys', noMcp)).not.toBe( + harnessSignature(anthropic({ apiKey: 'sk-b' }), 'sys', noMcp), + ) + }) + + it('changes when the system prompt changes', () => { + expect(harnessSignature(anthropic(), 'sys', noMcp)).not.toBe(harnessSignature(anthropic(), 'other', noMcp)) + }) + + it('changes when the thinking level changes', () => { + const high: ResolvedPiModel = { ...anthropic(), thinkingLevel: 'high' } + expect(harnessSignature(anthropic(), 'sys', noMcp)).not.toBe(harnessSignature(high, 'sys', noMcp)) + }) + + it('changes when the set of MCP servers changes', () => { + expect(harnessSignature(anthropic(), 'sys', noMcp)).not.toBe( + harnessSignature(anthropic(), 'sys', 'srv-1@https://a'), + ) + }) + + it('does not collide across provider families', () => { + expect(harnessSignature(anthropic(), 'sys', noMcp)).not.toBe(harnessSignature(openaiCompat(), 'sys', noMcp)) + }) + + it('changes when the openai-compat base url changes', () => { + expect(harnessSignature(openaiCompat(), 'sys', noMcp)).not.toBe( + harnessSignature(openaiCompat({ baseURL: 'https://other/v1' }), 'sys', noMcp), + ) + }) + + it('changes when the openai-compat reasoning flag changes', () => { + expect(harnessSignature(openaiCompat(), 'sys', noMcp)).not.toBe( + harnessSignature(openaiCompat({ reasoning: true }), 'sys', noMcp), + ) + }) + + it('changes when the openai-compat context window changes', () => { + expect(harnessSignature(openaiCompat(), 'sys', noMcp)).not.toBe( + harnessSignature(openaiCompat({ contextWindow: 200000 }), 'sys', noMcp), + ) + }) + + it('does not embed the plaintext api key', () => { + expect(harnessSignature(anthropic({ apiKey: 'super-secret-key' }), 'sys', noMcp)).not.toContain('super-secret-key') + }) +}) diff --git a/src/acp/built-in-adapter.ts b/src/acp/built-in-adapter.ts index e1d921ae5..aa0e0d02a 100644 --- a/src/acp/built-in-adapter.ts +++ b/src/acp/built-in-adapter.ts @@ -10,33 +10,78 @@ * * Engine routing (behind the seam, invisible to the chat layer): * - * - **Anthropic models** run on the in-browser Pi {@link AgentHarness} - * (`shared/agent-core`): a real coding agent (bash/read/write/edit over an - * OPFS-backed ZenFS sandbox) whose LLM HTTP flows through the app's proxy - * fetch. Its Pi event stream is translated to the AI SDK v5 UI message + * - **Anthropic + OpenAI-wire models** (`anthropic`, plus the OpenAI-compatible + * family `openai`/`custom`/`openrouter`/`thunderbolt`) run on the in-browser + * Pi {@link AgentHarness} (`shared/agent-core`): a real coding agent + * (bash/read/write/edit over an OPFS-backed ZenFS sandbox) whose LLM HTTP + * flows through the app's per-provider fetch (proxy fetch, or the thunderbolt + * SSO fetch). Its Pi event stream is translated to the AI SDK v5 UI message * stream by `piHarnessToUiMessageStream`. The engine is `import()`-ed lazily - * (see `fetchViaHarness`) so its ~8MB stays off the chat entry chunk. - * - **Every other provider** (tinfoil, thunderbolt-proxy, openai, custom, …) - * stays on the legacy `aiFetchStreamingResponse` pipeline. The Pi anthropic - * model is the only engine wired so far; this gate is the explicit seam for - * migrating the rest later. + * (see `fetchViaHarness`) so its weight stays off the chat entry chunk. + * - **tinfoil** (confidential enclave) and any model id the chosen Pi provider + * can't resolve fall back to the legacy `aiFetchStreamingResponse` pipeline. + * tinfoil is deferred: its `SecureClient` does attestation/HPKE through a + * bespoke async-acquired fetch that doesn't fit Pi's synchronous fetch-swap + * cheaply, so routing it to Pi would risk the confidential path. * - * The harness is prompted with the latest user turn; prior turns are seeded into - * its session as history (`buildAppHarness({ history })`) so the agent has - * multi-turn context. Side-effecting tool calls (`bash`/`write`/`edit`/MCP) are - * gated on the chat layer's permission dialog; read-only `read` auto-allows. + * Each thread keeps a PERSISTENT harness (cached per `threadId` for the life of + * the adapter), mirroring the ACP path's per-thread session model: the first turn + * builds the harness (seeding any prior turns as history so a resumed conversation + * has context — `buildAppHarness({ history })`), and every later turn prompts that + * same live harness, whose session already holds the running transcript — no + * re-seeding. The cache is tagged with a config SIGNATURE (model / provider / api + * key / system prompt / thinking level / reasoning / active MCP servers): switching + * any of these mid-thread rebuilds the harness from the request-body history (the workspace, + * keyed by `threadId`, is kept so its files survive the rebuild). Each thread's + * harness is bound to its own isolated OPFS workspace (`/workspace/`), + * jailed so a thread's coding tools and shell can't reach another thread's files. + * Side-effecting tool calls (`bash`/`write`/`edit`/MCP) are gated on the chat + * layer's permission dialog; read-only `read` auto-allows. * - * No ACP handshake either way; `capabilities` is null. The harness is built per - * `fetch` (in-process, no wire), so `ensureSession`/`disconnect` are no-ops — - * there is no persistent connection or session to warm or tear down. + * No ACP handshake either way; `capabilities` is null and `ensureSession` is a + * no-op (no wire to warm). `disconnect` is real: it disposes every cached harness + * and removes its workspace, so no thread's session or files leak past the + * adapter's teardown (agent delete / config edit / sign-out). */ -import { aiFetchStreamingResponse, mergeMcpTools } from '@/ai/fetch' +import { aiFetchStreamingResponse, mergeMcpTools, resolveOpenAiCompatConnection } from '@/ai/fetch' +import { getModelProfile } from '@/dal' +import { getDb } from '@/db/database' import type { Agent, AgentAdapter, AgentAdapterContext } from '@/types/acp' -import type { ThunderboltUIMessage } from '@/types' -import type { SeedTurn } from '@shared/agent-core' +import type { Model, ModelProfile, ThunderboltUIMessage } from '@/types' +import type { PiModelDescriptor, SeedTurn } from '@shared/agent-core' import type { PermissionOption, RequestPermissionResponse, ToolKind } from '@agentclientprotocol/sdk' -import type { ThinkingLevel, ToolCallEvent, ToolCallResult } from '@earendil-works/pi-agent-core' +import type { AgentHarness, ThinkingLevel, ToolCallEvent, ToolCallResult } from '@earendil-works/pi-agent-core' + +/** The type of the lazily-imported Pi engine module. A pure type reference — it + * resolves the module's shape for the compiler without emitting a runtime + * import, so the ~8MB engine stays in the async chunk loaded inside + * {@link fetchViaHarness}, never on the chat entry bundle. */ +type AgentCoreModule = typeof import('@shared/agent-core') + +/** A thread's live harness plus the workspace it is bound to. Kept in the + * per-adapter cache so the conversation (which lives in the harness session) and + * its isolated OPFS workspace persist across the thread's turns. */ +type HarnessRecord = { + readonly harness: AgentHarness + /** The thread's isolated workspace dir ({@link workspaceDirFor}); removed on dispose. */ + readonly workspaceDir: string +} + +/** A thread's cached build, tagged with the config {@link harnessSignature} it was + * built for so a mid-thread config switch is detected and rebuilt. */ +type CachedHarness = { + readonly signature: string + /** The build PROMISE (see {@link HarnessCache}). */ + readonly record: Promise +} + +/** Per-thread harness cache: one persistent harness per chat thread, reused across + * that thread's turns while its config signature is unchanged. Stores the build + * PROMISE (not the resolved record) so concurrent first-turns dedupe to a single + * build; a failed build is evicted so the next turn retries against a fresh + * harness. */ +type HarnessCache = Map /** Production injection point — production binds to `aiFetchStreamingResponse`. */ export type AiFetchStreamingResponseFn = typeof aiFetchStreamingResponse @@ -47,9 +92,101 @@ export type BuiltInAdapterOptions = { aiFetch?: AiFetchStreamingResponseFn } -/** Reasoning depth handed to the harness. Fixed for now — deriving it from the - * model profile is a follow-up (see the adapter's gap notes). */ -const defaultThinkingLevel: ThinkingLevel = 'medium' +/** Providers the in-browser Pi harness can serve. Everything else (tinfoil, plus + * any future provider) stays on the legacy pipeline. */ +const piProviders = new Set(['anthropic', 'openai', 'custom', 'openrouter', 'thunderbolt']) + +/** Valid Pi thinking levels, used to validate a profile-supplied effort string. */ +const piThinkingLevels = new Set(['off', 'minimal', 'low', 'medium', 'high', 'xhigh']) + +/** Reasoning depth used when a model carries no explicit profile config. Mirrors + * the adaptive default the anthropic path has always used, so deriving the level + * never regresses a model that didn't configure one. */ +const fallbackThinkingLevel: ThinkingLevel = 'medium' + +/** Maps an Anthropic-style thinking budget (tokens) to a Pi level by upper bound: + * ≤0 → off, ≤1024 → minimal, ≤4096 → low, ≤12288 → medium, else high. */ +const budgetToThinkingLevel = (budget: number): ThinkingLevel => { + if (budget <= 0) { + return 'off' + } + if (budget <= 1024) { + return 'minimal' + } + if (budget <= 4096) { + return 'low' + } + if (budget <= 12288) { + return 'medium' + } + return 'high' +} + +/** Coerce a profile effort string to a Pi level. Maps the explicit "off" signals + * ('off'/'none') to `off`, accepts the Pi levels verbatim, and rejects anything + * else (returning null so the caller can keep looking / fall back). */ +const effortToThinkingLevel = (value: unknown): ThinkingLevel | null => { + if (typeof value !== 'string') { + return null + } + if (value === 'none') { + return 'off' + } + return piThinkingLevels.has(value as ThinkingLevel) ? (value as ThinkingLevel) : null +} + +/** Pull a Pi thinking level out of a profile's `providerOptions`, the only + * per-model reasoning signal in the data model (there is no thinking-level + * column). Recognizes the OpenAI `reasoningEffort`/`reasoning_effort` strings, + * a nested `reasoning.effort`, and the Anthropic-style `thinking` object + * (`{ type: 'disabled' }` → off; `{ budgetTokens }` → bucketed level). Returns + * null when no reasoning config is present. */ +const readProfileThinkingLevel = ( + providerOptions: Record | null | undefined, +): ThinkingLevel | null => { + if (!providerOptions) { + return null + } + const direct = + effortToThinkingLevel(providerOptions.reasoningEffort) ?? effortToThinkingLevel(providerOptions.reasoning_effort) + if (direct) { + return direct + } + const reasoning = providerOptions.reasoning + if (reasoning && typeof reasoning === 'object') { + const nested = effortToThinkingLevel((reasoning as { effort?: unknown }).effort) + if (nested) { + return nested + } + } + const thinking = providerOptions.thinking + if (thinking && typeof thinking === 'object') { + const { type, budgetTokens } = thinking as { type?: unknown; budgetTokens?: unknown } + if (type === 'disabled') { + return 'off' + } + if (typeof budgetTokens === 'number') { + return budgetToThinkingLevel(budgetTokens) + } + } + return null +} + +/** The Pi thinking level for a model: its explicit profile reasoning config, else + * the adaptive fallback. Used for the anthropic path (whose catalog model is + * natively adaptive) and as the effort for OpenAI-wire reasoning models. */ +const deriveThinkingLevel = (profile: ModelProfile | null): ThinkingLevel => + readProfileThinkingLevel(profile?.providerOptions) ?? fallbackThinkingLevel + +/** Whether an OpenAI-wire model should request reasoning at all. Only models + * whose profile configures a non-`off` effort opt in; without config (or with an + * explicit `off`/`disabled`) the synthetic Pi model stays non-reasoning (Pi then + * sends no `reasoning_effort`, matching the legacy pipeline, which only forwards + * configured providerOptions). */ +const hasExplicitReasoning = (profile: ModelProfile | null): boolean => { + const level = readProfileThinkingLevel(profile?.providerOptions) + return level !== null && level !== 'off' +} /** The two choices we surface for a built-in tool-call permission prompt. * Stable ids so the response can be mapped back to allow/deny by kind. */ @@ -178,64 +315,270 @@ const cancelledOnAbort = (signal: AbortSignal): Promise resolve({ outcome: { outcome: 'cancelled' } }), { once: true }) }) -/** Run the built-in request on the in-browser Pi harness and return its stream - * as the AI SDK UI message stream `Response`. */ -const fetchViaHarness = async (init: RequestInit, context: AgentAdapterContext): Promise => { - // Sanctioned route-splitting exception (CLAUDE.md "Route-level Code Splitting"). - // The Pi engine (`pi-*`, `zenfs`, `just-bash`, `@anthropic-ai/sdk` — ~8MB) must - // NOT sit in the chat entry chunk on the critical landing path. This dynamic - // import keeps it in a separate async chunk that loads only when a built-in - // Anthropic agent actually runs; the legacy path's imports stay static. - const { buildAppHarness, piHarnessToUiMessageStream, toPiAgentTools } = await import('@shared/agent-core') +/** No-op unsubscribe, returned when no permission sink is wired (tools auto-run). */ +const noop = (): void => {} - const { history, prompt } = prepareConversation(init, context.skillInstructions) +/** + * Register the tool-call permission hook for ONE turn and return its unsubscribe. + * The hook closes over this turn's `requestPermission` sink and abort `signal`, so + * on a persistent (reused) harness it MUST be removed when the turn settles — + * leaving stacked hooks would fire one stale dialog per past turn. Read-only tools + * auto-allow; with no `requestPermission` sink nothing is registered (tools auto-run). + */ +const registerToolCallPermission = ( + harness: AgentHarness, + context: AgentAdapterContext, + signal: AbortSignal | null | undefined, +): (() => void) => { + const { requestPermission } = context + if (!requestPermission) { + return noop + } + return harness.on('tool_call', async (event: ToolCallEvent) => { + if (readOnlyTools.has(event.toolName)) { + return undefined + } + const ask = requestPermission({ + sessionId: context.threadId, + toolCall: { + toolCallId: event.toolCallId, + title: event.toolName, + kind: toToolKind(event.toolName), + rawInput: event.input, + status: 'pending', + }, + options: [...permissionOptions], + }) + const response = signal ? await Promise.race([ask, cancelledOnAbort(signal)]) : await ask + return toToolCallResult(response) + }) +} +/** A resolved Pi model descriptor plus the thinking level derived from its + * profile. A null result at the call site means the model isn't Pi-serviceable + * (an anthropic id Pi's catalog lacks, or an OpenAI-wire provider missing its + * api key / url) and the request falls back to the legacy pipeline. */ +export type ResolvedPiModel = { + readonly descriptor: PiModelDescriptor + readonly thinkingLevel: ThinkingLevel +} + +/** Resolve the selected model to a Pi descriptor + thinking level, or null to + * fall back to legacy. Anthropic ids must exist in Pi's built-in catalog; + * OpenAI-wire providers must resolve a connection (api key / url present). The + * thinking level is derived from the model's profile for both families. */ +const resolvePiModel = async ( + agentCore: AgentCoreModule, + context: AgentAdapterContext, +): Promise => { + const model = context.selectedModel + const profile = await getModelProfile(getDb(), model.id) + const thinkingLevel = deriveThinkingLevel(profile) + if (model.provider === 'anthropic') { + if (!agentCore.isKnownAnthropicModel(model.model)) { + return null + } + return { + descriptor: { + kind: 'anthropic', + modelId: model.model, + apiKey: model.apiKey ?? '', + fetch: context.getProxyFetch(), + }, + thinkingLevel, + } + } + const connection = resolveOpenAiCompatConnection(model, context.getProxyFetch) + // Pi's openai-completions client requires a bearer key (it throws on an empty + // one with no auth header). A `custom` model pointing at a no-auth local + // endpoint (ollama / llama.cpp) has no key, so it stays on the legacy pipeline + // (which omits the Authorization header) rather than crashing the run. + if (!connection || !connection.apiKey) { + return null + } + return { + descriptor: { + kind: 'openai-compat', + providerId: model.provider, + modelId: model.model, + baseURL: connection.baseURL, + apiKey: connection.apiKey, + fetch: connection.fetch, + reasoning: hasExplicitReasoning(profile), + contextWindow: model.contextWindow ?? undefined, + }, + thinkingLevel, + } +} + +/** Compact non-cryptographic fingerprint (FNV-1a) of a secret, so the harness + * signature can detect an api-key change without embedding the plaintext key. */ +const hashSecret = (value: string): string => { + let hash = 0x811c9dc5 + for (let i = 0; i < value.length; i++) { + hash = Math.imul(hash ^ value.charCodeAt(i), 0x01000193) + } + return (hash >>> 0).toString(36) +} + +/** Fingerprint every input baked into a thread's harness at build time — the + * descriptor (provider / model id / api key / base url / reasoning / context + * window), the thinking level, the system prompt, and the active MCP servers. + * When it changes mid-thread (a model, provider, key, mode/system-prompt, + * thinking, or MCP-server switch) the cached harness is stale and + * {@link getOrBuildHarness} rebuilds it; an unchanged signature reuses the live + * harness. `mcpFingerprint` is supplied by the caller (the harness bakes the MCP + * toolset in, so it's part of the build config). */ +export const harnessSignature = (resolved: ResolvedPiModel, systemPrompt: string, mcpFingerprint: string): string => { + const d = resolved.descriptor + const model = + d.kind === 'anthropic' + ? `anthropic|${d.modelId}|${hashSecret(d.apiKey)}` + : `openai-compat|${d.providerId}|${d.modelId}|${d.baseURL}|${hashSecret(d.apiKey)}|${d.reasoning}|${d.contextWindow ?? ''}` + return `${model}|${resolved.thinkingLevel}|${systemPrompt}|mcp:${mcpFingerprint}` +} + +/** Stable fingerprint of the thread's active MCP servers (sorted ids + urls). The + * harness bakes their tools in at build time, so a mid-thread add/remove/retarget + * must rebuild it. Reconnecting the same server (same id+url) keeps the + * fingerprint stable, so it doesn't thrash the cache. */ +const mcpFingerprintOf = (context: AgentAdapterContext): string => + context.mcpClients + .map((client) => `${client.id}@${client.url}`) + .sort() + .join(',') + +/** Build a thread's harness from the lazily-loaded engine: convert the thread's + * MCP servers to Pi tools and bind the harness to the thread's isolated workspace + * with the resolved model descriptor + thinking level. `history` is seeded only + * HERE — on the first turn (a resumed conversation's prior turns) and on a + * config-drift rebuild (re-seeding the transcript into the fresh harness); an + * unchanged-config later turn reuses this harness, whose session already holds it. */ +const buildHarnessRecord = async ( + agentCore: AgentCoreModule, + context: AgentAdapterContext, + resolved: ResolvedPiModel, + history: readonly SeedTurn[], +): Promise => { // The thread's MCP servers become Pi tools (namespaced `_`), reusing // the legacy pipeline's merge/prefix logic. Only tool-capable models reach here — // the harness always adds the four coding tools, so no-tools models route to legacy. const { toolset } = await mergeMcpTools({}, context.mcpClients, context.reconnectClient) - const tools = await toPiAgentTools(toolset) - - const harness = await buildAppHarness({ - apiKey: context.selectedModel.apiKey ?? '', - fetch: context.getProxyFetch(), - modelId: context.selectedModel.model, + const tools = await agentCore.toPiAgentTools(toolset) + const harness = await agentCore.buildAppHarness({ + model: resolved.descriptor, systemPrompt: context.selectedMode.systemPrompt ?? '', - thinkingLevel: defaultThinkingLevel, + thinkingLevel: resolved.thinkingLevel, + threadId: context.threadId, tools, history, }) + return { harness, workspaceDir: agentCore.workspaceDirFor(context.threadId) } +} - // Gate side-effecting tool calls on the chat layer's permission dialog; read-only - // tools auto-allow (no prompt). Without a `requestPermission` sink the hook is - // left unregistered so every tool auto-runs. - const { requestPermission } = context - const signal = init.signal - if (requestPermission) { - harness.on('tool_call', async (event: ToolCallEvent) => { - if (readOnlyTools.has(event.toolName)) { - return undefined - } - const ask = requestPermission({ - sessionId: context.threadId, - toolCall: { - toolCallId: event.toolCallId, - title: event.toolName, - kind: toToolKind(event.toolName), - rawInput: event.input, - status: 'pending', - }, - options: [...permissionOptions], - }) - const response = signal ? await Promise.race([ask, cancelledOnAbort(signal)]) : await ask - return toToolCallResult(response) - }) +/** Return the thread's cached harness, building it on first use and REBUILDING it + * when the config {@link harnessSignature} drifts (a mid-thread model / provider / + * key / mode / thinking switch). On drift the stale harness is evicted and its run + * aborted, but its workspace is KEPT — the rebuild re-seeds history from the + * request body and reuses the same `threadId`-keyed workspace, so the conversation + * context and the agent's files both survive. Concurrent first-turns share one + * in-flight build; a rejected build is evicted so a later turn retries fresh + * instead of replaying the poisoned promise. */ +const getOrBuildHarness = ( + cache: HarnessCache, + threadId: string, + signature: string, + build: () => Promise, +): Promise => { + const cached = cache.get(threadId) + if (cached && cached.signature === signature) { + return cached.record } + // Config drift (or first turn). On drift, abort the stale harness's run and + // WAIT for that to settle before building the replacement, so the old and new + // harness never write the shared (threadId-keyed) workspace concurrently. The + // workspace dir is kept — the rebuild reuses the thread's files; a rejected + // prior build is swallowed so the rebuild still proceeds. + const previous = cached?.record + const record = previous ? previous.then(abortHarness, () => {}).then(build) : build() + record.catch(() => { + if (cache.get(threadId)?.record === record) { + cache.delete(threadId) + } + }) + cache.set(threadId, { signature, record }) + return record +} + +/** Abort a harness's in-flight run WITHOUT removing its workspace. Used on a + * config-drift eviction, where the rebuilt harness reuses the same workspace. */ +const abortHarness = async (record: HarnessRecord): Promise => { + await record.harness.abort().catch(() => {}) +} + +/** Tear down one thread's harness: abort any in-flight run, then remove its + * isolated workspace so no files leak. Optimistic — `remove` can't throw + * (`force`), and a benign idle-abort error is swallowed. */ +const disposeHarness = async (record: HarnessRecord): Promise => { + await abortHarness(record) + await record.harness.env.remove(record.workspaceDir, { recursive: true, force: true }) +} + +/** Dispose every cached harness and clear the cache. Fire-and-forget so the + * adapter's synchronous `disconnect` doesn't await teardown; a never-resolved or + * rejected build is swallowed so no straggler escapes as an unhandled rejection. */ +const disposeAllHarnesses = (cache: HarnessCache): void => { + const cached = [...cache.values()] + cache.clear() + void Promise.all(cached.map(({ record }) => record.then(disposeHarness).catch(() => {}))) +} + +/** Run the built-in request on the thread's persistent in-browser Pi harness and + * return its stream as the AI SDK UI message stream `Response`. Falls back to the + * legacy pipeline when the model isn't Pi-serviceable (unresolvable id/config). */ +const fetchViaHarness = async ( + init: RequestInit, + context: AgentAdapterContext, + cache: HarnessCache, + fallback: () => Promise, +): Promise => { + // Sanctioned route-splitting exception (CLAUDE.md "Route-level Code Splitting"). + // The Pi engine (`pi-*`, `zenfs`, `just-bash`, `@anthropic-ai/sdk`, `openai` — + // several MB) must NOT sit in the chat entry chunk on the critical landing path. + // This dynamic import keeps it in a separate async chunk that loads only when a + // built-in Pi agent actually runs; the legacy path's imports stay static. + const agentCore = await import('@shared/agent-core') + + // Resolve the model to a Pi descriptor; an unknown anthropic id or an + // unconfigured OpenAI-wire provider falls back to the legacy pipeline so the + // chat never crashes on a model Pi can't run. + const resolved = await resolvePiModel(agentCore, context) + if (!resolved) { + return fallback() + } + + const { history, prompt } = prepareConversation(init, context.skillInstructions) + + // Build the thread's harness on its first turn (seeding `history`); reuse it on + // every later turn whose config signature is unchanged, and rebuild it when the + // signature drifts (a mid-thread model / provider / key / mode / thinking / MCP switch). + const signature = harnessSignature(resolved, context.selectedMode.systemPrompt ?? '', mcpFingerprintOf(context)) + const { harness } = await getOrBuildHarness(cache, context.threadId, signature, () => + buildHarnessRecord(agentCore, context, resolved, history), + ) + + // Gate side-effecting tool calls on the chat layer's permission dialog for THIS + // turn, then unregister so the reused harness never carries a stale turn's hook. + const unregisterPermission = registerToolCallPermission(harness, context, init.signal) return new Response( - piHarnessToUiMessageStream(harness, async () => { - await harness.prompt(prompt) - await harness.waitForIdle() + agentCore.piHarnessToUiMessageStream(harness, async () => { + try { + await harness.prompt(prompt) + await harness.waitForIdle() + } finally { + unregisterPermission() + } }), { status: 200, headers: { 'Content-Type': 'text/event-stream' } }, ) @@ -253,6 +596,11 @@ const fetchViaHarness = async (init: RequestInit, context: AgentAdapterContext): export const createBuiltInAdapter = (agent: Agent, options: BuiltInAdapterOptions = {}): AgentAdapter => { const aiFetch = options.aiFetch ?? aiFetchStreamingResponse + // Per-thread harness cache, scoped to this adapter instance. The adapter is + // itself cached per-agent (`adapter-cache.ts`), so a thread's harness survives + // across all of that thread's turns; `disconnect` disposes them all. + const harnessCache: HarnessCache = new Map() + /** Legacy engine — every provider the Pi harness doesn't (yet) serve. */ const fetchViaLegacyPipeline = (init: RequestInit, context: AgentAdapterContext): Promise => aiFetch({ @@ -266,20 +614,24 @@ export const createBuiltInAdapter = (agent: Agent, options: BuiltInAdapterOption getProxyFetch: context.getProxyFetch, }) - // Route tool-capable Anthropic models to the in-browser Pi harness; everything - // else (other providers, or a no-tools Anthropic model the harness can't honor - // since it always activates coding tools) stays on the legacy pipeline. + // Route tool-capable Pi-serviceable models (anthropic + the OpenAI-wire family) + // to the in-browser Pi harness; everything else (tinfoil, or a no-tools model + // the harness can't honor since it always activates coding tools) stays on the + // legacy pipeline. fetchViaHarness itself falls back when a candidate model + // turns out to be unresolvable (unknown id / missing api key or url). + const isPiCandidate = (model: Model): boolean => piProviders.has(model.provider) && model.toolUsage !== 0 const fetch = (init: RequestInit, context: AgentAdapterContext): Promise => - context.selectedModel.provider === 'anthropic' && context.selectedModel.toolUsage !== 0 - ? fetchViaHarness(init, context) + isPiCandidate(context.selectedModel) + ? fetchViaHarness(init, context, harnessCache, () => fetchViaLegacyPipeline(init, context)) : fetchViaLegacyPipeline(init, context) return { agent, capabilities: null, fetch, - // No ACP session and no persistent harness — the engine is built per fetch. + // No ACP wire to warm. Each thread's harness IS persistent, so disconnect + // disposes every cached harness and removes its isolated workspace. ensureSession: async () => {}, - disconnect: () => {}, + disconnect: () => disposeAllHarnesses(harnessCache), } } diff --git a/src/ai/fetch.ts b/src/ai/fetch.ts index e709b2fc3..4acaf5249 100644 --- a/src/ai/fetch.ts +++ b/src/ai/fetch.ts @@ -251,6 +251,72 @@ export const mergeMcpTools = async ( } } +/** Raw OpenAI-compatible connection for a model: the three knobs every + * OpenAI-wire provider construction needs ({@link createModel} for the legacy + * Vercel SDK, the in-browser Pi harness for the built-in agent). `fetch` is the + * provider-specific app fetch — the universal proxy fetch for + * `openai`/`custom`/`openrouter`, or the SSO-aware fetch for `thunderbolt`. */ +export type OpenAiCompatConnection = { + baseURL: string + apiKey: string + fetch: FetchFn +} + +/** + * Resolve the raw OpenAI-compatible connection for a model, mirroring the + * per-provider construction in {@link createModel}. Returns `null` for providers + * the OpenAI wire doesn't serve (`anthropic` has its own SDK; `tinfoil` needs the + * enclave client) or when required config is missing (no api key / url) — callers + * fall back to the legacy pipeline rather than crash. + * + * Centralizes the intricate `thunderbolt` SSO-fetch logic so the legacy and Pi + * paths can't drift. + * + * @param modelConfig - the model whose connection to resolve + * @param getProxyFetch - lazily resolved universal proxy fetch + * @returns the connection, or `null` when unsupported/unconfigured + */ +export const resolveOpenAiCompatConnection = ( + modelConfig: Model, + getProxyFetch: () => FetchFn, +): OpenAiCompatConnection | null => { + switch (modelConfig.provider) { + case 'thunderbolt': { + const cloudUrl = getLocalSetting('cloudUrl') + const token = getAuthToken() || 'thunderbolt' + // See the `thunderbolt` case in createModel for the SSO/token rationale: + // SSO web has no bearer token (cookie auth), so strip the placeholder + // Authorization and send credentials; Tauri SSO keeps its real bearer. + const sso = isSsoMode() + const hasRealToken = Boolean(getAuthToken()) + const ssoFetch: typeof fetch = Object.assign( + (input: RequestInfo | URL, init?: RequestInit) => { + const headers = new Headers(init?.headers) + headers.delete('authorization') + return fetch(input, { ...init, headers, credentials: 'include' }) + }, + { preconnect: fetch.preconnect }, + ) + const providerFetch: FetchFn = sso && !hasRealToken ? ssoFetch : fetch + return { baseURL: cloudUrl, apiKey: token, fetch: providerFetch } + } + case 'openai': + return modelConfig.apiKey + ? { baseURL: 'https://api.openai.com/v1', apiKey: modelConfig.apiKey, fetch: getProxyFetch() } + : null + case 'custom': + return modelConfig.url + ? { baseURL: modelConfig.url, apiKey: modelConfig.apiKey ?? '', fetch: getProxyFetch() } + : null + case 'openrouter': + return modelConfig.apiKey + ? { baseURL: 'https://openrouter.ai/api/v1', apiKey: modelConfig.apiKey, fetch: getProxyFetch() } + : null + default: + return null + } +} + export const createModel = async (modelConfig: Model, getProxyFetch: () => FetchFn) => { // The thunderbolt provider goes through its own SSO-aware fetch below; all // other providers route through the universal proxy. We resolve the proxy @@ -258,8 +324,6 @@ export const createModel = async (modelConfig: Model, getProxyFetch: () => Fetch // (e.g. cloudUrl, proxy_enabled toggle) is picked up. switch (modelConfig.provider) { case 'thunderbolt': { - const cloudUrl = getLocalSetting('cloudUrl') - const token = getAuthToken() || 'thunderbolt' // SSO web flow authenticates via session cookies — the SSO callback is a // browser redirect, not an XHR, so `set-auth-token` never reaches the // client and getAuthToken() returns null. The AI SDKs require an apiKey @@ -271,25 +335,23 @@ export const createModel = async (modelConfig: Model, getProxyFetch: () => Fetch // Tauri desktop SSO uses a loopback server that returns a real bearer // token (stored via setAuthToken). In that case we must keep the // Authorization header because WKWebView can't send cross-origin cookies. - const sso = isSsoMode() - const hasRealToken = Boolean(getAuthToken()) - const ssoFetch = (input: RequestInfo | URL, init?: RequestInit) => { - const headers = new Headers(init?.headers) - headers.delete('authorization') - return fetch(input, { ...init, headers, credentials: 'include' }) + // The connection (baseURL/apiKey/SSO-fetch) lives in + // resolveOpenAiCompatConnection so the Pi harness reuses the same logic. + const conn = resolveOpenAiCompatConnection(modelConfig, getProxyFetch) + if (!conn) { + throw new Error('No connection resolved for thunderbolt provider') } - ssoFetch.preconnect = fetch.preconnect - const providerFetch: typeof fetch = sso && !hasRealToken ? ssoFetch : fetch + const { baseURL, apiKey, fetch: providerFetch } = conn // OpenAI-vendor thunderbolt models use createOpenAI with .chat() to force Chat Completions API // (AI SDK 5 defaults createOpenAI to Responses API which our backend doesn't support) if (modelConfig.vendor === 'openai') { - const provider = createOpenAI({ baseURL: cloudUrl, apiKey: token, fetch: providerFetch }) + const provider = createOpenAI({ baseURL, apiKey, fetch: providerFetch }) return provider.chat(modelConfig.model) } const provider = createOpenAICompatible({ name: 'thunderbolt', - baseURL: cloudUrl, - apiKey: token, + baseURL, + apiKey, fetch: providerFetch, }) return provider(modelConfig.model) @@ -307,38 +369,41 @@ export const createModel = async (modelConfig: Model, getProxyFetch: () => Fetch return anthropic(modelConfig.model) } case 'openai': { - if (!modelConfig.apiKey) { + const conn = resolveOpenAiCompatConnection(modelConfig, getProxyFetch) + if (!conn) { throw new Error('No API key provided') } const openai = createOpenAI({ - apiKey: modelConfig.apiKey, - fetch: getProxyFetch(), + apiKey: conn.apiKey, + fetch: conn.fetch, }) return openai(modelConfig.model) } case 'custom': { - if (!modelConfig.url) { + const conn = resolveOpenAiCompatConnection(modelConfig, getProxyFetch) + if (!conn) { throw new Error('No URL provided for custom provider') } const openaiCompatible = createOpenAICompatible({ name: 'custom', - baseURL: modelConfig.url, - apiKey: modelConfig.apiKey || undefined, - fetch: getProxyFetch(), + baseURL: conn.baseURL, + apiKey: conn.apiKey || undefined, + fetch: conn.fetch, }) return openaiCompatible(modelConfig.model) } case 'openrouter': { - if (!modelConfig.apiKey) { + const conn = resolveOpenAiCompatConnection(modelConfig, getProxyFetch) + if (!conn) { throw new Error('No API key provided') } // Using OpenAI-compatible approach until @openrouter/ai-sdk-provider supports Vercel AI SDK v5 // https://github.com/OpenRouterTeam/ai-sdk-provider/pull/77 const openrouter = createOpenAICompatible({ name: 'openrouter', - baseURL: 'https://openrouter.ai/api/v1', - apiKey: modelConfig.apiKey, - fetch: getProxyFetch(), + baseURL: conn.baseURL, + apiKey: conn.apiKey, + fetch: conn.fetch, }) return openrouter(modelConfig.model) } diff --git a/vite.config.ts b/vite.config.ts index 3a94d1098..bd36b4f17 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -113,61 +113,34 @@ export default defineConfig({ // machinery into the lazy PowerSync chunk. Like powersync-web-internal above, // lib/ is an internal path — verify it still exists when upgrading the package. '@powersync/common': path.resolve(__dirname, 'node_modules/@powersync/common/lib/index.js'), - // The in-browser Pi harness (lazy `@shared/agent-core` chunk) pulls Pi's Node - // child-process helper, which imports `cross-spawn` (and, transitively, `which`). - // Both evaluate `process.platform` at module scope, throwing - // `ReferenceError: process is not defined` on import in the browser — before any - // LLM call. The harness never resolves OS executables (bash runs through - // BrowserExecutionEnv / just-bash over ZenFS), so these modules are dead weight - // on the browser path; alias them to throw-on-call stubs (they load fine; only a - // real call throws). A bare-specifier alias catches every copy regardless of - // nesting and is honored by both the dev dep optimizer and the production build - // (both Rolldown-based in Vite 8). - 'cross-spawn': path.resolve(__dirname, './shared/agent-core/browser-stubs/cross-spawn.ts'), - which: path.resolve(__dirname, './shared/agent-core/browser-stubs/which.ts'), - // Pi is a Node CLI: a few of its modules import these builtins at module scope - // (`config.js` → url+path, the clipboard helper → url+module+path). Vite's - // default `browser-external:*` leaves the named exports undefined, so importing - // Pi throws (e.g. "fileURLToPath is not a function"). Map them to browser shims: - // `path` to the battle-tested `path-browserify` (its functions also run at - // browser runtime when the read/write/edit tools resolve paths), and `url`/ - // `module` to tiny stubs that satisfy the module-scope reads. (The bare - // `process` global is handled separately in shared/agent-core/index.ts.) - url: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-url.ts'), - 'node:url': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-url.ts'), + // ---- In-browser Pi harness (lazy `@shared/agent-core` chunk) Node shims ---- + // The harness runs `@earendil-works/pi-agent-core` + `pi-ai` + `just-bash` + + // ZenFS in the browser. The four coding tools are now plain `AgentTool`s over + // BrowserExecutionEnv (see `shared/agent-core/coding-tools`), so the + // `@earendil-works/pi-coding-agent` CLI — and its cross-spawn / which / undici / + // graceful-fs / pi-tui cascade — is no longer imported. Only a small residual of + // Node-builtin shims remains, for code still on the app path: + // + // `just-bash`'s browser bundle evaluates `createRequire(import.meta.url)` at + // module scope, so `module` must resolve to a shim that exposes `createRequire`. module: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-module.ts'), 'node:module': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-module.ts'), + // `path` runs at browser runtime; use the battle-tested polyfill. path: 'path-browserify', 'node:path': 'path-browserify', - // Pi also touches `fs`/`os` (config/package detection) and `crypto` - // (runtime id generation) — Vite's `browser-external:*` leaves these - // undefined. `crypto` delegates to the browser's native Web Crypto (real - // `randomUUID`/`randomBytes`); `fs`/`os` present an empty filesystem so Pi - // falls back to defaults (the harness's real I/O goes through ZenFS, never - // these). No app code imports these in the browser — only Pi does. - // NOTE: `fs/promises` MUST precede `fs` — a string alias matches `find` and - // `find/*`, so `fs` would otherwise swallow `fs/promises` → `node-fs.ts/promises`. + // `crypto` delegates to the browser's native Web Crypto (real `randomUUID` / + // `randomBytes`); `fs`/`fs/promises` present an empty filesystem (the harness's + // real I/O goes through ZenFS). All are reached only lazily — via the + // `createRequire` shim above, pi-ai's `process.versions.bun`-guarded + // `require("node:fs")` fallback, or optional SDK code paths — never at module + // scope. NOTE: `fs/promises` MUST precede `fs` — a string alias also matches the + // `fs/promises` subpath, so `fs` would otherwise swallow it. 'fs/promises': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-fs-promises.ts'), 'node:fs/promises': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-fs-promises.ts'), - // node-fs is CommonJS (not ESM) so `graceful-fs` can monkey-patch it in place. fs: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-fs.cjs'), 'node:fs': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-fs.cjs'), - // `graceful-fs` calls `require('constants').hasOwnProperty(...)`; the - // browser-external proxy's `hasOwnProperty` isn't callable, so give it a real object. - constants: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-constants.cjs'), - 'node:constants': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-constants.cjs'), - os: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-os.ts'), - 'node:os': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-os.ts'), crypto: path.resolve(__dirname, './shared/agent-core/browser-stubs/node-crypto.ts'), 'node:crypto': path.resolve(__dirname, './shared/agent-core/browser-stubs/node-crypto.ts'), - // pi-tui extends `EventEmitter`; map `events` to its browser polyfill (explicit - // file path so the alias can't resolve back to the externalized Node builtin). - events: path.resolve(__dirname, './node_modules/events/events.js'), - 'node:events': path.resolve(__dirname, './node_modules/events/events.js'), - // `undici` (Pi's Node HTTP dispatcher) extends Node stream/net/tls classes at - // module scope and is never used in the browser (model calls go through the - // injected proxy fetch). Stub it so its Node-only graph stays out of the bundle. - undici: path.resolve(__dirname, './shared/agent-core/browser-stubs/undici.ts'), }, conditions: ['browser'], }, From a4e79cdaea9c442977a5a0d4109ee426c4f9924f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Menezes?= Date: Mon, 29 Jun 2026 08:42:58 -0300 Subject: [PATCH 05/86] feat: serve the built-in pi agent over an acp endpoint for the bridge --- cli/bun.lock | 3 + cli/package.json | 1 + cli/src/acp/harness-agent.test.ts | 221 +++++++++++++++++++++++ cli/src/acp/harness-agent.ts | 285 ++++++++++++++++++++++++++++++ cli/src/acp/harness-to-acp.ts | 135 ++++++++++++++ cli/src/acp/serve.ts | 45 +++++ cli/src/agent/harness.ts | 6 +- cli/src/agent/types.ts | 24 ++- cli/src/cli.ts | 37 +++- cli/src/index.ts | 9 + 10 files changed, 753 insertions(+), 13 deletions(-) create mode 100644 cli/src/acp/harness-agent.test.ts create mode 100644 cli/src/acp/harness-agent.ts create mode 100644 cli/src/acp/harness-to-acp.ts create mode 100644 cli/src/acp/serve.ts diff --git a/cli/bun.lock b/cli/bun.lock index ee94594ef..db9372b16 100644 --- a/cli/bun.lock +++ b/cli/bun.lock @@ -5,6 +5,7 @@ "": { "name": "@thunderbolt/cli", "dependencies": { + "@agentclientprotocol/sdk": "0.22.1", "@earendil-works/pi-agent-core": "0.80.2", "@earendil-works/pi-ai": "0.80.2", "@earendil-works/pi-coding-agent": "0.80.2", @@ -17,6 +18,8 @@ }, }, "packages": { + "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.22.1", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-DfqXtl/8gO9NImq094MTaCXEU2vkhh6v7q/kT+9UjZxUqj8hYaya2OjLVIqn16MzNHcXEpShTR2RIauLSYeDQQ=="], + "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.91.1", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw=="], "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], diff --git a/cli/package.json b/cli/package.json index e16615ae3..449b2691a 100644 --- a/cli/package.json +++ b/cli/package.json @@ -20,6 +20,7 @@ "build:all": "bun run build:darwin-arm64 && bun run build:darwin-x64 && bun run build:linux-x64 && bun run build:linux-arm64" }, "dependencies": { + "@agentclientprotocol/sdk": "0.22.1", "@earendil-works/pi-agent-core": "0.80.2", "@earendil-works/pi-ai": "0.80.2", "@earendil-works/pi-coding-agent": "0.80.2", diff --git a/cli/src/acp/harness-agent.test.ts b/cli/src/acp/harness-agent.test.ts new file mode 100644 index 000000000..6637bfc2f --- /dev/null +++ b/cli/src/acp/harness-agent.test.ts @@ -0,0 +1,221 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Drives the built-in ACP agent through a real in-memory ACP connection pair — + * a {@link ClientSideConnection} talking to an {@link AgentSideConnection} over + * two linked byte streams — backed by a fake harness so the full + * initialize → newSession → prompt round-trip runs with no API key. Asserts the + * harness run events stream out as ACP `session/update`s, the tool-permission + * request round-trips to the client, and `session/cancel` yields `cancelled`. + */ + +import { describe, expect, test } from 'bun:test' +import { + AgentSideConnection, + ClientSideConnection, + PROTOCOL_VERSION, + ndJsonStream, +} from '@agentclientprotocol/sdk' +import type { + Client, + RequestPermissionRequest, + SessionNotification, + Stream, +} from '@agentclientprotocol/sdk' +import type { StopReason as PiStopReason, AssistantMessage } from '@earendil-works/pi-ai' +import type { AgentHarnessEvent, ToolCallEvent, ToolCallResult } from '@earendil-works/pi-agent-core' +import { createHarnessAgent } from './harness-agent.ts' +import type { BuildServeHarness } from './harness-agent.ts' +import type { ServeConfig } from '../agent/types.ts' + +const config: ServeConfig = { model: 'fake', cwd: process.cwd(), yolo: false, thinking: 'medium' } + +/** A minimal-but-valid Pi assistant message; the translator only reads the + * streamed deltas and the final `stopReason`, but the event types require a + * fully-shaped message, so this fills in the rest with zeros. */ +const assistantMessage = (stopReason: PiStopReason): AssistantMessage => ({ + role: 'assistant', + content: [], + api: 'anthropic-messages', + provider: 'anthropic', + model: 'fake', + usage: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + totalTokens: 0, + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, + }, + stopReason, + timestamp: 0, +}) + +/** Wire a client and the built-in agent together over an in-memory ndjson pipe + * pair, returning the client connection plus the buffers the client records. */ +const connectPair = ( + buildServeHarness: BuildServeHarness, +): { + client: ClientSideConnection + updates: SessionNotification[] + permissions: RequestPermissionRequest[] +} => { + const agentToClient = new TransformStream() + const clientToAgent = new TransformStream() + const agentStream: Stream = ndJsonStream(agentToClient.writable, clientToAgent.readable) + const clientStream: Stream = ndJsonStream(clientToAgent.writable, agentToClient.readable) + + new AgentSideConnection((conn) => createHarnessAgent(conn, config, buildServeHarness), agentStream) + + const updates: SessionNotification[] = [] + const permissions: RequestPermissionRequest[] = [] + const handler: Client = { + sessionUpdate: async (params) => { + updates.push(params) + }, + requestPermission: async (params) => { + permissions.push(params) + return { outcome: { outcome: 'selected', optionId: 'allow-once' } } + }, + } + const client = new ClientSideConnection(() => handler, clientStream) + return { client, updates, permissions } +} + +/** A fake harness whose prompt streams a text delta, asks to run `bash` (driving + * the permission round-trip), then reports the tool completing. */ +const streamingBuilder: BuildServeHarness = async () => { + let emit: (event: AgentHarnessEvent) => void = () => {} + let gate: ((event: ToolCallEvent) => Promise) | null = null + return { + harness: { + subscribe: (listener) => { + emit = listener + return () => { + emit = () => {} + } + }, + registerToolCallGate: (h) => { + gate = h + }, + prompt: async (text) => { + emit({ + type: 'message_update', + message: assistantMessage('stop'), + assistantMessageEvent: { type: 'text_delta', contentIndex: 0, delta: `you said: ${text}`, partial: assistantMessage('stop') }, + }) + const decision = await gate?.({ type: 'tool_call', toolCallId: 't1', toolName: 'bash', input: { command: 'echo hi' } }) + if (!decision?.block) { + emit({ type: 'tool_execution_start', toolCallId: 't1', toolName: 'bash', args: { command: 'echo hi' } }) + emit({ + type: 'tool_execution_end', + toolCallId: 't1', + toolName: 'bash', + result: { content: [{ type: 'text', text: 'hi' }], details: {} }, + isError: false, + }) + } + return assistantMessage('stop') + }, + waitForIdle: async () => {}, + abort: async () => {}, + }, + dispose: async () => {}, + } +} + +describe('createHarnessAgent (ACP server)', () => { + test('initialize advertises no loadSession and negotiates the protocol version', async () => { + const { client } = connectPair(streamingBuilder) + const init = await client.initialize({ protocolVersion: PROTOCOL_VERSION, clientCapabilities: {} }) + expect(init.protocolVersion).toBe(PROTOCOL_VERSION) + expect(init.agentCapabilities?.loadSession).toBe(false) + expect(init.agentInfo?.name).toBe('thunderbolt') + }) + + test('a prompt streams text + tool-call updates and round-trips a permission request', async () => { + const { client, updates, permissions } = connectPair(streamingBuilder) + await client.initialize({ protocolVersion: PROTOCOL_VERSION, clientCapabilities: {} }) + const { sessionId } = await client.newSession({ cwd: process.cwd(), mcpServers: [] }) + + const response = await client.prompt({ sessionId, prompt: [{ type: 'text', text: 'hello agent' }] }) + expect(response.stopReason).toBe('end_turn') + + // The gated `bash` tool asked the client for permission exactly once. + expect(permissions).toHaveLength(1) + expect(permissions[0].toolCall.toolCallId).toBe('t1') + expect(permissions[0].toolCall.kind).toBe('execute') + + const kinds = updates.map((u) => u.update.sessionUpdate) + expect(kinds).toContain('agent_message_chunk') + expect(kinds).toContain('tool_call') + expect(kinds).toContain('tool_call_update') + + const textChunk = updates.find((u) => u.update.sessionUpdate === 'agent_message_chunk') + expect(textChunk?.update).toMatchObject({ content: { type: 'text', text: 'you said: hello agent' } }) + + const toolCall = updates.find((u) => u.update.sessionUpdate === 'tool_call') + expect(toolCall?.update).toMatchObject({ toolCallId: 't1', kind: 'execute', status: 'in_progress' }) + + const toolDone = updates.find((u) => u.update.sessionUpdate === 'tool_call_update') + expect(toolDone?.update).toMatchObject({ toolCallId: 't1', status: 'completed' }) + }) + + test('a denied permission blocks the tool and the model never sees it run', async () => { + const agentToClient = new TransformStream() + const clientToAgent = new TransformStream() + new AgentSideConnection( + (conn) => createHarnessAgent(conn, config, streamingBuilder), + ndJsonStream(agentToClient.writable, clientToAgent.readable), + ) + const updates: SessionNotification[] = [] + const denyingClient: Client = { + sessionUpdate: async (params) => { + updates.push(params) + }, + requestPermission: async () => ({ outcome: { outcome: 'selected', optionId: 'reject-once' } }), + } + const client = new ClientSideConnection(() => denyingClient, ndJsonStream(clientToAgent.writable, agentToClient.readable)) + + await client.initialize({ protocolVersion: PROTOCOL_VERSION, clientCapabilities: {} }) + const { sessionId } = await client.newSession({ cwd: process.cwd(), mcpServers: [] }) + await client.prompt({ sessionId, prompt: [{ type: 'text', text: 'go' }] }) + + // Rejected: no tool_call / tool_call_update was streamed for the blocked bash. + const kinds = updates.map((u) => u.update.sessionUpdate) + expect(kinds).not.toContain('tool_call') + expect(kinds).not.toContain('tool_call_update') + }) + + test('session/cancel aborts the in-flight turn and resolves as cancelled', async () => { + let release: (() => void) | null = null + let abortedEarly = false + const cancellingBuilder: BuildServeHarness = async () => ({ + harness: { + subscribe: () => () => {}, + registerToolCallGate: () => {}, + prompt: async () => { + if (!abortedEarly) await new Promise((resolve) => (release = resolve)) + return assistantMessage('aborted') + }, + waitForIdle: async () => {}, + abort: async () => { + abortedEarly = true + release?.() + }, + }, + dispose: async () => {}, + }) + + const { client } = connectPair(cancellingBuilder) + await client.initialize({ protocolVersion: PROTOCOL_VERSION, clientCapabilities: {} }) + const { sessionId } = await client.newSession({ cwd: process.cwd(), mcpServers: [] }) + + const pending = client.prompt({ sessionId, prompt: [{ type: 'text', text: 'long task' }] }) + await client.cancel({ sessionId }) + const response = await pending + expect(response.stopReason).toBe('cancelled') + }) +}) diff --git a/cli/src/acp/harness-agent.ts b/cli/src/acp/harness-agent.ts new file mode 100644 index 000000000..d69b1e8fc --- /dev/null +++ b/cli/src/acp/harness-agent.ts @@ -0,0 +1,285 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * The built-in Pi coding agent, exposed as an ACP {@link Agent}. + * + * This is the server half of `thunderbolt acp serve`: it implements the ACP + * `Agent` interface on top of {@link buildHarness}, so the iroh/wss bridge can + * expose OUR coding agent to a remote ACP client (the bridge otherwise only + * proxies external stdio ACP agents). Each `session/new` builds its own harness + * bound to the requested cwd; harness run events stream back as ACP + * `session/update` notifications via {@link createHarnessToAcpTranslator}, and + * tool-permission requests round-trip to the client over `session/request_permission`. + * + * Sessions are in-memory and per-connection: `loadSession` is unsupported + * (advertised `loadSession: false`) because a fresh process per connection has + * no cross-reconnect persistence yet. + */ + +import { PROTOCOL_VERSION, RequestError } from '@agentclientprotocol/sdk' +import type { + Agent, + AgentSideConnection, + AuthenticateResponse, + CancelNotification, + ContentBlock, + InitializeRequest, + InitializeResponse, + NewSessionRequest, + NewSessionResponse, + PermissionOption, + PromptRequest, + PromptResponse, + RequestPermissionOutcome, + SessionId, +} from '@agentclientprotocol/sdk' +import type { AgentHarnessEvent, ToolCallEvent, ToolCallResult } from '@earendil-works/pi-agent-core' +import type { AssistantMessage } from '@earendil-works/pi-ai' +import { VERSION } from '../cli.ts' +import { buildHarness } from '../agent/harness.ts' +import type { HarnessConfig, ServeConfig } from '../agent/types.ts' +import { createHarnessToAcpTranslator, toAcpStopReason, toToolKind } from './harness-to-acp.ts' + +/** + * The slice of the Pi {@link AgentHarness} the ACP agent drives. A hand-written + * surface (rather than the full harness) keeps it tiny and lets a test supply a + * fake without reconstructing the harness's generic `on`/`subscribe` shapes — so + * the round-trip can be exercised with no API key. + */ +export type ServeHarness = { + /** Subscribe to run events; returns an unsubscribe function. */ + subscribe: (listener: (event: AgentHarnessEvent) => void) => () => void + /** Register the pre-execution permission gate for tool calls. */ + registerToolCallGate: (handler: (event: ToolCallEvent) => Promise) => void + /** Run one prompt turn, resolving with the final assistant message. */ + prompt: (text: string) => Promise + /** Resolve once the harness has settled after a prompt. */ + waitForIdle: () => Promise + /** Abort the in-flight turn (drives the ACP `cancelled` stop reason). */ + abort: () => Promise +} + +/** Builds a {@link ServeHarness} for one session, paired with its teardown. + * Injectable so tests can swap in a fake. */ +export type BuildServeHarness = ( + config: HarnessConfig, +) => Promise<{ harness: ServeHarness; dispose: () => Promise }> + +/** Production builder: adapts the real {@link buildHarness} to the narrow + * {@link ServeHarness} surface the agent needs. */ +const defaultBuildServeHarness: BuildServeHarness = async (config) => { + const { harness, dispose } = await buildHarness(config) + return { + harness: { + subscribe: (listener) => harness.subscribe(listener), + registerToolCallGate: (handler) => { + harness.on('tool_call', handler) + }, + prompt: (text) => harness.prompt(text), + waitForIdle: () => harness.waitForIdle(), + abort: async () => { + await harness.abort() + }, + }, + dispose, + } +} + +/** A live ACP session: its harness, the run-event subscription feeding the ACP + * client, and a teardown that releases the harness's execution environment. */ +type Session = { + readonly harness: ServeHarness + readonly unsubscribe: () => void + readonly dispose: () => Promise +} + +/** Tools that run unguarded — pure reads with no side effects. Mirrors the + * interactive CLI's gate (`agent/permissions.ts`). */ +const READ_ONLY_TOOLS = new Set(['read']) + +/** The permission choices offered to the ACP client for a gated tool call. + * `allow-always` allows that tool for the rest of the session; the others are + * one-shot. Mirrors the interactive gate's allow-once/allow-session/deny. */ +const PERMISSION_OPTIONS: PermissionOption[] = [ + { optionId: 'allow-once', name: 'Allow', kind: 'allow_once' }, + { optionId: 'allow-always', name: 'Always allow', kind: 'allow_always' }, + { optionId: 'reject-once', name: 'Reject', kind: 'reject_once' }, +] + +/** Flatten an ACP prompt's content blocks into the plain text the harness takes. + * Only text blocks are kept — image/audio/resource blocks are not advertised in + * `promptCapabilities`, so a spec-respecting client never sends them. */ +const promptText = (blocks: ContentBlock[]): string => + blocks + .filter((block): block is ContentBlock & { type: 'text'; text: string } => block.type === 'text') + .map((block) => block.text) + .join('\n') + +/** + * Map the client's permission decision to a Pi {@link ToolCallResult}. + * `undefined` lets the tool run; a blocking result stops it with a reason the + * model sees. `allow-always` additionally remembers the tool for the session. + * + * @param outcome - the client's `session/request_permission` outcome + * @param toolName - the tool being decided on + * @param sessionAllowed - the per-session set of tools allowed without re-asking + */ +const toToolCallResult = ( + outcome: RequestPermissionOutcome, + toolName: string, + sessionAllowed: Set, +): ToolCallResult | undefined => { + if (outcome.outcome === 'cancelled') return { block: true, reason: 'permission request cancelled' } + if (outcome.optionId === 'allow-always') { + sessionAllowed.add(toolName) + return undefined + } + if (outcome.optionId === 'allow-once') return undefined + return { block: true, reason: `user rejected ${toolName}` } +} + +/** + * Register the tool-permission gate on a session's harness. In `yolo` mode no + * hook is attached and every tool runs unguarded; otherwise read-only tools and + * session-allowed tools pass through, and any other tool round-trips to the ACP + * client via `session/request_permission` before it runs. + */ +const attachAcpPermissionGate = ( + harness: ServeHarness, + conn: AgentSideConnection, + sessionId: SessionId, + yolo: boolean, +): void => { + if (yolo) return + + const sessionAllowed = new Set() + + harness.registerToolCallGate(async ({ toolCallId, toolName, input }) => { + if (READ_ONLY_TOOLS.has(toolName) || sessionAllowed.has(toolName)) return undefined + + const { outcome } = await conn.requestPermission({ + sessionId, + options: PERMISSION_OPTIONS, + toolCall: { toolCallId, title: toolName, kind: toToolKind(toolName), rawInput: input, status: 'pending' }, + }) + return toToolCallResult(outcome, toolName, sessionAllowed) + }) +} + +/** + * Build the ACP {@link Agent} that fronts the built-in Pi harness for one + * connection. All sessions for the connection share `config` (model, thinking, + * yolo) and the connection's lifetime; each session gets its own harness bound + * to the cwd from `session/new`. Sessions are disposed when the connection closes. + * + * @param conn - the agent-side ACP connection (used to push updates + ask permission) + * @param config - the resolved serve configuration + * @param buildServeHarness - harness builder; injected by tests, defaults to the real one + */ +export const createHarnessAgent = ( + conn: AgentSideConnection, + config: ServeConfig, + buildServeHarness: BuildServeHarness = defaultBuildServeHarness, +): Agent => { + const sessions = new Map() + + // Release every session's execution environment when the connection ends, so + // a dropped client never leaks the harness's temp dirs / shell. Deferred a + // microtask because `AgentSideConnection` invokes this factory *before* it + // wires up `conn.closed`, which would otherwise throw when read here. Disposes + // independently (one failure can't strand the rest) and logs any failure. + queueMicrotask(() => { + void conn.closed + .then(async () => { + const open = [...sessions.values()] + sessions.clear() + const outcomes = await Promise.allSettled( + open.map(async (session) => { + session.unsubscribe() + await session.dispose() + }), + ) + for (const outcome of outcomes) { + if (outcome.status === 'rejected') { + process.stderr.write(`⚡ acp serve: session dispose failed: ${String(outcome.reason)}\n`) + } + } + }) + .catch((err) => { + process.stderr.write(`⚡ acp serve: connection cleanup error: ${err instanceof Error ? err.message : String(err)}\n`) + }) + }) + + const requireSession = (sessionId: SessionId): Session => { + const session = sessions.get(sessionId) + if (!session) throw RequestError.invalidParams(undefined, `unknown session '${sessionId}'`) + return session + } + + const initialize = async (_params: InitializeRequest): Promise => ({ + // We implement exactly one protocol version, so we always answer with it — + // the only version we could honestly negotiate. A client that can't speak it + // disconnects (per ACP initialization). + protocolVersion: PROTOCOL_VERSION, + agentInfo: { name: 'thunderbolt', version: VERSION }, + agentCapabilities: { + loadSession: false, + promptCapabilities: { image: false, audio: false, embeddedContext: false }, + }, + authMethods: [], + }) + + const newSession = async (params: NewSessionRequest): Promise => { + const sessionId = crypto.randomUUID() + const { harness, dispose } = await buildServeHarness({ + model: config.model, + cwd: params.cwd, + yolo: config.yolo, + thinking: config.thinking, + }) + + // If the client vanished while the harness was being built, the cleanup + // microtask already ran against a map without this session — dispose now so + // the freshly-built harness can't leak its temp dirs / shell. + if (conn.signal.aborted) { + await dispose() + throw RequestError.internalError(undefined, 'connection closed during session/new') + } + + const translator = createHarnessToAcpTranslator((update) => { + // Fire-and-forget: the SDK serializes writes on one queue, so updates + // emitted in order arrive in order. A rejection means the client went away + // mid-turn (the stream closed) — benign teardown, not an error to surface — + // so swallow it to avoid an unhandled rejection; the connection close is the + // real signal that ends the run. + void conn.sessionUpdate({ sessionId, update }).catch(() => {}) + }) + const unsubscribe = harness.subscribe((event) => translator.handle(event)) + attachAcpPermissionGate(harness, conn, sessionId, config.yolo) + + sessions.set(sessionId, { harness, unsubscribe, dispose }) + return { sessionId } + } + + const prompt = async (params: PromptRequest): Promise => { + const { harness } = requireSession(params.sessionId) + const result = await harness.prompt(promptText(params.prompt)) + await harness.waitForIdle() + // A failed turn resolves (it doesn't throw) with `stopReason: 'error'`, which + // has no ACP equivalent — surface it loudly as a JSON-RPC error instead. + if (result.stopReason === 'error') throw new Error(result.errorMessage ?? 'the model request failed') + return { stopReason: toAcpStopReason(result.stopReason) } + } + + const cancel = async (params: CancelNotification): Promise => { + await sessions.get(params.sessionId)?.harness.abort() + } + + // No authentication: the transport (loopback wss / allowlisted iroh) is the + // trust boundary, so `authenticate` is a no-op the client should never need. + const authenticate = async (): Promise => ({}) + + return { initialize, newSession, prompt, cancel, authenticate } +} diff --git a/cli/src/acp/harness-to-acp.ts b/cli/src/acp/harness-to-acp.ts new file mode 100644 index 000000000..5914df183 --- /dev/null +++ b/cli/src/acp/harness-to-acp.ts @@ -0,0 +1,135 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Translator: Pi {@link AgentHarness} run → ACP `session/update` notifications. + * + * The inverse of `src/acp/translators/acp-to-ai-sdk.ts` (which consumes ACP + * updates) and the ACP-shaped sibling of `shared/agent-core/pi-to-aisdk-stream.ts` + * (which emits AI SDK chunks for the in-browser app). Here a harness drives an + * ACP *client* over the wire, so each Pi event becomes a {@link SessionUpdate}. + * + * Event mapping (Pi `AgentHarnessEvent` → ACP `SessionUpdate`): + * message_update (text_delta) → agent_message_chunk (text) + * message_update (thinking_delta) → agent_thought_chunk (text) + * tool_execution_start → tool_call { status: in_progress } + * tool_execution_end → tool_call_update { completed | failed } + * + * Lifecycle events (agent_start, turn_start, turn_end, agent_end) have no ACP + * `sessionUpdate` equivalent — the ACP turn lifecycle is the `session/prompt` + * request/response itself — so they are dropped here; the prompt handler maps + * the final {@link StopReason} from the harness's resolved `AssistantMessage`. + */ + +import type { StopReason as PiStopReason } from '@earendil-works/pi-ai' +import type { AgentHarnessEvent } from '@earendil-works/pi-agent-core' +import type { SessionUpdate, StopReason, ToolCallContent, ToolKind } from '@agentclientprotocol/sdk' + +/** The coding tools the built-in harness exposes, mapped to the ACP {@link ToolKind} + * the client uses to pick an icon / UI treatment. Unknown tools fall back to + * `other` so an added tool degrades gracefully rather than mis-labelling. */ +const TOOL_KINDS: Record = { + bash: 'execute', + read: 'read', + write: 'edit', + edit: 'edit', +} + +/** Map a built-in tool name to its ACP {@link ToolKind}. */ +export const toToolKind = (toolName: string): ToolKind => TOOL_KINDS[toolName] ?? 'other' + +/** + * Map a Pi {@link PiStopReason} to the ACP {@link StopReason} returned from + * `session/prompt`. `error` has no ACP stop reason — the prompt handler surfaces + * it as a JSON-RPC error instead — so it falls through to `end_turn` here only as + * a defensive default that the handler never actually reaches. + */ +export const toAcpStopReason = (reason: PiStopReason): StopReason => { + switch (reason) { + case 'length': + return 'max_tokens' + case 'aborted': + return 'cancelled' + case 'stop': + case 'toolUse': + case 'error': + return 'end_turn' + } +} + +/** Narrows an unknown tool-result content block to one carrying text. */ +const isTextContent = (block: unknown): block is { text: string } => + typeof block === 'object' && block !== null && typeof (block as { text?: unknown }).text === 'string' + +/** + * Map a Pi `AgentToolResult` to ACP `ToolCallContent[]`, keeping the text blocks + * the client renders. Returns `undefined` when the result carries no text so the + * update relies on `rawOutput` alone rather than emitting an empty collection. + */ +const toToolCallContent = (result: unknown): ToolCallContent[] | undefined => { + if (typeof result !== 'object' || result === null) return undefined + const content = (result as { content?: unknown }).content + if (!Array.isArray(content)) return undefined + const blocks: ToolCallContent[] = content + .filter(isTextContent) + .map((block) => ({ type: 'content', content: { type: 'text', text: block.text } })) + return blocks.length > 0 ? blocks : undefined +} + +/** Sink for the {@link SessionUpdate}s a translator produces. The agent wraps + * this to call `connection.sessionUpdate({ sessionId, update })`. */ +export type AcpUpdateSink = (update: SessionUpdate) => void + +/** + * Builds a stateless translator that turns each harness event into zero or one + * ACP {@link SessionUpdate}, pushed into `emit`. Stateless because the ACP + * client tracks its own per-`toolCallId` lifecycle — unlike the AI SDK stream, + * which has to synthesize start/end part boundaries. + * + * @param emit - sink invoked once per produced session update + * @returns an object exposing `handle` to feed it harness events + */ +export const createHarnessToAcpTranslator = (emit: AcpUpdateSink): { handle: (event: AgentHarnessEvent) => void } => { + const handle = (event: AgentHarnessEvent): void => { + switch (event.type) { + case 'message_update': { + const inner = event.assistantMessageEvent + if (inner.type === 'text_delta') { + emit({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: inner.delta } }) + } else if (inner.type === 'thinking_delta') { + emit({ sessionUpdate: 'agent_thought_chunk', content: { type: 'text', text: inner.delta } }) + } + return + } + case 'tool_execution_start': { + emit({ + sessionUpdate: 'tool_call', + toolCallId: event.toolCallId, + title: event.toolName, + kind: toToolKind(event.toolName), + status: 'in_progress', + rawInput: event.args ?? {}, + }) + return + } + case 'tool_execution_end': { + emit({ + sessionUpdate: 'tool_call_update', + toolCallId: event.toolCallId, + status: event.isError ? 'failed' : 'completed', + rawOutput: event.result as unknown, + content: toToolCallContent(event.result), + }) + return + } + // Lifecycle events (agent_start, turn_start/turn_end, message_*, agent_end) + // and every other harness hook have no ACP `sessionUpdate`; the turn + // lifecycle is the `session/prompt` request/response itself. + default: + return + } + } + + return { handle } +} diff --git a/cli/src/acp/serve.ts b/cli/src/acp/serve.ts new file mode 100644 index 000000000..492da4e0a --- /dev/null +++ b/cli/src/acp/serve.ts @@ -0,0 +1,45 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * `thunderbolt acp serve` — run the built-in coding agent as a stdio ACP + * JSON-RPC server. + * + * stdin/stdout ARE the JSON-RPC channel (newline-delimited JSON), so this path + * never attaches the terminal renderer and routes every log line to stderr. The + * intended deployment is behind the iroh/wss bridge, which spawns one + * `acp serve` process per connection and pumps its stdio over the network: + * + * thunderbolt acp --transport iroh -- thunderbolt acp serve + * + * The process lives for exactly one connection; it exits when the stream closes. + */ + +import { AgentSideConnection, ndJsonStream } from '@agentclientprotocol/sdk' +import type { ServeConfig } from '../agent/types.ts' +import { createHarnessAgent } from './harness-agent.ts' + +/** Adapt this process's stdout to the `WritableStream` the ACP + * `ndJsonStream` writes encoded messages into, honoring write backpressure via + * the write callback so a slow reader throttles us rather than buffering + * unboundedly. */ +const stdoutWritable = (): WritableStream => + new WritableStream({ + write: (chunk) => + new Promise((resolve, reject) => { + process.stdout.write(chunk, (err) => (err ? reject(err) : resolve())) + }), + }) + +/** + * Serve the built-in harness as an ACP agent over stdio until the client + * disconnects (the stream closes). Returns when the connection is fully closed. + * + * @param config - the resolved serve configuration (model, thinking, yolo) + */ +export const runAcpServe = async (config: ServeConfig): Promise => { + const stream = ndJsonStream(stdoutWritable(), Bun.stdin.stream()) + const connection = new AgentSideConnection((conn) => createHarnessAgent(conn, config), stream) + await connection.closed +} diff --git a/cli/src/agent/harness.ts b/cli/src/agent/harness.ts index 97456713b..8c54c540e 100644 --- a/cli/src/agent/harness.ts +++ b/cli/src/agent/harness.ts @@ -14,17 +14,17 @@ import { NodeExecutionEnv } from '@earendil-works/pi-agent-core/node' import { createBashTool, createEditTool, createReadTool, createWriteTool } from '@earendil-works/pi-coding-agent' import { resolveModel } from './model.ts' import { buildSystemPrompt } from './system-prompt.ts' -import type { HarnessBundle, RunConfig } from './types.ts' +import type { HarnessBundle, HarnessConfig } from './types.ts' /** * Builds a ready-to-run harness for a single CLI invocation, paired with a * `dispose` that releases the execution environment. Renderer and permission * hooks are attached by the caller, not here. * - * @param config - the resolved run configuration + * @param config - the resolved harness configuration * @returns the constructed harness and its teardown function */ -export const buildHarness = async (config: RunConfig): Promise => { +export const buildHarness = async (config: HarnessConfig): Promise => { const env = new NodeExecutionEnv({ cwd: config.cwd }) const session = await new InMemorySessionRepo().create({}) const { models, model } = resolveModel(config.model) diff --git a/cli/src/agent/types.ts b/cli/src/agent/types.ts index 139bf412e..2ec35a8a5 100644 --- a/cli/src/agent/types.ts +++ b/cli/src/agent/types.ts @@ -70,8 +70,12 @@ export type IrohAdminAction = | { readonly kind: 'pair' } | { readonly kind: 'allow'; readonly nodeId: string } -/** Settings common to every run, independent of oneshot vs REPL mode. */ -type RunConfigBase = { +/** + * Settings a single harness needs to be assembled, shared by every entry point + * (oneshot run, REPL, and the ACP server's per-session harness). `buildHarness` + * consumes exactly this; the run/serve configs extend it with their own fields. + */ +export type HarnessConfig = { /** Anthropic model id (defaults to `claude-opus-4-8`). */ readonly model: string /** Working directory the agent's bash/fs tools are bound to. */ @@ -82,21 +86,29 @@ type RunConfigBase = { readonly thinking: ThinkingLevel } +/** + * Configuration for an `acp serve` invocation: run THIS coding agent as a stdio + * ACP JSON-RPC server. `cwd` is the process default; each ACP `session/new` + * supplies its own working directory, which overrides it per session. + */ +export type ServeConfig = HarnessConfig + /** * Fully-resolved configuration for a single CLI invocation, produced by * {@link parseArgs} and consumed by the agent runner. The discriminated `mode` * makes `prompt` present exactly when (and only when) it's a oneshot run. */ export type RunConfig = - | (RunConfigBase & { readonly mode: 'oneshot'; readonly prompt: string }) - | (RunConfigBase & { readonly mode: 'repl' }) + | (HarnessConfig & { readonly mode: 'oneshot'; readonly prompt: string }) + | (HarnessConfig & { readonly mode: 'repl' }) -/** Result of parsing argv: a run, a bridge, a connect, an iroh admin action, - * or a terminal info action. */ +/** Result of parsing argv: a run, a bridge, a connect, an ACP server, an iroh + * admin action, or a terminal info action. */ export type ParsedArgs = | { readonly kind: 'run'; readonly config: RunConfig } | { readonly kind: 'bridge'; readonly config: BridgeConfig } | { readonly kind: 'connect'; readonly config: ConnectConfig } + | { readonly kind: 'acp-serve'; readonly config: ServeConfig } | { readonly kind: 'iroh-admin'; readonly action: IrohAdminAction } | { readonly kind: 'help' } | { readonly kind: 'version' } diff --git a/cli/src/cli.ts b/cli/src/cli.ts index f882a0288..584a3593e 100644 --- a/cli/src/cli.ts +++ b/cli/src/cli.ts @@ -14,6 +14,7 @@ import type { BridgeTransport, ParsedArgs, RunConfig, + ServeConfig, ThinkingLevel, } from './agent/types.ts' @@ -42,6 +43,7 @@ export const HELP_TEXT = `⚡ thunderbolt v${VERSION} — a single-binary termin USAGE thunderbolt [options] [prompt] thunderbolt agent [options] [prompt] + thunderbolt acp serve [options] thunderbolt acp --transport [--port N] -- thunderbolt mcp --transport [--port N] -- thunderbolt acp connect [-- ] @@ -51,10 +53,11 @@ USAGE interactive REPL. Built on the Pi harness; talks to Claude. SUBCOMMANDS - agent run the coding agent (default when omitted) - acp bridge a local stdio ACP agent over the network the app can reach - mcp bridge a local stdio MCP server over the network the app can reach - iroh manage the P2P identity / pairing ticket / peer allowlist + agent run the coding agent (default when omitted) + acp serve expose THIS coding agent as a stdio ACP server (for bridging) + acp bridge a local stdio ACP agent over the network the app can reach + mcp bridge a local stdio MCP server over the network the app can reach + iroh manage the P2P identity / pairing ticket / peer allowlist TOOLS bash run shell commands @@ -89,6 +92,7 @@ EXAMPLES thunderbolt thunderbolt acp --transport wss -- npx @zed-industries/claude-code-acp thunderbolt mcp --transport wss --port 9001 -- uvx mcp-server-fetch + thunderbolt acp --transport iroh -- thunderbolt acp serve # share THIS agent thunderbolt acp --transport iroh -- npx @zed-industries/claude-code-acp thunderbolt iroh id thunderbolt acp connect endpoint1abc… # dial a remote iroh bridge @@ -248,6 +252,30 @@ const parseConnectArgs = (protocol: BridgeProtocol, rest: string[]): ParsedArgs return { kind: 'connect', config: { protocol, target, command } } } +/** + * Parses an `acp serve` invocation: run the built-in agent as a stdio ACP + * server. Reuses the run-flag scanner (`--model`/`--thinking`/`--yolo`); the + * per-session working directory comes from each ACP `session/new`, so `cwd` + * here is just the process default. No positional prompt is accepted. + */ +const parseServeArgs = (rest: string[]): ParsedArgs => { + if (rest.includes('--help') || rest.includes('-h')) return { kind: 'help' } + + const scan = scanTokens(rest, 0, DEFAULT_FLAGS) + if (!scan.ok) return { kind: 'error', message: scan.message } + if (scan.flags.positionals.length > 0) { + return { kind: 'error', message: `thunderbolt acp serve: unexpected argument '${scan.flags.positionals[0]}'` } + } + + const config: ServeConfig = { + model: scan.flags.model, + cwd: process.cwd(), + yolo: scan.flags.yolo, + thinking: scan.flags.thinking, + } + return { kind: 'acp-serve', config } +} + /** * Parses a `thunderbolt iroh` admin invocation into its sub-action * (`id` | `pair` | `allow `). @@ -280,6 +308,7 @@ export const parseArgs = (argv: string[]): ParsedArgs => { const subcommand = argv[0] if (subcommand === 'iroh') return parseIrohAdminArgs(argv.slice(1)) if (subcommand === 'acp' || subcommand === 'mcp') { + if (subcommand === 'acp' && argv[1] === 'serve') return parseServeArgs(argv.slice(2)) if (argv[1] === 'connect') return parseConnectArgs(subcommand, argv.slice(2)) return parseBridgeArgs(subcommand, argv.slice(1)) } diff --git a/cli/src/index.ts b/cli/src/index.ts index 70a1dd27b..23c04432e 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -11,6 +11,7 @@ import { HELP_TEXT, VERSION, parseArgs } from './cli.ts' import { runAgent } from './agent/run.ts' +import { runAcpServe } from './acp/serve.ts' import { runBridge } from './commands/bridge.ts' import { runIrohBridge } from './iroh/bridge.ts' import { runIrohConnect } from './iroh/connect.ts' @@ -54,6 +55,14 @@ switch (parsed.kind) { process.exitCode = 1 } break + case 'acp-serve': + try { + await runAcpServe(parsed.config) + } catch (err) { + process.stderr.write(`thunderbolt: ${err instanceof Error ? err.message : String(err)}\n`) + process.exitCode = 1 + } + break case 'iroh-admin': try { await runIrohAdmin(parsed.action) From 181633b155b286cdea9e4573df164bb57659afb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Menezes?= Date: Mon, 29 Jun 2026 08:43:04 -0300 Subject: [PATCH 06/86] fix: bound iroh bridge handshakes and apply stdin backpressure --- cli/src/iroh/bridge.ts | 153 ++++++++++++++++++++++++++++++++++++---- cli/src/iroh/connect.ts | 24 +++++-- cli/src/iroh/pump.ts | 38 +++++++++- 3 files changed, 196 insertions(+), 19 deletions(-) diff --git a/cli/src/iroh/bridge.ts b/cli/src/iroh/bridge.ts index 85fce2900..986c14166 100644 --- a/cli/src/iroh/bridge.ts +++ b/cli/src/iroh/bridge.ts @@ -15,12 +15,12 @@ * and an exiting agent ends the session by finishing its stream. */ -import type { Incoming } from '@number0/iroh' +import type { Connection, Incoming } from '@number0/iroh' import type { BridgeConfig } from '../agent/types.ts' import { spawnAgent, type BridgeProc } from '../commands/bridge.ts' import { isAllowed } from './allowlist.ts' import { bindServer } from './endpoint.ts' -import { forwardFromRecv, forwardToSend } from './pump.ts' +import { forwardFromRecv, forwardToSend, writeToStdin } from './pump.ts' /** QUIC application close code for a connection we actively reject (allowlist * miss or spawn failure). Normal end-of-session is signalled by finishing the @@ -30,17 +30,111 @@ const CLOSE_REFUSED = 1n /** Encode a human-readable connection-close reason as the byte array iroh wants. */ const reasonBytes = (reason: string): number[] => Array.from(Buffer.from(reason, 'utf8')) +/** Per-remote handshake budget: how many connections one peer may open within + * {@link RATE_WINDOW_MS} before we drop the excess *before* the TLS handshake. + * Generous enough that no legitimate client reconnecting hits it. */ +const RATE_MAX = 10 +/** Sliding window for {@link RATE_MAX}. */ +const RATE_WINDOW_MS = 10_000 +/** Hard ceiling on distinct rate-limit keys. The map evicts least-recently-seen + * keys past this, so a flood of fresh (rotating) identities can't grow it. */ +const RATE_MAX_KEYS = 4096 +/** Max TLS handshakes allowed to run at once. This is the real CPU backstop: the + * per-remote budget is defeated by an attacker who mints a fresh EndpointId per + * connection, but a global cap bounds concurrent handshake cost regardless of + * identity. Generous enough that legitimate concurrent clients never hit it. */ +const MAX_CONCURRENT_HANDSHAKES = 16 + +/** + * A lightweight per-key sliding-window rate limiter. `allow(key)` records the + * call and returns whether the key is still within budget. A key's own stale + * timestamps are pruned on each check; the backing map is hard-capped at + * {@link RATE_MAX_KEYS} via least-recently-seen (insertion-order) eviction, so it + * stays bounded even under a flood of fresh keys that never go stale in-window. + * + * @param max - calls allowed per window + * @param windowMs - the window length in milliseconds + */ +const createRateLimiter = (max: number, windowMs: number): { allow: (key: string) => boolean } => { + const hits = new Map() + + const allow = (key: string): boolean => { + const now = Date.now() + // Map iterates in insertion order, so the first key is the oldest-touched. + while (hits.size > RATE_MAX_KEYS) { + const oldest = hits.keys().next().value + if (oldest === undefined) break + hits.delete(oldest) + } + const recent = (hits.get(key) ?? []).filter((at) => now - at < windowMs) + if (recent.length >= max) { + hits.set(key, recent) + return false + } + recent.push(now) + // Re-insert so an active key refreshes to newest, making eviction least-recent. + hits.delete(key) + hits.set(key, recent) + return true + } + return { allow } +} + +/** + * A non-blocking counting semaphore. `tryAcquire` takes a slot if one is free + * (returning whether it did); `release` returns one. Used to cap concurrent TLS + * handshakes so handshake spam can't burn unbounded CPU before the allowlist gate. + * + * @param max - the number of slots + */ +const createHandshakeGuard = (max: number): { tryAcquire: () => boolean; release: () => void } => { + let inFlight = 0 + return { + tryAcquire: () => { + if (inFlight >= max) return false + inFlight += 1 + return true + }, + release: () => { + if (inFlight > 0) inFlight -= 1 + }, + } +} + +/** Derive a pre-handshake rate-limit key for an incoming connection. Relay-routed + * peers (our P2P model) expose their EndpointId before the handshake; direct IP + * peers expose `ip:port`. Falls back to the transport kind so a key always exists. */ +const remoteKey = async (incoming: Incoming): Promise => { + const addr = await incoming.remoteAddr() + return addr.endpointId ?? addr.addr ?? addr.kind +} + +/** + * Complete the QUIC/TLS handshake for an incoming connection, releasing the + * handshake guard slot the instant the handshake settles (success or failure) so + * the slot covers only the CPU-bound handshake window, never the whole session. + */ +const handshake = async (incoming: Incoming, guard: { release: () => void }): Promise => { + try { + return await (await incoming.accept()).connect() + } finally { + guard.release() + } +} + /** - * Handle a single incoming connection: complete the handshake to learn the - * authenticated remote NodeId, enforce the allowlist, wait for the client to - * open the data stream, and only then bridge a freshly-spawned agent over it. + * Handle a single incoming connection (its handshake guard slot already taken): + * complete the handshake to learn the authenticated remote NodeId, enforce the + * allowlist, wait for the client to open the data stream, and only then bridge a + * freshly-spawned agent over it. */ const handleConnection = async ( incoming: Incoming, config: BridgeConfig, activeProcs: Set, + guard: { release: () => void }, ): Promise => { - const connection = await (await incoming.accept()).connect() + const connection = await handshake(incoming, guard) const remoteId = connection.remoteId().toString() if (!(await isAllowed(remoteId))) { @@ -69,11 +163,11 @@ const handleConnection = async ( process.stdout.write(`⚡ iroh bridge: accepted ${remoteId} → spawned ${config.command.join(' ')}\n`) // `.finally` (not `.then`) so the agent always gets stdin EOF, even if the - // recv pump errors as the connection tears down. - const toAgent = forwardFromRecv(bi.recv, (chunk) => { - proc.stdin.write(chunk) - proc.stdin.flush() - }).finally(() => proc.stdin.end()) + // recv pump errors as the connection tears down. `writeToStdin` awaits the + // flush (backpressure) and logs an EPIPE loudly rather than swallowing it. + const toAgent = forwardFromRecv(bi.recv, (chunk) => writeToStdin(proc.stdin, chunk, 'bridge')).finally(() => + proc.stdin.end(), + ) const fromAgent = forwardToSend(proc.stdout, bi.send) // A pump rejecting here is the expected end-of-session (the stream errors as // the connection closes); the lifecycle hooks above have already cleaned up. @@ -89,6 +183,13 @@ const handleConnection = async ( export const runIrohBridge = async (config: BridgeConfig): Promise => { const { endpoint, nodeId, ticket } = await bindServer(config.protocol) const activeProcs = new Set() + // The QUIC handshake authenticates the peer's NodeId, but it runs *before* the + // allowlist check below — so a peer that learns this NodeId could force endless + // TLS handshakes. Two layers drop the excess pre-handshake: a per-remote budget + // (fairness against a fixed peer) and a global concurrent-handshake cap (the CPU + // backstop that holds even against an attacker rotating EndpointIds). + const handshakeBudget = createRateLimiter(RATE_MAX, RATE_WINDOW_MS) + const handshakeGuard = createHandshakeGuard(MAX_CONCURRENT_HANDSHAKES) process.stdout.write( `⚡ thunderbolt ${config.protocol} bridge (iroh) ready\n` + @@ -109,8 +210,36 @@ export const runIrohBridge = async (config: BridgeConfig): Promise => { while (true) { const incoming = await endpoint.acceptNext() if (!incoming) break - void handleConnection(incoming, config, activeProcs).catch((err) => { + void admitConnection(incoming, config, activeProcs, handshakeBudget, handshakeGuard).catch((err) => { process.stderr.write(`⚡ iroh bridge: connection error: ${err instanceof Error ? err.message : String(err)}\n`) }) } } + +/** + * Gate one incoming connection before paying for its TLS handshake: first the + * per-remote budget, then a free global handshake slot. A rejected connection is + * `ignore()`d (dropped with no response — the cheapest rejection) so spam can't + * burn CPU; an admitted one proceeds to {@link handleConnection}, which owns the + * acquired slot and releases it once the handshake settles. + */ +const admitConnection = async ( + incoming: Incoming, + config: BridgeConfig, + activeProcs: Set, + handshakeBudget: { allow: (key: string) => boolean }, + handshakeGuard: { tryAcquire: () => boolean; release: () => void }, +): Promise => { + const key = await remoteKey(incoming) + if (!handshakeBudget.allow(key)) { + process.stderr.write(`⚡ iroh bridge: rate-limited ${key} (too many handshakes)\n`) + await incoming.ignore() + return + } + if (!handshakeGuard.tryAcquire()) { + process.stderr.write(`⚡ iroh bridge: at handshake capacity, dropped ${key}\n`) + await incoming.ignore() + return + } + await handleConnection(incoming, config, activeProcs, handshakeGuard) +} diff --git a/cli/src/iroh/connect.ts b/cli/src/iroh/connect.ts index d7ec97ca9..475df2324 100644 --- a/cli/src/iroh/connect.ts +++ b/cli/src/iroh/connect.ts @@ -19,7 +19,24 @@ import type { Connection } from '@number0/iroh' import type { ConnectConfig } from '../agent/types.ts' import { spawnAgent } from '../commands/bridge.ts' import { dial } from './endpoint.ts' -import { forwardFromRecv, forwardToSend } from './pump.ts' +import { forwardFromRecv, forwardToSend, writeToStdin } from './pump.ts' + +/** Write received bytes to this process's stdout, awaiting a `drain` when the + * kernel buffer is full so the iroh read loop respects stdout backpressure. An + * `EPIPE` (the downstream of a pipe like `| head` closed early) is logged + * loudly and rethrown so the pump stops rather than swallowing the failure. */ +const writeToStdout = (chunk: Uint8Array): Promise => + new Promise((resolve, reject) => { + const onError = (err: Error): void => { + process.stderr.write(`⚡ iroh connect: stdout write failed: ${err.message}\n`) + reject(err) + } + if (process.stdout.write(chunk, (err) => err && onError(err))) { + resolve() + } else { + process.stdout.once('drain', resolve) + } + }) /** Wait until the pumps settle *or* the connection closes — whichever first — * so a peer that refuses us mid-pump is observed (and its close reason is @@ -40,8 +57,7 @@ const bridgeLocalCommand = async (connection: Connection, command: readonly stri // `.finally` so the local client always gets stdin EOF, even on a torn stream. const fromRemote = forwardFromRecv(bi.recv, (chunk) => { received += chunk.length - proc.stdin.write(chunk) - proc.stdin.flush() + return writeToStdin(proc.stdin, chunk, 'connect') }).finally(() => proc.stdin.end()) await settleOrClose(connection, [toRemote, fromRemote]) return received @@ -55,7 +71,7 @@ const bridgeProcessStdio = async (connection: Connection): Promise => { const toRemote = forwardToSend(Bun.stdin.stream(), bi.send) const fromRemote = forwardFromRecv(bi.recv, (chunk) => { received += chunk.length - process.stdout.write(chunk) + return writeToStdout(chunk) }) await settleOrClose(connection, [toRemote, fromRemote]) return received diff --git a/cli/src/iroh/pump.ts b/cli/src/iroh/pump.ts index 21c50a17a..fe034c9dd 100644 --- a/cli/src/iroh/pump.ts +++ b/cli/src/iroh/pump.ts @@ -12,11 +12,35 @@ * through untouched here, keeping both halves symmetric and framing-agnostic. */ +import type { FileSink } from 'bun' import type { RecvStream, SendStream } from '@number0/iroh' /** Max bytes pulled per `recv.read`; a comfortably large ceiling for JSON-RPC. */ const READ_CHUNK_LIMIT = 1 << 16 +/** + * Write a chunk into a subprocess's stdin {@link FileSink} and await its flush, + * so the iroh read loop driving this sink respects the subprocess's stdin + * backpressure instead of buffering received bytes without bound. + * + * A write/flush failure — most commonly `EPIPE` once the agent has exited and + * closed its stdin — is logged loudly (per the loud-failure rule) and rethrown + * so the pump stops rather than spinning on a dead pipe. + * + * @param sink - the subprocess stdin to write into + * @param chunk - the bytes to write + * @param label - short context for the error log (e.g. `bridge`, `connect`) + */ +export const writeToStdin = async (sink: FileSink, chunk: Uint8Array, label: string): Promise => { + try { + sink.write(chunk) + await sink.flush() + } catch (err) { + process.stderr.write(`⚡ iroh ${label}: stdin write failed: ${err instanceof Error ? err.message : String(err)}\n`) + throw err + } +} + /** * Copy a readable byte source (e.g. a subprocess `stdout` or `Bun.stdin`) into * an iroh send stream, finishing the stream when the source ends. @@ -45,13 +69,21 @@ export const forwardToSend = async (source: ReadableStream, send: Se * process's `stdout`), returning when the remote finishes the stream (a zero- * length read signals EOF). * + * The sink is awaited so a slow consumer throttles the read loop instead of the + * received bytes piling up unbounded: a sink that returns its write's + * backpressure promise (a `FileSink.flush()` or a stdout `drain`) gates the next + * `recv.read` until the previous chunk has actually drained. + * * @param recv - the iroh recv half to drain - * @param sink - called with each received chunk + * @param sink - called with each received chunk; await it to apply backpressure */ -export const forwardFromRecv = async (recv: RecvStream, sink: (chunk: Uint8Array) => void): Promise => { +export const forwardFromRecv = async ( + recv: RecvStream, + sink: (chunk: Uint8Array) => void | Promise, +): Promise => { while (true) { const chunk = await recv.read(READ_CHUNK_LIMIT) if (chunk.length === 0) break - sink(Uint8Array.from(chunk)) + await sink(Uint8Array.from(chunk)) } } From f690e3596c17e824385778adab6eec9cf5135257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Menezes?= Date: Mon, 29 Jun 2026 08:43:08 -0300 Subject: [PATCH 07/86] feat: dial a laptop iroh bridge from the web app via a wasm client --- .prettierignore | 5 +- .../thunderbolt-acp-client/.cargo/config.toml | 5 + crates/thunderbolt-acp-client/Cargo.lock | 4139 +++++++++++++++++ crates/thunderbolt-acp-client/Cargo.toml | 49 + crates/thunderbolt-acp-client/build.sh | 66 + crates/thunderbolt-acp-client/src/lib.rs | 248 + eslint.config.js | 3 + scripts/license-headers.ts | 3 + src/acp/acp-adapter.ts | 2 +- src/acp/iroh/iroh-transport.test.ts | 215 + src/acp/iroh/iroh-transport.ts | 208 + src/acp/iroh/ndjson.test.ts | 55 + src/acp/iroh/ndjson.ts | 43 + src/acp/iroh/pkg/package.json | 17 + src/acp/iroh/pkg/thunderbolt_acp_client.d.ts | 174 + src/acp/iroh/pkg/thunderbolt_acp_client.js | 1320 ++++++ .../iroh/pkg/thunderbolt_acp_client_bg.wasm | Bin 0 -> 2585876 bytes .../pkg/thunderbolt_acp_client_bg.wasm.d.ts | 43 + src/acp/iroh/types.ts | 35 + src/acp/transports/index.ts | 8 +- src/acp/types.ts | 6 +- src/types/acp.ts | 4 +- 22 files changed, 6641 insertions(+), 7 deletions(-) create mode 100644 crates/thunderbolt-acp-client/.cargo/config.toml create mode 100644 crates/thunderbolt-acp-client/Cargo.lock create mode 100644 crates/thunderbolt-acp-client/Cargo.toml create mode 100755 crates/thunderbolt-acp-client/build.sh create mode 100644 crates/thunderbolt-acp-client/src/lib.rs create mode 100644 src/acp/iroh/iroh-transport.test.ts create mode 100644 src/acp/iroh/iroh-transport.ts create mode 100644 src/acp/iroh/ndjson.test.ts create mode 100644 src/acp/iroh/ndjson.ts create mode 100644 src/acp/iroh/pkg/package.json create mode 100644 src/acp/iroh/pkg/thunderbolt_acp_client.d.ts create mode 100644 src/acp/iroh/pkg/thunderbolt_acp_client.js create mode 100644 src/acp/iroh/pkg/thunderbolt_acp_client_bg.wasm create mode 100644 src/acp/iroh/pkg/thunderbolt_acp_client_bg.wasm.d.ts create mode 100644 src/acp/iroh/types.ts diff --git a/.prettierignore b/.prettierignore index 849730770..d05623392 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,4 +9,7 @@ thunderbird-mcp-bridge thunderbird-mcp-native package-lock.json bun.lock -*.lock \ No newline at end of file +*.lock +# Generated wasm-bindgen glue for the iroh ACP client (build artifact). +src/acp/iroh/pkg +crates/*/target \ No newline at end of file diff --git a/crates/thunderbolt-acp-client/.cargo/config.toml b/crates/thunderbolt-acp-client/.cargo/config.toml new file mode 100644 index 000000000..22b2fe199 --- /dev/null +++ b/crates/thunderbolt-acp-client/.cargo/config.toml @@ -0,0 +1,5 @@ +# getrandom 0.3 needs an explicit backend cfg for wasm32 — without it the wasm +# build fails to link a randomness source. Pairs with the `wasm_js` feature in +# Cargo.toml so iroh's key generation / TLS use the browser's crypto.getRandomValues. +[target.wasm32-unknown-unknown] +rustflags = ['--cfg', 'getrandom_backend="wasm_js"'] diff --git a/crates/thunderbolt-acp-client/Cargo.lock b/crates/thunderbolt-acp-client/Cargo.lock new file mode 100644 index 000000000..49fd10b61 --- /dev/null +++ b/crates/thunderbolt-acp-client/Cargo.lock @@ -0,0 +1,4139 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.7", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" + +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + +[[package]] +name = "base16ct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "blake3" +version = "1.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", +] + +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" + +[[package]] +name = "cc" +version = "1.2.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", +] + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + +[[package]] +name = "curve25519-dalek" +version = "5.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f359e08ca85e7bd759e1fd933ff2bccd81864c60a8fba0e259c7f822b0924bf" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rand_core", + "rustc_version", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "data-encoding-macro" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3259c913752a86488b501ed8680446a5ed2d5aeac6e596cb23ba3800768ea32c" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090" +dependencies = [ + "data-encoding", + "syn", +] + +[[package]] +name = "der" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", + "unicode-xid", +] + +[[package]] +name = "diatomic-waker" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer", + "crypto-common 0.2.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "ed25519" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a" +dependencies = [ + "pkcs8", + "serdect", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "3.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b011170fe4f04665565b4110afef66774fe9ffff278f3eb5b81cc73d26e27d60" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core", + "serde", + "sha2", + "signature", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "enum-assoc" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed8956bd5c1f0415200516e78ff07ec9e16415ade83c056c230d7b7ea0d55b7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fiat-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-buffered" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5" +dependencies = [ + "cordyceps", + "diatomic-waker", + "futures-core", + "pin-project-lite", + "spin 0.10.0", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generator" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link", + "windows-result", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin 0.9.8", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hickory-net" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2295ed2f9c31e471e1428a8f88a3f0e1f4b27c15049592138d1eebe9c35b183" +dependencies = [ + "async-trait", + "bytes", + "cfg-if", + "data-encoding", + "futures-channel", + "futures-io", + "futures-util", + "h2", + "hickory-proto", + "http", + "idna", + "ipnet", + "jni 0.22.4", + "rand", + "rustls", + "thiserror 2.0.18", + "tinyvec", + "tokio", + "tokio-rustls", + "tracing", + "url", +] + +[[package]] +name = "hickory-proto" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bab31817bfb44672a252e97fe81cd0c18d1b2cf892108922f6818820df8c643" +dependencies = [ + "data-encoding", + "idna", + "ipnet", + "jni 0.22.4", + "once_cell", + "prefix-trie", + "rand", + "ring", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d58d28879ceecde6607729660c2667a081ccdc082e082675042793960f178c" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-net", + "hickory-proto", + "ipconfig", + "ipnet", + "jni 0.22.4", + "moka", + "ndk-context", + "once_cell", + "parking_lot", + "rand", + "resolv-conf", + "rustls", + "smallvec", + "system-configuration", + "thiserror 2.0.18", + "tokio", + "tokio-rustls", + "tracing", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hybrid-array" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "identity-hash" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfdd7caa900436d8f13b2346fe10257e0c05c1f1f9e351f4f5d57c03bd5f45da" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ipconfig" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" +dependencies = [ + "socket2", + "widestring", + "windows-registry", + "windows-result", + "windows-sys 0.61.2", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +dependencies = [ + "serde", +] + +[[package]] +name = "iroh" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6435544bb3a5c4e6ff7affaa0c0aa0d1bca45bd700226329d5059d3eb54f9dff" +dependencies = [ + "backon", + "blake3", + "bytes", + "cfg_aliases", + "ctutils", + "data-encoding", + "derive_more", + "ed25519-dalek", + "futures-util", + "getrandom 0.4.3", + "hickory-resolver", + "http", + "ipnet", + "iroh-base", + "iroh-dns", + "iroh-metrics", + "iroh-relay", + "n0-error", + "n0-future", + "n0-watcher", + "netwatch", + "noq", + "noq-proto", + "noq-udp", + "papaya", + "pin-project", + "portable-atomic", + "rand", + "reqwest", + "rustc-hash", + "rustls", + "rustls-pki-types", + "serde", + "smallvec", + "strum", + "time", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "wasm-bindgen-futures", +] + +[[package]] +name = "iroh-base" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9c95e4459d9bb828a77084277abd308aa2b58a096652b079bddfd6ef2361f53" +dependencies = [ + "curve25519-dalek", + "data-encoding", + "data-encoding-macro", + "derive_more", + "ed25519-dalek", + "getrandom 0.4.3", + "n0-error", + "rand", + "serde", + "url", + "zeroize", +] + +[[package]] +name = "iroh-dns" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754f7e0c1f67938e1d671007264ffef158f14a9f795a7cc219ea68ea09a9d4c9" +dependencies = [ + "arc-swap", + "cfg_aliases", + "derive_more", + "hickory-resolver", + "iroh-base", + "n0-error", + "n0-future", + "ndk-context", + "portable-atomic", + "rand", + "rustls", + "simple-dns", + "strum", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "iroh-metrics" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291065721ad7c477b972e581bbc528df031dc8eb5e39fe1ff3300ae5dfb157ef" +dependencies = [ + "iroh-metrics-derive", + "itoa", + "n0-error", + "portable-atomic", + "ryu", + "serde", + "tracing", +] + +[[package]] +name = "iroh-metrics-derive" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ae5f0c4405d1fbc9fb16ff422ca40620e93dc36c30ecaba0c2aee3992b7bd48" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "iroh-relay" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c12e48fef252fd04f8e6b6a8802b377baf72548d62ae4838816624cd0e06b79" +dependencies = [ + "blake3", + "bytes", + "cfg_aliases", + "data-encoding", + "derive_more", + "getrandom 0.4.3", + "hickory-resolver", + "http", + "http-body-util", + "hyper", + "hyper-util", + "iroh-base", + "iroh-dns", + "iroh-metrics", + "lru", + "n0-error", + "n0-future", + "noq", + "noq-proto", + "num_enum", + "pin-project", + "postcard", + "rand", + "reqwest", + "rustls", + "rustls-pki-types", + "serde", + "serde_bytes", + "strum", + "tokio", + "tokio-rustls", + "tokio-util", + "tokio-websockets", + "tracing", + "url", + "vergen-gitcl", + "webpki-roots", + "ws_stream_wasm", +] + +[[package]] +name = "iroh-tickets" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da53233419ca36bf521ed45683b7748366f9b233032891eefc2d70567a84ac54" +dependencies = [ + "data-encoding", + "derive_more", + "iroh-base", + "n0-error", + "postcard", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "lru" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "mac-addr" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d25b0e0b648a86960ac23b7ad4abb9717601dec6f66c165f5b037f3f03065f" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moka" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "n0-error" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c37e81176a83a77d2514528b91bdafc70ef88aab428f0e1b91aebb8d99888895" +dependencies = [ + "n0-error-macros", + "spez", +] + +[[package]] +name = "n0-error-macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2acd8b070213b0299282f884b4beba4e7b52d624fdcd504a3ad3665390c11e1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "n0-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ab99dfb861450e68853d34ae665243a88b8c493d01ba957321a1e9b2312bbe" +dependencies = [ + "cfg_aliases", + "derive_more", + "futures-buffered", + "futures-lite", + "futures-util", + "js-sys", + "pin-project", + "send_wrapper", + "tokio", + "tokio-util", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "n0-watcher" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc618745ad0b7414b149d0517ad8b5573b2fb4d4e2717add3d2446ce1fdd826" +dependencies = [ + "derive_more", + "n0-error", + "n0-future", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "netdev" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "569dfbdd2efd771b24ec9bb57f956e04d4fbfc72f62b2f11961723f9b3f4b020" +dependencies = [ + "block2", + "dispatch2", + "dlopen2", + "ipnet", + "jni 0.21.1", + "libc", + "mac-addr", + "ndk-context", + "netlink-packet-core", + "netlink-packet-route", + "netlink-sys", + "objc2", + "objc2-core-foundation", + "objc2-core-wlan", + "objc2-foundation", + "objc2-system-configuration", + "once_cell", + "plist", + "windows-sys 0.61.2", +] + +[[package]] +name = "netlink-packet-core" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" +dependencies = [ + "paste", +] + +[[package]] +name = "netlink-packet-route" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2288fcb784eb3defd5fb16f4c4160d5f477de192eac730f43e1d11c24d9a007" +dependencies = [ + "bitflags", + "libc", + "log", + "netlink-packet-core", +] + +[[package]] +name = "netlink-proto" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror 2.0.18", +] + +[[package]] +name = "netlink-sys" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6c30ed10fa69cc491d491b85cc971f6bdeb8e7367b7cde2ee6cc878d583fae" +dependencies = [ + "bytes", + "futures-util", + "libc", + "log", + "tokio", +] + +[[package]] +name = "netwatch" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d9cbe01741347ef750d743d6690603f5eed8341e679fb51c8e629337aa11976" +dependencies = [ + "atomic-waker", + "bytes", + "cfg_aliases", + "derive_more", + "ipnet", + "js-sys", + "libc", + "n0-error", + "n0-future", + "n0-watcher", + "netdev", + "netlink-packet-core", + "netlink-packet-route", + "netlink-proto", + "netlink-sys", + "noq-udp", + "objc2-core-foundation", + "objc2-system-configuration", + "pin-project-lite", + "serde", + "socket2", + "time", + "tokio", + "tokio-util", + "tracing", + "web-sys", + "windows", + "windows-result", + "wmi", +] + +[[package]] +name = "noq" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf95190af1bd4a00a10e8255ca0c8ddd9e9a9f5e79151d7a7eb6d56aff5dc89" +dependencies = [ + "bytes", + "cfg_aliases", + "derive_more", + "noq-proto", + "noq-udp", + "pin-project-lite", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tracing", + "web-time", +] + +[[package]] +name = "noq-proto" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa6c890013591e709a3e45dd53501351b7e27e7ff3c7e9fc3dce43e300e7e9d3" +dependencies = [ + "aes-gcm", + "bytes", + "derive_more", + "enum-assoc", + "getrandom 0.4.3", + "identity-hash", + "lru-slab", + "rand", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "sorted-index-buffer", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "noq-udp" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3137a52df66c20090a889828d1c655f21f52294cba64e5c4fbb04fc83eee7c8e" +dependencies = [ + "cfg_aliases", + "libc", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags", + "block2", + "dispatch2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-core-wlan" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e34919aba0d701380d911702455038a8a3587467fe0141d6a71501e7ffe48" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-security", + "objc2-security-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-security" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-security-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef76382e9cedd18123099f17638715cc3d81dba3637d4c0d39ab69df2ef345a5" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-system-configuration" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" +dependencies = [ + "bitflags", + "dispatch2", + "libc", + "objc2", + "objc2-core-foundation", + "objc2-security", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +dependencies = [ + "critical-section", + "portable-atomic", +] + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "papaya" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "997ee03cd38c01469a7046643714f0ad28880bcb9e6679ff0666e24817ca19b7" +dependencies = [ + "equivalent", + "seize", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem-rfc7468" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkcs8" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "plist" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1" +dependencies = [ + "base64", + "indexmap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +dependencies = [ + "serde", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "postcard-derive", + "serde", +] + +[[package]] +name = "postcard-derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "prefix-trie" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf6e3177f0684016a5c209b00882e15f8bdd3f3bb48f0491df10cd102d0c6e7" +dependencies = [ + "either", + "ipnet", + "num-traits", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.23.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni 0.22.4", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "seize" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b55fb86dfd3a2f5f76ea78310a88f96c4ea21a3031f8d212443d56123fd0521" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serdect" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" + +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simple-dns" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a75cbde1bf934313596a004973e462f9a82caa814dcf1a5f507bdf51597eeb4" +dependencies = [ + "bitflags", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "sorted-index-buffer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea06cc588e43c632923a55450401b8f25e628131571d4e1baea1bdfdb2b5ed06" + +[[package]] +name = "spez" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87e960f4dca2788eeb86bbdde8dd246be8948790b7618d656e68f9b720a86e8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" + +[[package]] +name = "spki" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "thunderbolt-acp-client" +version = "0.1.0" +dependencies = [ + "async-channel", + "async-stream", + "console_error_panic_hook", + "futures-core", + "getrandom 0.3.4", + "hex", + "iroh", + "iroh-tickets", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", +] + +[[package]] +name = "time" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" +dependencies = [ + "deranged", + "js-sys", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-websockets" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52efb639344a7c6adb8e62c6f3d2c19c001ff1b79a5041ba1c6ed42e19c6aa5" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-sink", + "getrandom 0.4.3", + "http", + "httparse", + "rand", + "ring", + "rustls-pki-types", + "sha1_smol", + "simdutf8", + "tokio", + "tokio-rustls", + "tokio-util", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vergen" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b849a1f6d8639e8de261e81ee0fc881e3e3620db1af9f2e0da015d4382ceaf75" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", + "vergen-lib", +] + +[[package]] +name = "vergen-gitcl" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ff3b5300a085d6bcd8fc96a507f706a28ae3814693236c9b409db71a1d15b9" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", + "time", + "vergen", + "vergen-lib", +] + +[[package]] +name = "vergen-lib" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b34a29ba7e9c59e62f229ae1932fb1b8fb8a6fdcc99215a641913f5f5a59a569" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wmi" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c81b85c57a57500e56669586496bf2abd5cf082b9d32995251185d105208b64" +dependencies = [ + "chrono", + "futures", + "log", + "serde", + "thiserror 2.0.18", + "windows", + "windows-core", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper", + "thiserror 2.0.18", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/crates/thunderbolt-acp-client/Cargo.toml b/crates/thunderbolt-acp-client/Cargo.toml new file mode 100644 index 000000000..047b0cbbc --- /dev/null +++ b/crates/thunderbolt-acp-client/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "thunderbolt-acp-client" +version = "0.1.0" +edition = "2024" +license = "MPL-2.0" +description = "Relay-only iroh client (wasm) that dials a Thunderbolt CLI ACP/MCP bridge over an n0 relay." + +[lib] +# cdylib => the wasm artifact the web app imports; rlib => lets a native Tauri +# build (deferred) reuse the same client, and lets `cargo check` run on the host. +crate-type = ["cdylib", "rlib"] + +[dependencies] +# Browser/relay-only iroh. `default-features = false` drops `metrics` (required +# for wasm). `tls-ring` is the wasm-compatible TLS backend (ring compiles its C +# crypto to wasm — see build.sh for the macOS clang requirement). +iroh = { version = "1", default-features = false, features = ["tls-ring"] } +# Ticket parsing: the CLI bridge prints an `EndpointTicket` (NodeId + relay URL). +iroh-tickets = "1" + +wasm-bindgen = "0.2" +wasm-bindgen-futures = "0.4" +js-sys = "0.3" +# ReadableStream bridge for the receive half (Uint8Array chunks → JS stream). +wasm-streams = "0.5" +# `stream! { ... }` generator that turns the iroh recv half into a Stream. +async-stream = "0.3" +# The `Stream` trait named in `recv_byte_stream`'s return type. +futures-core = { version = "0.3", default-features = false } +# Outbound byte queue decoupling `send()` from the QUIC write task, so the +# wasm-bindgen object is never borrowed across an await. +async-channel = "2" +# wasm RNG backend — paired with the rustflags cfg in .cargo/config.toml. +getrandom = { version = "0.3", features = ["wasm_js"] } +# Stable-identity persistence: serialize the secret key as hex for localStorage. +hex = "0.4" +console_error_panic_hook = "0.1" + +# Disable wasm-pack's BUNDLED wasm-opt — it's too old to validate the bulk-memory +# ops rustc emits. build.sh runs a current Homebrew `wasm-opt -Oz` instead, which +# reads the target-features section and needs no manual feature flags. +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[profile.release] +opt-level = "z" +lto = true +strip = true +panic = "abort" diff --git a/crates/thunderbolt-acp-client/build.sh b/crates/thunderbolt-acp-client/build.sh new file mode 100755 index 000000000..b0d3dcebf --- /dev/null +++ b/crates/thunderbolt-acp-client/build.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Build the Thunderbolt ACP iroh client to WebAssembly for the web app. +# +# Output: a wasm-pack `pkg/` at `src/acp/iroh/pkg/` (the app lazy-imports the +# glue from there). Re-run after changing the crate. +# +# Toolchain (one-time): +# rustup target add wasm32-unknown-unknown +# cargo install wasm-pack # or the prebuilt installer +# +# macOS caveat: `ring` (TLS backend) compiles C to wasm32, and Apple's system +# clang has NO wasm backend. Install Homebrew LLVM and this script points the +# wasm C toolchain at it. Linux CI usually ships a wasm-capable clang already. +# brew install llvm +# +# Size: this script runs `wasm-opt -Oz` from a current Homebrew binaryen +# (`brew install binaryen`). wasm-pack's bundled wasm-opt is too old to validate +# the bulk-memory ops rustc emits, so it's disabled in Cargo.toml. +set -euo pipefail + +CRATE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$CRATE_DIR/../.." && pwd)" +OUT_DIR="${OUT_DIR:-$REPO_ROOT/src/acp/iroh/pkg}" + +if [[ "$(uname)" == "Darwin" ]]; then + LLVM_PREFIX="${LLVM_PREFIX:-/opt/homebrew/opt/llvm}" + if [[ ! -x "$LLVM_PREFIX/bin/clang" ]]; then + echo "error: Homebrew LLVM clang not found at $LLVM_PREFIX/bin/clang." >&2 + echo " Run 'brew install llvm' (Apple clang can't target wasm32)." >&2 + exit 1 + fi + CLANG_VER="$(ls "$LLVM_PREFIX/lib/clang" | sort -V | tail -1)" + export CC_wasm32_unknown_unknown="$LLVM_PREFIX/bin/clang" + export AR_wasm32_unknown_unknown="$LLVM_PREFIX/bin/llvm-ar" + export CFLAGS_wasm32_unknown_unknown="-I$LLVM_PREFIX/lib/clang/$CLANG_VER/include" +fi + +cd "$CRATE_DIR" +echo "building wasm → $OUT_DIR" +wasm-pack build --target web --release --out-dir "$OUT_DIR" + +WASM="$OUT_DIR/thunderbolt_acp_client_bg.wasm" +if command -v wasm-opt >/dev/null 2>&1; then + echo "optimizing with $(wasm-opt --version)" + # Enable the wasm features LLVM emits — the release profile's `strip` drops the + # target-features section, so wasm-opt can't auto-detect them and defaults to MVP. + wasm-opt -Oz \ + --enable-bulk-memory --enable-bulk-memory-opt \ + --enable-nontrapping-float-to-int --enable-sign-ext \ + --enable-mutable-globals --enable-reference-types --enable-multivalue \ + "$WASM" -o "$WASM.opt" + mv "$WASM.opt" "$WASM" +else + echo "warning: wasm-opt not found — shipping the unoptimized artifact. 'brew install binaryen' to shrink it." >&2 +fi + +# wasm-pack writes a '*' .gitignore into the out-dir; drop it so the build +# artifact can be committed (the app imports it without a wasm toolchain in CI). +rm -f "$OUT_DIR/.gitignore" + +echo "done. artifact:" +ls -lh "$WASM" diff --git a/crates/thunderbolt-acp-client/src/lib.rs b/crates/thunderbolt-acp-client/src/lib.rs new file mode 100644 index 000000000..4a51fee5f --- /dev/null +++ b/crates/thunderbolt-acp-client/src/lib.rs @@ -0,0 +1,248 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//! Thunderbolt ACP client — a relay-only [iroh] dialer compiled to WebAssembly. +//! +//! The web app can't open UDP sockets, so this crate binds a **relay-only** +//! iroh endpoint (the n0 preset): every QUIC packet flows over a WebSocket to an +//! n0 relay, still end-to-end encrypted to the dialed peer. That is exactly the +//! topology of dialing a `thunderbolt acp --transport iroh` CLI bridge from the +//! browser — no hole-punching, no direct path. +//! +//! Surface (consumed by `src/acp/transports/iroh.ts`): +//! * [`IrohClient::create`] — bind ONE long-lived endpoint (optionally pinned +//! to a persisted secret key so the bridge operator allowlists a stable +//! NodeId once). +//! * [`IrohClient::connect`] — dial a ticket or bare NodeId over an ALPN and +//! open ONE bidirectional stream, returning an [`IrohConnection`]. +//! * [`IrohConnection::send`] / [`IrohConnection::readable`] — write bytes into +//! and read bytes out of that stream. The JS side carries newline-delimited +//! JSON-RPC (ACP) over this raw byte pipe, matching the CLI bridge's ndjson +//! framing (`cli/src/iroh/pump.ts`). +//! +//! The ALPN is supplied by the caller (`thunderbolt/acp/0` for the ACP bridge) +//! and must match the bridge byte-for-byte or the QUIC handshake is refused. +//! +//! This same crate is intended to be the shared native client for Tauri +//! (desktop/mobile) via its `rlib` target; only the wasm/web target is built +//! here — native embedding is deferred. + +use std::cell::RefCell; + +use async_channel::{Receiver, Sender}; +use iroh::endpoint::{Connection, RecvStream, SendStream, presets}; +use iroh::{Endpoint, EndpointAddr, EndpointId, SecretKey}; +use iroh_tickets::endpoint::EndpointTicket; +use js_sys::{Promise, Uint8Array}; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::{future_to_promise, spawn_local}; +use wasm_streams::ReadableStream; +use wasm_streams::readable::sys::ReadableStream as JsReadableStream; + +/// Depth of the outbound byte queue. Decouples `send()` (which only enqueues) +/// from the QUIC write task, so the wasm-bindgen object is never borrowed across +/// an await. Small because ACP JSON-RPC messages are tiny and frequent. +const OUTBOUND_CAPACITY: usize = 64; + +/// Max bytes pulled per recv read — a comfortably large ceiling for JSON-RPC. +const READ_CHUNK_LIMIT: usize = 1 << 16; + +/// Installs a panic hook that surfaces Rust panics as readable console errors. +#[wasm_bindgen(start)] +fn start() { + console_error_panic_hook::set_once(); +} + +/// One long-lived relay-only iroh endpoint. Hold a single instance for the app's +/// lifetime and open a connection per bridge — re-binding per dial would churn +/// the relay handshake and the NodeId. +#[wasm_bindgen] +pub struct IrohClient { + endpoint: Endpoint, + secret_key_hex: String, +} + +#[wasm_bindgen] +impl IrohClient { + /// Bind the relay-only endpoint and wait until a home relay is usable. + /// + /// Pass a 32-byte hex secret key to pin a stable NodeId (so the bridge + /// operator runs `thunderbolt iroh allow ` only once); pass `null` + /// to generate a fresh identity, then read it back via + /// [`IrohClient::secret_key_hex`] to persist for next session. + #[wasm_bindgen(js_name = create)] + pub async fn create(secret_key_hex: Option) -> Result { + let secret = match secret_key_hex.as_deref() { + Some(hex) if !hex.trim().is_empty() => parse_secret(hex)?, + _ => SecretKey::generate(), + }; + let stored_hex = hex::encode(secret.to_bytes()); + let endpoint = Endpoint::builder(presets::N0) + .secret_key(secret) + .bind() + .await + .map_err(to_js)?; + // Wait for a home relay so the first dial can traverse it immediately. + endpoint.online().await; + Ok(IrohClient { + endpoint, + secret_key_hex: stored_hex, + }) + } + + /// This client's NodeId (base32). The bridge operator allowlists it with + /// `thunderbolt iroh allow `. + #[wasm_bindgen(js_name = nodeId)] + pub fn node_id(&self) -> String { + self.endpoint.id().to_string() + } + + /// This client's secret key as hex, so the app can persist it and re-create + /// the SAME NodeId next session. + #[wasm_bindgen(js_name = secretKeyHex)] + pub fn secret_key_hex(&self) -> String { + self.secret_key_hex.clone() + } + + /// Dial `target` (an `EndpointTicket` or a bare NodeId) over `alpn`, open ONE + /// bidirectional stream, and resolve to an [`IrohConnection`]. + /// + /// Returns a `Promise` (rather than an `async fn` borrowing `&self`) so the + /// endpoint is cloned out synchronously and the future owns it. + #[wasm_bindgen(js_name = connect)] + pub fn connect(&self, target: String, alpn: String) -> Promise { + let endpoint = self.endpoint.clone(); + future_to_promise(async move { + let addr = resolve_target(&target)?; + let connection = endpoint + .connect(addr, alpn.as_bytes()) + .await + .map_err(err_to_jsv)?; + let (send, recv) = connection.open_bi().await.map_err(err_to_jsv)?; + Ok(JsValue::from(IrohConnection::new(connection, send, recv))) + }) + } +} + +/// A live bridge connection: one QUIC bidi stream over the relay. Sending queues +/// bytes for the write task; the receive half is exposed once as a JS +/// `ReadableStream` of `Uint8Array` chunks. +#[wasm_bindgen] +pub struct IrohConnection { + // Held to keep the QUIC connection alive — dropping it tears the stream down. + connection: Connection, + outbound: Sender>, + readable: RefCell>, +} + +impl IrohConnection { + fn new(connection: Connection, send: SendStream, recv: RecvStream) -> Self { + let (outbound, rx) = async_channel::bounded::>(OUTBOUND_CAPACITY); + spawn_local(drive_send(send, rx)); + let readable = ReadableStream::from_stream(recv_byte_stream(recv)).into_raw(); + IrohConnection { + connection, + outbound, + readable: RefCell::new(Some(readable)), + } + } +} + +#[wasm_bindgen] +impl IrohConnection { + /// Queue `data` to be written to the bidi stream. Resolves once enqueued + /// (the write task drains it); rejects if the connection is already closed. + #[wasm_bindgen(js_name = send)] + pub fn send(&self, data: Vec) -> Promise { + let outbound = self.outbound.clone(); + future_to_promise(async move { + outbound + .send(data) + .await + .map_err(|_| JsValue::from(JsError::new("iroh connection closed")))?; + Ok(JsValue::UNDEFINED) + }) + } + + /// The receive half as a `ReadableStream`. Consumed once — the JS + /// transport reads it for the lifetime of the session. + #[wasm_bindgen(js_name = readable)] + pub fn readable(&self) -> Result { + self.readable + .borrow_mut() + .take() + .ok_or_else(|| JsError::new("iroh receive stream already taken")) + } + + /// Close the connection: stop the outbound queue (finishing the send half) + /// and close the QUIC connection. + #[wasm_bindgen(js_name = close)] + pub fn close(&self) { + self.outbound.close(); + self.connection.close(0u8.into(), b"client closed"); + } +} + +/// Drain the outbound queue into the send half, finishing the stream when the +/// queue closes (on [`IrohConnection::close`] or drop) or a write fails. +async fn drive_send(mut send: SendStream, rx: Receiver>) { + while let Ok(chunk) = rx.recv().await { + if send.write_all(&chunk).await.is_err() { + break; + } + } + let _ = send.finish(); +} + +/// Turn the iroh recv half into a `Stream` of `Uint8Array` chunks for +/// `ReadableStream::from_stream`. Ends on a clean FIN (`Ok(None)`); a read error +/// is surfaced as a stream error and ends the stream. +fn recv_byte_stream( + mut recv: RecvStream, +) -> impl futures_core::Stream> { + async_stream::stream! { + loop { + match recv.read_chunk(READ_CHUNK_LIMIT).await { + Ok(Some(bytes)) => { + let chunk = Uint8Array::new_with_length(bytes.len() as u32); + chunk.copy_from(bytes.as_ref()); + yield Ok(JsValue::from(chunk)); + } + Ok(None) => break, + Err(err) => { + yield Err(JsValue::from(JsError::new(&err.to_string()))); + break; + } + } + } + } +} + +/// Resolve a dial target: an `EndpointTicket` (NodeId + relay URL) if it parses, +/// else a bare NodeId relying on n0 DNS discovery to find the relay. +fn resolve_target(target: &str) -> Result { + if let Ok(ticket) = target.parse::() { + return Ok(ticket.endpoint_addr().clone()); + } + let id: EndpointId = target.parse().map_err(err_to_jsv)?; + Ok(EndpointAddr::from(id)) +} + +/// Parse a 32-byte hex secret key into a [`SecretKey`]. +fn parse_secret(hex_str: &str) -> Result { + let bytes = hex::decode(hex_str.trim()).map_err(to_js)?; + let arr: [u8; 32] = bytes + .as_slice() + .try_into() + .map_err(|_| JsError::new("secret key must be 32 bytes (64 hex chars)"))?; + Ok(SecretKey::from_bytes(&arr)) +} + +fn to_js(err: impl std::fmt::Display) -> JsError { + JsError::new(&err.to_string()) +} + +fn err_to_jsv(err: impl std::fmt::Display) -> JsValue { + JsValue::from(JsError::new(&err.to_string())) +} diff --git a/eslint.config.js b/eslint.config.js index 73034436a..b28a2bac7 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -15,6 +15,9 @@ import globals from 'globals' import { sharedParserOptions, sharedRules } from './shared/eslint/base.js' export default [ + // Global ignores (object with only `ignores` applies repo-wide). The generated + // wasm-bindgen glue is a build artifact — never lint it. + { ignores: ['src/acp/iroh/pkg/**', 'crates/**'] }, js.configs.recommended, prettier, { diff --git a/scripts/license-headers.ts b/scripts/license-headers.ts index d53d03bbd..e665ff979 100644 --- a/scripts/license-headers.ts +++ b/scripts/license-headers.ts @@ -57,6 +57,9 @@ const skipPathPatterns: RegExp[] = [ /(^|\/)drizzle\/meta\//, /(^|\/)dist(-[^/]+)?\//, /(^|\/)node_modules\//, + // Generated wasm-bindgen glue for the iroh ACP client (build artifact). + /(^|\/)src\/acp\/iroh\/pkg\//, + /(^|\/)crates\/[^/]+\/target\//, /\.gen\.[a-z]+$/i, ] diff --git a/src/acp/acp-adapter.ts b/src/acp/acp-adapter.ts index 69b7d2ef2..60ab0d2c9 100644 --- a/src/acp/acp-adapter.ts +++ b/src/acp/acp-adapter.ts @@ -193,7 +193,7 @@ export const connectAcpAdapter = async ( if (!agent.url) { throw new Error(`ACP agent ${agent.id} has no url`) } - if (agent.transport !== 'websocket') { + if (agent.transport !== 'websocket' && agent.transport !== 'iroh') { throw new Error(`ACP agent ${agent.id} has unsupported transport ${agent.transport}`) } diff --git a/src/acp/iroh/iroh-transport.test.ts b/src/acp/iroh/iroh-transport.test.ts new file mode 100644 index 000000000..79592ec7d --- /dev/null +++ b/src/acp/iroh/iroh-transport.test.ts @@ -0,0 +1,215 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * iroh transport tests. A fake `IrohClientLike` stands in for the wasm client — + * no relay, no wasm — so the ndjson framing and `Stream` adaptation are exercised + * directly. The shared client is reset between cases. + */ + +import type { AnyMessage } from '@agentclientprotocol/sdk' +import { afterEach, describe, expect, it } from 'bun:test' +import { resetSharedIrohClientForTests, acpIrohAlpn, openIrohTransport } from './iroh-transport' +import type { IrohClientLike, IrohConnectionLike } from './types' + +type FakeConnection = { + connection: IrohConnectionLike + pushBytes: (bytes: Uint8Array) => void + endReceive: () => void + errorReceive: (err: Error) => void + sent: () => Uint8Array[] + closed: () => boolean +} + +const makeFakeConnection = (): FakeConnection => { + let controller: ReadableStreamDefaultController | null = null + const readable = new ReadableStream({ + start(c) { + controller = c + }, + }) + const sent: Uint8Array[] = [] + let isClosed = false + return { + connection: { + send: async (data) => { + sent.push(data) + }, + readable: () => readable, + close: () => { + isClosed = true + }, + }, + pushBytes: (bytes) => controller?.enqueue(bytes), + endReceive: () => controller?.close(), + errorReceive: (err) => controller?.error(err), + sent: () => sent, + closed: () => isClosed, + } +} + +type CapturedConnect = { target: string; alpn: string } + +const makeFakeClient = (connection: IrohConnectionLike, captured: CapturedConnect[]): IrohClientLike => ({ + nodeId: () => 'fake-node-id', + connect: async (target, alpn) => { + captured.push({ target, alpn }) + return connection + }, +}) + +const enc = (s: string): Uint8Array => new TextEncoder().encode(s) + +afterEach(() => { + resetSharedIrohClientForTests() +}) + +describe('openIrohTransport', () => { + it('dials the target over the ACP ALPN', async () => { + const fake = makeFakeConnection() + const captured: CapturedConnect[] = [] + await openIrohTransport({ + target: 'ticket-or-nodeid', + signal: new AbortController().signal, + loadClient: async () => makeFakeClient(fake.connection, captured), + }) + expect(captured).toEqual([{ target: 'ticket-or-nodeid', alpn: acpIrohAlpn }]) + }) + + it('frames an outbound message as ndjson on the send half', async () => { + const fake = makeFakeConnection() + const transport = await openIrohTransport({ + target: 't', + signal: new AbortController().signal, + loadClient: async () => makeFakeClient(fake.connection, []), + }) + const writer = transport.stream.writable.getWriter() + await writer.write({ jsonrpc: '2.0', id: 1, method: 'initialize' } as unknown as AnyMessage) + expect(fake.sent().map((b) => new TextDecoder().decode(b))).toEqual([ + '{"jsonrpc":"2.0","id":1,"method":"initialize"}\n', + ]) + }) + + it('decodes inbound ndjson bytes into ACP messages on the readable', async () => { + const fake = makeFakeConnection() + const transport = await openIrohTransport({ + target: 't', + signal: new AbortController().signal, + loadClient: async () => makeFakeClient(fake.connection, []), + }) + const reader = transport.stream.readable.getReader() + fake.pushBytes(enc('{"jsonrpc":"2.0","id":1,"result":{}}\n')) + const { value } = await reader.read() + expect(value).toEqual({ jsonrpc: '2.0', id: 1, result: {} } as unknown as AnyMessage) + }) + + it('reassembles a message split across two receive chunks', async () => { + const fake = makeFakeConnection() + const transport = await openIrohTransport({ + target: 't', + signal: new AbortController().signal, + loadClient: async () => makeFakeClient(fake.connection, []), + }) + const reader = transport.stream.readable.getReader() + fake.pushBytes(enc('{"jsonrpc":"2.0",')) + fake.pushBytes(enc('"id":7}\n')) + const { value } = await reader.read() + expect(value).toEqual({ jsonrpc: '2.0', id: 7 } as unknown as AnyMessage) + }) + + it('resolves `closed` cleanly when the receive stream ends', async () => { + const fake = makeFakeConnection() + const transport = await openIrohTransport({ + target: 't', + signal: new AbortController().signal, + loadClient: async () => makeFakeClient(fake.connection, []), + }) + fake.endReceive() + await expect(transport.closed).resolves.toBeUndefined() + }) + + it('rejects `closed` when the receive stream errors', async () => { + const fake = makeFakeConnection() + const transport = await openIrohTransport({ + target: 't', + signal: new AbortController().signal, + loadClient: async () => makeFakeClient(fake.connection, []), + }) + fake.errorReceive(new Error('relay dropped')) + await expect(transport.closed).rejects.toThrow('relay dropped') + }) + + it('closes the readable on close() and ignores inbound bytes that arrive after', async () => { + const fake = makeFakeConnection() + const transport = await openIrohTransport({ + target: 't', + signal: new AbortController().signal, + loadClient: async () => makeFakeClient(fake.connection, []), + }) + const reader = transport.stream.readable.getReader() + transport.close() + // A late frame from the wire must not throw (the pump is guarded). + fake.pushBytes(enc('{"late":true}\n')) + const { done } = await reader.read() + expect(done).toBe(true) + }) + + it('close() closes the underlying connection and settles `closed`', async () => { + const fake = makeFakeConnection() + const transport = await openIrohTransport({ + target: 't', + signal: new AbortController().signal, + loadClient: async () => makeFakeClient(fake.connection, []), + }) + transport.close() + expect(fake.closed()).toBe(true) + await expect(transport.closed).resolves.toBeUndefined() + }) + + it('aborting the signal closes the connection', async () => { + const fake = makeFakeConnection() + const controller = new AbortController() + await openIrohTransport({ + target: 't', + signal: controller.signal, + loadClient: async () => makeFakeClient(fake.connection, []), + }) + controller.abort() + expect(fake.closed()).toBe(true) + }) + + it('rejects with AbortError and closes the connection if aborted during the dial', async () => { + const fake = makeFakeConnection() + const controller = new AbortController() + controller.abort() + await expect( + openIrohTransport({ + target: 't', + signal: controller.signal, + loadClient: async () => makeFakeClient(fake.connection, []), + }), + ).rejects.toThrow(/abort/i) + expect(fake.closed()).toBe(true) + }) + + it('binds ONE shared client across transports, opening a connection each', async () => { + let binds = 0 + let connects = 0 + const loadClient = async (): Promise => { + binds += 1 + return { + nodeId: () => 'shared', + // A fresh connection per dial — each transport owns its own bidi stream. + connect: async () => { + connects += 1 + return makeFakeConnection().connection + }, + } + } + await openIrohTransport({ target: 'a', signal: new AbortController().signal, loadClient }) + await openIrohTransport({ target: 'b', signal: new AbortController().signal, loadClient }) + expect(binds).toBe(1) + expect(connects).toBe(2) + }) +}) diff --git a/src/acp/iroh/iroh-transport.ts b/src/acp/iroh/iroh-transport.ts new file mode 100644 index 000000000..33b9193db --- /dev/null +++ b/src/acp/iroh/iroh-transport.ts @@ -0,0 +1,208 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * iroh transport for ACP — the relay-only, peer-to-peer counterpart to the + * WebSocket transport. Dials a `thunderbolt acp --transport iroh` CLI bridge by + * its NodeId/ticket (carried in `agent.url`) over an n0 relay, end-to-end + * encrypted to the bridge. + * + * The dial happens in a Rust→wasm client (`crates/thunderbolt-acp-client`) that + * the browser can't replace with JS — iroh has no browser TS SDK. The wasm chunk + * is lazy-loaded on first use (never in the entry bundle) and ONE relay endpoint + * is shared across every iroh agent; each agent opens its own bidi stream. + * + * The bidi stream is a raw byte pipe, so this transport adds the same ndjson + * framing the bridge uses (`./ndjson`) to carry ACP JSON-RPC objects, and adapts + * it to the SDK's `{ readable, writable }` message `Stream`. + */ + +import type { AnyMessage, Stream } from '@agentclientprotocol/sdk' +import type { AcpTransport } from '../types' +import { createNdjsonDecoder, encodeNdjsonFrame } from './ndjson' +import type { IrohClientLike, IrohClientLoader } from './types' + +/** ALPN of the CLI ACP bridge (`cli/src/iroh/endpoint.ts`, + * `thunderbolt/${protocol}/0`). Must match byte-for-byte or the QUIC handshake + * is refused — an ACP client can't drive an MCP bridge. */ +export const acpIrohAlpn = 'thunderbolt/acp/0' + +/** localStorage key for the persisted client secret key (hex). Persisting it + * pins a stable NodeId, so the bridge operator allowlists this app once. */ +const secretStorageKey = 'iroh_acp_client_secret' + +// ONE long-lived relay endpoint for the whole app — binding per dial would churn +// the relay handshake and the NodeId. All iroh transports share this client and +// open their own connection on it. +let sharedClient: Promise | null = null + +const readPersistedSecret = (): string | undefined => { + if (typeof localStorage === 'undefined') { + return undefined + } + return localStorage.getItem(secretStorageKey) ?? undefined +} + +const persistSecret = (hex: string): void => { + if (typeof localStorage === 'undefined') { + return + } + localStorage.setItem(secretStorageKey, hex) +} + +/** Lazy-load + bind the wasm iroh client, pinning a persisted identity. The + * dynamic import is the route-split point — the multi-MB wasm chunk never lands + * in the entry bundle. */ +const defaultLoadClient: IrohClientLoader = async () => { + const wasm = await import('./pkg/thunderbolt_acp_client.js') + await wasm.default() + const client = await wasm.IrohClient.create(readPersistedSecret()) + persistSecret(client.secretKeyHex()) + return client as unknown as IrohClientLike +} + +/** Get (binding once) the shared iroh client. A failed bind clears the cache so + * a later attempt can retry rather than replaying a rejected promise forever. */ +const getSharedClient = (load: IrohClientLoader): Promise => { + if (!sharedClient) { + sharedClient = load().catch((err: unknown) => { + sharedClient = null + throw err + }) + } + return sharedClient +} + +/** This app's iroh NodeId — what a bridge operator runs + * `thunderbolt iroh allow ` against. Binds the shared client on first + * call. Surfaced for the agent-settings UI (wired in a later slice). */ +export const irohClientNodeId = async (load: IrohClientLoader = defaultLoadClient): Promise => + (await getSharedClient(load)).nodeId() + +export type OpenIrohTransportOptions = { + /** EndpointTicket or bare NodeId printed by the CLI bridge (held in + * `agent.url` for an iroh agent). */ + target: string + /** Aborting tears the transport (and its bidi stream) down. */ + signal: AbortSignal + /** Override the ALPN (e.g. an MCP bridge). Defaults to {@link acpIrohAlpn}. */ + alpn?: string + /** Test seam — production omits and lazy-loads the wasm client. */ + loadClient?: IrohClientLoader +} + +/** Open an ACP transport against an iroh bridge `target`. Dials over the shared + * relay endpoint, opens one bidi stream, and frames ACP JSON-RPC as ndjson. */ +export const openIrohTransport = async (options: OpenIrohTransportOptions): Promise => { + const client = await getSharedClient(options.loadClient ?? defaultLoadClient) + const connection = await client.connect(options.target, options.alpn ?? acpIrohAlpn) + + // If the caller aborted while we were binding/dialing, don't hand back a live + // connection — close it and surface the abort, matching the WebSocket path + // (which rejects with `AbortError`). No await follows until the listener is + // attached, so there's no further abort window to miss. + if (options.signal.aborted) { + connection.close() + throw new DOMException('aborted', 'AbortError') + } + + // `closed` rejects on a transport-level read error and resolves on clean EOF / + // caller close, so the adapter's handshake can race it and fail loudly instead + // of hanging on a pending `initialize` (mirrors the WebSocket transport). + let settleClosed: ((reason: Error | null) => void) | null = null + const closed = new Promise((resolve, reject) => { + settleClosed = (reason) => (reason ? reject(reason) : resolve()) + }) + closed.catch(() => {}) + const settleClosedOnce = (reason: Error | null): void => { + if (!settleClosed) { + return + } + const settle = settleClosed + settleClosed = null + settle(reason) + } + + const decoder = createNdjsonDecoder() + let readableController: ReadableStreamDefaultController | null = null + let readableClosed = false + const readable = new ReadableStream({ + start(controller) { + readableController = controller + }, + }) + + // Guard every controller op behind one flag so a normal close, a read error, + // and a consumer cancel can't double-close/enqueue-after-close (the same + // discipline the WebSocket transport uses). + const closeReadable = (): void => { + if (readableClosed) { + return + } + readableClosed = true + readableController?.close() + } + + // `close` is also the abort listener, so a normal close detaches it (rather + // than leaving it attached to the adapter's long-lived signal). Idempotent: + // `closeReadable`, `settleClosedOnce`, and the wasm `connection.close()` all + // no-op on re-entry. Defined before `writable`/`pumpReceive` so both route + // their teardown through this single path. + const close = (): void => { + options.signal.removeEventListener('abort', close) + closeReadable() + connection.close() + settleClosedOnce(null) + } + + // Pump iroh recv bytes → ndjson decode → ACP messages, for the session's life. + const pumpReceive = async (): Promise => { + const reader = connection.readable().getReader() + try { + while (true) { + const { value, done } = await reader.read() + if (done || readableClosed) { + break + } + for (const message of decoder.push(value)) { + readableController?.enqueue(message as AnyMessage) + } + } + closeReadable() + settleClosedOnce(null) + } catch (err) { + const error = err instanceof Error ? err : new Error(String(err)) + if (!readableClosed) { + readableClosed = true + readableController?.error(error) + } + settleClosedOnce(error) + } + } + void pumpReceive() + + const writable = new WritableStream({ + async write(message) { + await connection.send(encodeNdjsonFrame(message)) + }, + close() { + close() + }, + abort() { + close() + }, + }) + + const stream: Stream = { readable, writable } + + options.signal.addEventListener('abort', close, { once: true }) + + return { stream, close, closed } +} + +/** Reset the shared client — tests only, so module state doesn't leak between + * cases. */ +export const resetSharedIrohClientForTests = (): void => { + sharedClient = null +} diff --git a/src/acp/iroh/ndjson.test.ts b/src/acp/iroh/ndjson.test.ts new file mode 100644 index 000000000..49a5a1961 --- /dev/null +++ b/src/acp/iroh/ndjson.test.ts @@ -0,0 +1,55 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { describe, expect, it } from 'bun:test' +import { createNdjsonDecoder, encodeNdjsonFrame } from './ndjson' + +const decode = (bytes: Uint8Array): string => new TextDecoder().decode(bytes) + +describe('encodeNdjsonFrame', () => { + it('serializes a message as a single newline-terminated JSON line', () => { + const frame = encodeNdjsonFrame({ jsonrpc: '2.0', id: 1, method: 'initialize' }) + expect(decode(frame)).toBe('{"jsonrpc":"2.0","id":1,"method":"initialize"}\n') + }) +}) + +describe('createNdjsonDecoder', () => { + const enc = (s: string): Uint8Array => new TextEncoder().encode(s) + + it('decodes a single complete line', () => { + const decoder = createNdjsonDecoder() + expect(decoder.push(enc('{"a":1}\n'))).toEqual([{ a: 1 }]) + }) + + it('decodes multiple messages in one chunk', () => { + const decoder = createNdjsonDecoder() + expect(decoder.push(enc('{"a":1}\n{"b":2}\n'))).toEqual([{ a: 1 }, { b: 2 }]) + }) + + it('buffers a line split across chunks until its newline arrives', () => { + const decoder = createNdjsonDecoder() + expect(decoder.push(enc('{"a":'))).toEqual([]) + expect(decoder.push(enc('1}\n'))).toEqual([{ a: 1 }]) + }) + + it('holds an unterminated trailing line and completes it on the next chunk', () => { + const decoder = createNdjsonDecoder() + expect(decoder.push(enc('{"a":1}\n{"b":'))).toEqual([{ a: 1 }]) + expect(decoder.push(enc('2}\n'))).toEqual([{ b: 2 }]) + }) + + it('skips blank lines', () => { + const decoder = createNdjsonDecoder() + expect(decoder.push(enc('\n{"a":1}\n\n'))).toEqual([{ a: 1 }]) + }) + + it('reassembles a multi-byte UTF-8 character split across chunks', () => { + const decoder = createNdjsonDecoder() + // '✅' is 3 bytes (0xE2 0x9C 0x85); split after the first byte. + const full = enc('{"s":"✅"}\n') + const splitAt = 7 // mid the multi-byte sequence + expect(decoder.push(full.slice(0, splitAt))).toEqual([]) + expect(decoder.push(full.slice(splitAt))).toEqual([{ s: '✅' }]) + }) +}) diff --git a/src/acp/iroh/ndjson.ts b/src/acp/iroh/ndjson.ts new file mode 100644 index 000000000..cbea674d9 --- /dev/null +++ b/src/acp/iroh/ndjson.ts @@ -0,0 +1,43 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Newline-delimited JSON framing for the iroh byte pipe. + * + * An iroh bidi stream is a raw byte pipe with no message boundaries, so the ACP + * JSON-RPC objects are framed exactly as the CLI bridge frames them + * (`cli/src/iroh/pump.ts`): one JSON value per line, `\n`-terminated. The + * WebSocket transport gets discrete frames for free; here we add/strip the + * newline and re-assemble lines split across QUIC reads. + */ + +/** Encode a JSON-RPC message as a single `\n`-terminated UTF-8 frame. */ +export const encodeNdjsonFrame = (message: unknown): Uint8Array => + new TextEncoder().encode(`${JSON.stringify(message)}\n`) + +/** A stateful decoder that re-assembles complete JSON values from byte chunks, + * buffering a partial trailing line until its newline arrives. */ +export type NdjsonDecoder = { + /** Feed a received byte chunk; returns every complete message it completes. */ + push: (chunk: Uint8Array) => unknown[] +} + +/** + * Create an {@link NdjsonDecoder}. A streaming `TextDecoder` handles multi-byte + * UTF-8 sequences split across chunk boundaries; line buffering handles JSON + * values split across chunks. Blank lines are skipped. + */ +export const createNdjsonDecoder = (): NdjsonDecoder => { + const textDecoder = new TextDecoder() + let buffer = '' + return { + push: (chunk) => { + buffer += textDecoder.decode(chunk, { stream: true }) + const lines = buffer.split('\n') + // The final element is the (possibly empty) incomplete trailing line. + buffer = lines.pop() ?? '' + return lines.filter((line) => line.trim().length > 0).map((line) => JSON.parse(line) as unknown) + }, + } +} diff --git a/src/acp/iroh/pkg/package.json b/src/acp/iroh/pkg/package.json new file mode 100644 index 000000000..88dba6d8d --- /dev/null +++ b/src/acp/iroh/pkg/package.json @@ -0,0 +1,17 @@ +{ + "name": "thunderbolt-acp-client", + "type": "module", + "description": "Relay-only iroh client (wasm) that dials a Thunderbolt CLI ACP/MCP bridge over an n0 relay.", + "version": "0.1.0", + "license": "MPL-2.0", + "files": [ + "thunderbolt_acp_client_bg.wasm", + "thunderbolt_acp_client.js", + "thunderbolt_acp_client.d.ts" + ], + "main": "thunderbolt_acp_client.js", + "types": "thunderbolt_acp_client.d.ts", + "sideEffects": [ + "./snippets/*" + ] +} \ No newline at end of file diff --git a/src/acp/iroh/pkg/thunderbolt_acp_client.d.ts b/src/acp/iroh/pkg/thunderbolt_acp_client.d.ts new file mode 100644 index 000000000..ea19b0722 --- /dev/null +++ b/src/acp/iroh/pkg/thunderbolt_acp_client.d.ts @@ -0,0 +1,174 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * The `ReadableStreamType` enum. + * + * *This API requires the following crate features to be activated: `ReadableStreamType`* + */ + +export type ReadableStreamType = "bytes"; + +export class IntoUnderlyingByteSource { + private constructor(); + free(): void; + [Symbol.dispose](): void; + cancel(): void; + pull(controller: ReadableByteStreamController): Promise; + start(controller: ReadableByteStreamController): void; + readonly autoAllocateChunkSize: number; + readonly type: ReadableStreamType; +} + +export class IntoUnderlyingSink { + private constructor(); + free(): void; + [Symbol.dispose](): void; + abort(reason: any): Promise; + close(): Promise; + write(chunk: any): Promise; +} + +export class IntoUnderlyingSource { + private constructor(); + free(): void; + [Symbol.dispose](): void; + cancel(): void; + pull(controller: ReadableStreamDefaultController): Promise; +} + +/** + * One long-lived relay-only iroh endpoint. Hold a single instance for the app's + * lifetime and open a connection per bridge — re-binding per dial would churn + * the relay handshake and the NodeId. + */ +export class IrohClient { + private constructor(); + free(): void; + [Symbol.dispose](): void; + /** + * Dial `target` (an `EndpointTicket` or a bare NodeId) over `alpn`, open ONE + * bidirectional stream, and resolve to an [`IrohConnection`]. + * + * Returns a `Promise` (rather than an `async fn` borrowing `&self`) so the + * endpoint is cloned out synchronously and the future owns it. + */ + connect(target: string, alpn: string): Promise; + /** + * Bind the relay-only endpoint and wait until a home relay is usable. + * + * Pass a 32-byte hex secret key to pin a stable NodeId (so the bridge + * operator runs `thunderbolt iroh allow ` only once); pass `null` + * to generate a fresh identity, then read it back via + * [`IrohClient::secret_key_hex`] to persist for next session. + */ + static create(secret_key_hex?: string | null): Promise; + /** + * This client's NodeId (base32). The bridge operator allowlists it with + * `thunderbolt iroh allow `. + */ + nodeId(): string; + /** + * This client's secret key as hex, so the app can persist it and re-create + * the SAME NodeId next session. + */ + secretKeyHex(): string; +} + +/** + * A live bridge connection: one QUIC bidi stream over the relay. Sending queues + * bytes for the write task; the receive half is exposed once as a JS + * `ReadableStream` of `Uint8Array` chunks. + */ +export class IrohConnection { + private constructor(); + free(): void; + [Symbol.dispose](): void; + /** + * Close the connection: stop the outbound queue (finishing the send half) + * and close the QUIC connection. + */ + close(): void; + /** + * The receive half as a `ReadableStream`. Consumed once — the JS + * transport reads it for the lifetime of the session. + */ + readable(): ReadableStream; + /** + * Queue `data` to be written to the bidi stream. Resolves once enqueued + * (the write task drains it); rejects if the connection is already closed. + */ + send(data: Uint8Array): Promise; +} + +/** + * Installs a panic hook that surfaces Rust panics as readable console errors. + */ +export function start(): void; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_irohclient_free: (a: number, b: number) => void; + readonly __wbg_irohconnection_free: (a: number, b: number) => void; + readonly irohclient_connect: (a: number, b: number, c: number, d: number, e: number) => number; + readonly irohclient_create: (a: number, b: number) => number; + readonly irohclient_nodeId: (a: number, b: number) => void; + readonly irohclient_secretKeyHex: (a: number, b: number) => void; + readonly irohconnection_close: (a: number) => void; + readonly irohconnection_readable: (a: number, b: number) => void; + readonly irohconnection_send: (a: number, b: number, c: number) => number; + readonly start: () => void; + readonly __wbg_intounderlyingsource_free: (a: number, b: number) => void; + readonly intounderlyingsource_cancel: (a: number) => void; + readonly intounderlyingsource_pull: (a: number, b: number) => number; + readonly __wbg_intounderlyingsink_free: (a: number, b: number) => void; + readonly intounderlyingsink_abort: (a: number, b: number) => number; + readonly intounderlyingsink_close: (a: number) => number; + readonly intounderlyingsink_write: (a: number, b: number) => number; + readonly __wbg_intounderlyingbytesource_free: (a: number, b: number) => void; + readonly intounderlyingbytesource_autoAllocateChunkSize: (a: number) => number; + readonly intounderlyingbytesource_cancel: (a: number) => void; + readonly intounderlyingbytesource_pull: (a: number, b: number) => number; + readonly intounderlyingbytesource_start: (a: number, b: number) => void; + readonly intounderlyingbytesource_type: (a: number) => number; + readonly ring_core_0_17_14__bn_mul_mont: (a: number, b: number, c: number, d: number, e: number, f: number) => void; + readonly __wasm_bindgen_func_elem_16128: (a: number, b: number, c: number, d: number) => void; + readonly __wasm_bindgen_func_elem_16112: (a: number, b: number, c: number, d: number) => void; + readonly __wasm_bindgen_func_elem_5292: (a: number, b: number, c: number) => void; + readonly __wasm_bindgen_func_elem_2968: (a: number, b: number, c: number) => void; + readonly __wasm_bindgen_func_elem_7152: (a: number, b: number, c: number) => void; + readonly __wasm_bindgen_func_elem_5123: (a: number, b: number) => void; + readonly __wasm_bindgen_func_elem_6276: (a: number, b: number) => void; + readonly __wasm_bindgen_func_elem_6410: (a: number, b: number) => void; + readonly __wasm_bindgen_func_elem_14796: (a: number, b: number) => void; + readonly __wbindgen_export: (a: number, b: number) => number; + readonly __wbindgen_export2: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_export3: (a: number) => void; + readonly __wbindgen_export4: (a: number, b: number, c: number) => void; + readonly __wbindgen_export5: (a: number, b: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; + +/** + * Instantiates the given `module`, which can either be bytes or + * a precompiled `WebAssembly.Module`. + * + * @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. + * + * @returns {InitOutput} + */ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** + * If `module_or_path` is {RequestInfo} or {URL}, makes a request and + * for everything else, calls `WebAssembly.instantiate` directly. + * + * @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. + * + * @returns {Promise} + */ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/src/acp/iroh/pkg/thunderbolt_acp_client.js b/src/acp/iroh/pkg/thunderbolt_acp_client.js new file mode 100644 index 000000000..da1b3ee41 --- /dev/null +++ b/src/acp/iroh/pkg/thunderbolt_acp_client.js @@ -0,0 +1,1320 @@ +/* @ts-self-types="./thunderbolt_acp_client.d.ts" */ + +export class IntoUnderlyingByteSource { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + IntoUnderlyingByteSourceFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_intounderlyingbytesource_free(ptr, 0); + } + /** + * @returns {number} + */ + get autoAllocateChunkSize() { + const ret = wasm.intounderlyingbytesource_autoAllocateChunkSize(this.__wbg_ptr); + return ret >>> 0; + } + cancel() { + const ptr = this.__destroy_into_raw(); + wasm.intounderlyingbytesource_cancel(ptr); + } + /** + * @param {ReadableByteStreamController} controller + * @returns {Promise} + */ + pull(controller) { + const ret = wasm.intounderlyingbytesource_pull(this.__wbg_ptr, addHeapObject(controller)); + return takeObject(ret); + } + /** + * @param {ReadableByteStreamController} controller + */ + start(controller) { + wasm.intounderlyingbytesource_start(this.__wbg_ptr, addHeapObject(controller)); + } + /** + * @returns {ReadableStreamType} + */ + get type() { + const ret = wasm.intounderlyingbytesource_type(this.__wbg_ptr); + return __wbindgen_enum_ReadableStreamType[ret]; + } +} +if (Symbol.dispose) IntoUnderlyingByteSource.prototype[Symbol.dispose] = IntoUnderlyingByteSource.prototype.free; + +export class IntoUnderlyingSink { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + IntoUnderlyingSinkFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_intounderlyingsink_free(ptr, 0); + } + /** + * @param {any} reason + * @returns {Promise} + */ + abort(reason) { + const ptr = this.__destroy_into_raw(); + const ret = wasm.intounderlyingsink_abort(ptr, addHeapObject(reason)); + return takeObject(ret); + } + /** + * @returns {Promise} + */ + close() { + const ptr = this.__destroy_into_raw(); + const ret = wasm.intounderlyingsink_close(ptr); + return takeObject(ret); + } + /** + * @param {any} chunk + * @returns {Promise} + */ + write(chunk) { + const ret = wasm.intounderlyingsink_write(this.__wbg_ptr, addHeapObject(chunk)); + return takeObject(ret); + } +} +if (Symbol.dispose) IntoUnderlyingSink.prototype[Symbol.dispose] = IntoUnderlyingSink.prototype.free; + +export class IntoUnderlyingSource { + static __wrap(ptr) { + const obj = Object.create(IntoUnderlyingSource.prototype); + obj.__wbg_ptr = ptr; + IntoUnderlyingSourceFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + IntoUnderlyingSourceFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_intounderlyingsource_free(ptr, 0); + } + cancel() { + const ptr = this.__destroy_into_raw(); + wasm.intounderlyingsource_cancel(ptr); + } + /** + * @param {ReadableStreamDefaultController} controller + * @returns {Promise} + */ + pull(controller) { + const ret = wasm.intounderlyingsource_pull(this.__wbg_ptr, addHeapObject(controller)); + return takeObject(ret); + } +} +if (Symbol.dispose) IntoUnderlyingSource.prototype[Symbol.dispose] = IntoUnderlyingSource.prototype.free; + +/** + * One long-lived relay-only iroh endpoint. Hold a single instance for the app's + * lifetime and open a connection per bridge — re-binding per dial would churn + * the relay handshake and the NodeId. + */ +export class IrohClient { + static __wrap(ptr) { + const obj = Object.create(IrohClient.prototype); + obj.__wbg_ptr = ptr; + IrohClientFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + IrohClientFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_irohclient_free(ptr, 0); + } + /** + * Dial `target` (an `EndpointTicket` or a bare NodeId) over `alpn`, open ONE + * bidirectional stream, and resolve to an [`IrohConnection`]. + * + * Returns a `Promise` (rather than an `async fn` borrowing `&self`) so the + * endpoint is cloned out synchronously and the future owns it. + * @param {string} target + * @param {string} alpn + * @returns {Promise} + */ + connect(target, alpn) { + const ptr0 = passStringToWasm0(target, wasm.__wbindgen_export, wasm.__wbindgen_export2); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(alpn, wasm.__wbindgen_export, wasm.__wbindgen_export2); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.irohclient_connect(this.__wbg_ptr, ptr0, len0, ptr1, len1); + return takeObject(ret); + } + /** + * Bind the relay-only endpoint and wait until a home relay is usable. + * + * Pass a 32-byte hex secret key to pin a stable NodeId (so the bridge + * operator runs `thunderbolt iroh allow ` only once); pass `null` + * to generate a fresh identity, then read it back via + * [`IrohClient::secret_key_hex`] to persist for next session. + * @param {string | null} [secret_key_hex] + * @returns {Promise} + */ + static create(secret_key_hex) { + var ptr0 = isLikeNone(secret_key_hex) ? 0 : passStringToWasm0(secret_key_hex, wasm.__wbindgen_export, wasm.__wbindgen_export2); + var len0 = WASM_VECTOR_LEN; + const ret = wasm.irohclient_create(ptr0, len0); + return takeObject(ret); + } + /** + * This client's NodeId (base32). The bridge operator allowlists it with + * `thunderbolt iroh allow `. + * @returns {string} + */ + nodeId() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.irohclient_nodeId(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_export4(deferred1_0, deferred1_1, 1); + } + } + /** + * This client's secret key as hex, so the app can persist it and re-create + * the SAME NodeId next session. + * @returns {string} + */ + secretKeyHex() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.irohclient_secretKeyHex(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_export4(deferred1_0, deferred1_1, 1); + } + } +} +if (Symbol.dispose) IrohClient.prototype[Symbol.dispose] = IrohClient.prototype.free; + +/** + * A live bridge connection: one QUIC bidi stream over the relay. Sending queues + * bytes for the write task; the receive half is exposed once as a JS + * `ReadableStream` of `Uint8Array` chunks. + */ +export class IrohConnection { + static __wrap(ptr) { + const obj = Object.create(IrohConnection.prototype); + obj.__wbg_ptr = ptr; + IrohConnectionFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + IrohConnectionFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_irohconnection_free(ptr, 0); + } + /** + * Close the connection: stop the outbound queue (finishing the send half) + * and close the QUIC connection. + */ + close() { + wasm.irohconnection_close(this.__wbg_ptr); + } + /** + * The receive half as a `ReadableStream`. Consumed once — the JS + * transport reads it for the lifetime of the session. + * @returns {ReadableStream} + */ + readable() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.irohconnection_readable(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Queue `data` to be written to the bidi stream. Resolves once enqueued + * (the write task drains it); rejects if the connection is already closed. + * @param {Uint8Array} data + * @returns {Promise} + */ + send(data) { + const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_export); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.irohconnection_send(this.__wbg_ptr, ptr0, len0); + return takeObject(ret); + } +} +if (Symbol.dispose) IrohConnection.prototype[Symbol.dispose] = IrohConnection.prototype.free; + +/** + * Installs a panic hook that surfaces Rust panics as readable console errors. + */ +export function start() { + wasm.start(); +} +function __wbg_get_imports() { + const import0 = { + __proto__: null, + __wbg_Error_92b29b0548f8b746: function(arg0, arg1) { + const ret = Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, + __wbg___wbindgen_boolean_get_fa956cfa2d1bd751: function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? v : undefined; + return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0; + }, + __wbg___wbindgen_debug_string_c25d447a39f5578f: function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbg___wbindgen_is_function_1ff95bcc5517c252: function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }, + __wbg___wbindgen_is_object_a27215656b807791: function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }, + __wbg___wbindgen_is_string_ea5e6cc2e4141dfe: function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }, + __wbg___wbindgen_is_undefined_c05833b95a3cf397: function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }, + __wbg___wbindgen_string_get_b0ca35b86a603356: function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbg___wbindgen_throw_344f42d3211c4765: function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }, + __wbg__wbg_cb_unref_fffb441def202758: function(arg0) { + getObject(arg0)._wbg_cb_unref(); + }, + __wbg_abort_8bae0f33e7833997: function(arg0) { + getObject(arg0).abort(); + }, + __wbg_abort_eee9248a6d680839: function(arg0, arg1) { + getObject(arg0).abort(getObject(arg1)); + }, + __wbg_addEventListener_c33b246adf950d7c: function() { return handleError(function (arg0, arg1, arg2, arg3) { + getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3)); + }, arguments); }, + __wbg_append_01c74e5c6b58aa64: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).append(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); + }, arguments); }, + __wbg_arrayBuffer_3b637f0fa65c5351: function() { return handleError(function (arg0) { + const ret = getObject(arg0).arrayBuffer(); + return addHeapObject(ret); + }, arguments); }, + __wbg_body_18c9f2ac15ead4b2: function(arg0) { + const ret = getObject(arg0).body; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_buffer_54b87055582c8a81: function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }, + __wbg_byobRequest_06b654bb15590436: function(arg0) { + const ret = getObject(arg0).byobRequest; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_byteLength_41862ca4020b9c43: function(arg0) { + const ret = getObject(arg0).byteLength; + return ret; + }, + __wbg_byteOffset_d42e18c4441f628b: function(arg0) { + const ret = getObject(arg0).byteOffset; + return ret; + }, + __wbg_call_a6e5c5dce5018821: function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments); }, + __wbg_cancel_3983a93e24cc66b3: function(arg0) { + const ret = getObject(arg0).cancel(); + return addHeapObject(ret); + }, + __wbg_catch_c1a60df4c30d76d3: function(arg0, arg1) { + const ret = getObject(arg0).catch(getObject(arg1)); + return addHeapObject(ret); + }, + __wbg_clearTimeout_333bba87532ab9d3: function(arg0) { + const ret = clearTimeout(takeObject(arg0)); + return addHeapObject(ret); + }, + __wbg_clearTimeout_47a40e3be01ed7a3: function() { return handleError(function (arg0, arg1) { + getObject(arg0).clearTimeout(takeObject(arg1)); + }, arguments); }, + __wbg_close_249a23304523681b: function() { return handleError(function (arg0) { + getObject(arg0).close(); + }, arguments); }, + __wbg_close_72d318d9c16e83ef: function() { return handleError(function (arg0) { + getObject(arg0).close(); + }, arguments); }, + __wbg_close_c65ca0257e895318: function() { return handleError(function (arg0) { + getObject(arg0).close(); + }, arguments); }, + __wbg_code_1fc52b4142a112ac: function(arg0) { + const ret = getObject(arg0).code; + return ret; + }, + __wbg_code_cb4327cfc515673b: function(arg0) { + const ret = getObject(arg0).code; + return ret; + }, + __wbg_crypto_38df2bab126b63dc: function(arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); + }, + __wbg_data_328de4280640da92: function(arg0) { + const ret = getObject(arg0).data; + return addHeapObject(ret); + }, + __wbg_done_89b2b13e91a60321: function(arg0) { + const ret = getObject(arg0).done; + return ret; + }, + __wbg_enqueue_6d83b4c6281bafd6: function() { return handleError(function (arg0, arg1) { + getObject(arg0).enqueue(getObject(arg1)); + }, arguments); }, + __wbg_entries_900cefd6f70eb290: function(arg0) { + const ret = getObject(arg0).entries(); + return addHeapObject(ret); + }, + __wbg_error_a6fa202b58aa1cd3: function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_export4(deferred0_0, deferred0_1, 1); + } + }, + __wbg_fetch_074561c3e313c86f: function(arg0) { + const ret = fetch(getObject(arg0)); + return addHeapObject(ret); + }, + __wbg_fetch_b5951fc96f52f786: function(arg0, arg1) { + const ret = getObject(arg0).fetch(getObject(arg1)); + return addHeapObject(ret); + }, + __wbg_getRandomValues_c44a50d8cfdaebeb: function() { return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); + }, arguments); }, + __wbg_getRandomValues_cc7f052a444bb2ce: function() { return handleError(function (arg0, arg1) { + globalThis.crypto.getRandomValues(getArrayU8FromWasm0(arg0, arg1)); + }, arguments); }, + __wbg_getReader_9facd4f899beac89: function() { return handleError(function (arg0) { + const ret = getObject(arg0).getReader(); + return addHeapObject(ret); + }, arguments); }, + __wbg_get_507a50627bffa49b: function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }, + __wbg_get_78f252d074a84d0b: function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments); }, + __wbg_get_done_670108eb06ecbe46: function(arg0) { + const ret = getObject(arg0).done; + return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0; + }, + __wbg_get_value_f465f5be30aa0963: function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }, + __wbg_has_8374cf06984d8bfc: function() { return handleError(function (arg0, arg1) { + const ret = Reflect.has(getObject(arg0), getObject(arg1)); + return ret; + }, arguments); }, + __wbg_headers_cf9c80f30e2a4eff: function(arg0) { + const ret = getObject(arg0).headers; + return addHeapObject(ret); + }, + __wbg_instanceof_ArrayBuffer_4480b9e0068a8adb: function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }, + __wbg_instanceof_Blob_c6523f92a32c8695: function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Blob; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }, + __wbg_instanceof_Response_c8b64b2256f01bec: function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Response; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }, + __wbg_irohclient_new: function(arg0) { + const ret = IrohClient.__wrap(arg0); + return addHeapObject(ret); + }, + __wbg_irohconnection_new: function(arg0) { + const ret = IrohConnection.__wrap(arg0); + return addHeapObject(ret); + }, + __wbg_isArray_0677c962b281d01a: function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }, + __wbg_length_1f0964f4a5e2c6d8: function(arg0) { + const ret = getObject(arg0).length; + return ret; + }, + __wbg_message_fb0e6e7854e6ea7a: function(arg0, arg1) { + const ret = getObject(arg1).message; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbg_msCrypto_bd5a034af96bcba6: function(arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); + }, + __wbg_new_0d809930cd1354c6: function() { return handleError(function () { + const ret = new Headers(); + return addHeapObject(ret); + }, arguments); }, + __wbg_new_227d7c05414eb861: function() { + const ret = new Error(); + return addHeapObject(ret); + }, + __wbg_new_32b398fb48b6d94a: function() { + const ret = new Array(); + return addHeapObject(ret); + }, + __wbg_new_4339b2a2675a03e3: function() { return handleError(function () { + const ret = new AbortController(); + return addHeapObject(ret); + }, arguments); }, + __wbg_new_b667d279fd5aa943: function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, + __wbg_new_bf8729ffe10e9ee7: function() { return handleError(function (arg0, arg1) { + const ret = new WebSocket(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, arguments); }, + __wbg_new_cd45aabdf6073e84: function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }, + __wbg_new_da52cf8fe3429cb2: function() { + const ret = new Object(); + return addHeapObject(ret); + }, + __wbg_new_from_slice_77cdfb7977362f3c: function(arg0, arg1) { + const ret = new Uint8Array(getArrayU8FromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, + __wbg_new_typed_1824d93f294193e5: function(arg0, arg1) { + try { + var state0 = {a: arg0, b: arg1}; + var cb0 = (arg0, arg1) => { + const a = state0.a; + state0.a = 0; + try { + return __wasm_bindgen_func_elem_16112(a, state0.b, arg0, arg1); + } finally { + state0.a = a; + } + }; + const ret = new Promise(cb0); + return addHeapObject(ret); + } finally { + state0.a = 0; + } + }, + __wbg_new_with_byte_offset_and_length_54c7724ee3ec7d82: function(arg0, arg1, arg2) { + const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }, + __wbg_new_with_into_underlying_source_fd904252f385f59c: function(arg0, arg1) { + const ret = new ReadableStream(IntoUnderlyingSource.__wrap(arg0), takeObject(arg1)); + return addHeapObject(ret); + }, + __wbg_new_with_length_e6785c33c8e4cce8: function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); + }, + __wbg_new_with_str_and_init_d95cbe11ce28e65e: function() { return handleError(function (arg0, arg1, arg2) { + const ret = new Request(getStringFromWasm0(arg0, arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments); }, + __wbg_new_with_str_sequence_2de2f569c29910ad: function() { return handleError(function (arg0, arg1, arg2) { + const ret = new WebSocket(getStringFromWasm0(arg0, arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments); }, + __wbg_next_71f2aa1cb3d1e37e: function() { return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments); }, + __wbg_node_84ea875411254db1: function(arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); + }, + __wbg_now_86c0d4ba3fa605b8: function() { + const ret = Date.now(); + return ret; + }, + __wbg_now_e7c6795a7f81e10f: function(arg0) { + const ret = getObject(arg0).now(); + return ret; + }, + __wbg_performance_3fcf6e32a7e1ed0a: function(arg0) { + const ret = getObject(arg0).performance; + return addHeapObject(ret); + }, + __wbg_process_44c7a14e11e9f69e: function(arg0) { + const ret = getObject(arg0).process; + return addHeapObject(ret); + }, + __wbg_protocol_14b3b1c4bf71cd4a: function(arg0, arg1) { + const ret = getObject(arg1).protocol; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbg_prototypesetcall_4770620bbe4688a0: function(arg0, arg1, arg2) { + Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), getObject(arg2)); + }, + __wbg_push_d2ae3af0c1217ae6: function(arg0, arg1) { + const ret = getObject(arg0).push(getObject(arg1)); + return ret; + }, + __wbg_queueMicrotask_0ab5b2d2393e99b9: function(arg0) { + const ret = getObject(arg0).queueMicrotask; + return addHeapObject(ret); + }, + __wbg_queueMicrotask_6a09b7bc46549209: function(arg0) { + queueMicrotask(getObject(arg0)); + }, + __wbg_randomFillSync_6c25eac9869eb53c: function() { return handleError(function (arg0, arg1) { + getObject(arg0).randomFillSync(takeObject(arg1)); + }, arguments); }, + __wbg_read_8afa15f12a160ef8: function(arg0) { + const ret = getObject(arg0).read(); + return addHeapObject(ret); + }, + __wbg_readyState_50bc38c2a9e83db6: function(arg0) { + const ret = getObject(arg0).readyState; + return ret; + }, + __wbg_reason_5dc8e429d537d6a9: function(arg0, arg1) { + const ret = getObject(arg1).reason; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbg_releaseLock_5b92874cad775644: function(arg0) { + getObject(arg0).releaseLock(); + }, + __wbg_removeEventListener_eb8291c80ca9056d: function() { return handleError(function (arg0, arg1, arg2, arg3) { + getObject(arg0).removeEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3)); + }, arguments); }, + __wbg_require_b4edbdcf3e2a1ef0: function() { return handleError(function () { + const ret = module.require; + return addHeapObject(ret); + }, arguments); }, + __wbg_resolve_2191a4dfe481c25b: function(arg0) { + const ret = Promise.resolve(getObject(arg0)); + return addHeapObject(ret); + }, + __wbg_respond_510e32df8aeb6817: function() { return handleError(function (arg0, arg1) { + getObject(arg0).respond(arg1 >>> 0); + }, arguments); }, + __wbg_send_a321b376d40ec867: function() { return handleError(function (arg0, arg1, arg2) { + getObject(arg0).send(getArrayU8FromWasm0(arg1, arg2)); + }, arguments); }, + __wbg_send_df98dd5ede9b3f4d: function() { return handleError(function (arg0, arg1, arg2) { + getObject(arg0).send(getStringFromWasm0(arg1, arg2)); + }, arguments); }, + __wbg_setTimeout_3a808dd861dd3c12: function(arg0, arg1) { + const ret = setTimeout(getObject(arg0), arg1); + return addHeapObject(ret); + }, + __wbg_setTimeout_6613a51400c1bf9f: function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).setTimeout(takeObject(arg1), arg2); + return addHeapObject(ret); + }, arguments); }, + __wbg_set_4d7dd76f3dae2926: function(arg0, arg1, arg2) { + getObject(arg0).set(getArrayU8FromWasm0(arg1, arg2)); + }, + __wbg_set_binaryType_a37b086c78ca7c29: function(arg0, arg1) { + getObject(arg0).binaryType = __wbindgen_enum_BinaryType[arg1]; + }, + __wbg_set_body_029f2d171e0a005f: function(arg0, arg1) { + getObject(arg0).body = getObject(arg1); + }, + __wbg_set_cache_b4a740b195c051f4: function(arg0, arg1) { + getObject(arg0).cache = __wbindgen_enum_RequestCache[arg1]; + }, + __wbg_set_credentials_bb34a40189e3b43b: function(arg0, arg1) { + getObject(arg0).credentials = __wbindgen_enum_RequestCredentials[arg1]; + }, + __wbg_set_handle_event_dd6bc370a8cb4486: function(arg0, arg1) { + getObject(arg0).handleEvent = getObject(arg1); + }, + __wbg_set_headers_9c61d123c3ee1f10: function(arg0, arg1) { + getObject(arg0).headers = getObject(arg1); + }, + __wbg_set_high_water_mark_44d043cd607dd13a: function(arg0, arg1) { + getObject(arg0).highWaterMark = arg1; + }, + __wbg_set_method_5532d59b92d76467: function(arg0, arg1, arg2) { + getObject(arg0).method = getStringFromWasm0(arg1, arg2); + }, + __wbg_set_mode_66c79886ad78fc05: function(arg0, arg1) { + getObject(arg0).mode = __wbindgen_enum_RequestMode[arg1]; + }, + __wbg_set_onclose_f706475385ecce07: function(arg0, arg1) { + getObject(arg0).onclose = getObject(arg1); + }, + __wbg_set_onerror_9f5773fd31512333: function(arg0, arg1) { + getObject(arg0).onerror = getObject(arg1); + }, + __wbg_set_onmessage_836d2f72130b4706: function(arg0, arg1) { + getObject(arg0).onmessage = getObject(arg1); + }, + __wbg_set_onopen_4f65470ae522a61a: function(arg0, arg1) { + getObject(arg0).onopen = getObject(arg1); + }, + __wbg_set_signal_c4ef8faddb4c1446: function(arg0, arg1) { + getObject(arg0).signal = getObject(arg1); + }, + __wbg_signal_dad7cb35193abd31: function(arg0) { + const ret = getObject(arg0).signal; + return addHeapObject(ret); + }, + __wbg_stack_3b0d974bbf31e44f: function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbg_static_accessor_GLOBAL_4ef717fb391d88b7: function() { + const ret = typeof global === 'undefined' ? null : global; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_static_accessor_GLOBAL_THIS_8d1badc68b5a74f4: function() { + const ret = typeof globalThis === 'undefined' ? null : globalThis; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_static_accessor_SELF_146583524fe1469b: function() { + const ret = typeof self === 'undefined' ? null : self; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_static_accessor_WINDOW_f2829a2234d7819e: function() { + const ret = typeof window === 'undefined' ? null : window; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_status_c45b3b9b3033184a: function(arg0) { + const ret = getObject(arg0).status; + return ret; + }, + __wbg_subarray_3ed232c8a6baee09: function(arg0, arg1, arg2) { + const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }, + __wbg_then_16d107c451e9905d: function(arg0, arg1, arg2) { + const ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, + __wbg_then_6ec10ae38b3e92f7: function(arg0, arg1) { + const ret = getObject(arg0).then(getObject(arg1)); + return addHeapObject(ret); + }, + __wbg_url_a410c0bec2fb1b2c: function(arg0, arg1) { + const ret = getObject(arg1).url; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbg_url_abdb8fb08377f8c0: function(arg0, arg1) { + const ret = getObject(arg1).url; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbg_value_a5d5488a9589444a: function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }, + __wbg_versions_276b2795b1c6a219: function(arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); + }, + __wbg_view_21f1d4a4f175dfa9: function(arg0) { + const ret = getObject(arg0).view; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_wasClean_3c7aa2335da09e74: function(arg0) { + const ret = getObject(arg0).wasClean; + return ret; + }, + __wbindgen_cast_0000000000000001: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 1581, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_5292); + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000002: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 3365, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_16128); + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000003: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("CloseEvent")], shim_idx: 1409, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_2968); + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000004: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("MessageEvent")], shim_idx: 2095, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_7152); + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000005: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 1510, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_5123); + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000006: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 1728, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_6276); + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000007: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 1772, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`. + const ret = makeClosure(arg0, arg1, __wasm_bindgen_func_elem_6410); + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000008: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 3341, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_14796); + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000009: function(arg0, arg1) { + // Cast intrinsic for `Ref(Slice(U8)) -> NamedExternref("Uint8Array")`. + const ret = getArrayU8FromWasm0(arg0, arg1); + return addHeapObject(ret); + }, + __wbindgen_cast_000000000000000a: function(arg0, arg1) { + // Cast intrinsic for `Ref(String) -> Externref`. + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }, + __wbindgen_object_clone_ref: function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }, + __wbindgen_object_drop_ref: function(arg0) { + takeObject(arg0); + }, + }; + return { + __proto__: null, + "./thunderbolt_acp_client_bg.js": import0, + }; +} + +function __wasm_bindgen_func_elem_5123(arg0, arg1) { + wasm.__wasm_bindgen_func_elem_5123(arg0, arg1); +} + +function __wasm_bindgen_func_elem_6276(arg0, arg1) { + wasm.__wasm_bindgen_func_elem_6276(arg0, arg1); +} + +function __wasm_bindgen_func_elem_6410(arg0, arg1) { + wasm.__wasm_bindgen_func_elem_6410(arg0, arg1); +} + +function __wasm_bindgen_func_elem_14796(arg0, arg1) { + wasm.__wasm_bindgen_func_elem_14796(arg0, arg1); +} + +function __wasm_bindgen_func_elem_5292(arg0, arg1, arg2) { + wasm.__wasm_bindgen_func_elem_5292(arg0, arg1, addHeapObject(arg2)); +} + +function __wasm_bindgen_func_elem_2968(arg0, arg1, arg2) { + wasm.__wasm_bindgen_func_elem_2968(arg0, arg1, addHeapObject(arg2)); +} + +function __wasm_bindgen_func_elem_7152(arg0, arg1, arg2) { + wasm.__wasm_bindgen_func_elem_7152(arg0, arg1, addHeapObject(arg2)); +} + +function __wasm_bindgen_func_elem_16128(arg0, arg1, arg2) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wasm_bindgen_func_elem_16128(retptr, arg0, arg1, addHeapObject(arg2)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +function __wasm_bindgen_func_elem_16112(arg0, arg1, arg2, arg3) { + wasm.__wasm_bindgen_func_elem_16112(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); +} + + +const __wbindgen_enum_BinaryType = ["blob", "arraybuffer"]; + + +const __wbindgen_enum_ReadableStreamType = ["bytes"]; + + +const __wbindgen_enum_RequestCache = ["default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached"]; + + +const __wbindgen_enum_RequestCredentials = ["omit", "same-origin", "include"]; + + +const __wbindgen_enum_RequestMode = ["same-origin", "no-cors", "cors", "navigate"]; +const IntoUnderlyingByteSourceFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_intounderlyingbytesource_free(ptr, 1)); +const IntoUnderlyingSinkFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_intounderlyingsink_free(ptr, 1)); +const IntoUnderlyingSourceFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_intounderlyingsource_free(ptr, 1)); +const IrohClientFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_irohclient_free(ptr, 1)); +const IrohConnectionFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_irohconnection_free(ptr, 1)); + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(state => wasm.__wbindgen_export5(state.a, state.b)); + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches && builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +function dropObject(idx) { + if (idx < 1028) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} + +let cachedDataViewMemory0 = null; +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function getStringFromWasm0(ptr, len) { + return decodeText(ptr >>> 0, len); +} + +let cachedUint8ArrayMemory0 = null; +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getObject(idx) { return heap[idx]; } + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_export3(addHeapObject(e)); + } +} + +let heap = new Array(1024).fill(undefined); +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function isLikeNone(x) { + return x === undefined || x === null; +} + +function makeClosure(arg0, arg1, f) { + const state = { a: arg0, b: arg1, cnt: 1 }; + const real = (...args) => { + + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + try { + return f(state.a, state.b, ...args); + } finally { + real._wbg_cb_unref(); + } + }; + real._wbg_cb_unref = () => { + if (--state.cnt === 0) { + wasm.__wbindgen_export5(state.a, state.b); + state.a = 0; + CLOSURE_DTORS.unregister(state); + } + }; + CLOSURE_DTORS.register(real, state, state); + return real; +} + +function makeMutClosure(arg0, arg1, f) { + const state = { a: arg0, b: arg1, cnt: 1 }; + const real = (...args) => { + + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + state.a = a; + real._wbg_cb_unref(); + } + }; + real._wbg_cb_unref = () => { + if (--state.cnt === 0) { + wasm.__wbindgen_export5(state.a, state.b); + state.a = 0; + CLOSURE_DTORS.unregister(state); + } + }; + CLOSURE_DTORS.register(real, state, state); + return real; +} + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = cachedTextEncoder.encodeInto(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); +cachedTextDecoder.decode(); +const MAX_SAFARI_DECODE_BYTES = 2146435072; +let numBytesDecoded = 0; +function decodeText(ptr, len) { + numBytesDecoded += len; + if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) { + cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + cachedTextDecoder.decode(); + numBytesDecoded = len; + } + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const cachedTextEncoder = new TextEncoder(); + +if (!('encodeInto' in cachedTextEncoder)) { + cachedTextEncoder.encodeInto = function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; + }; +} + +let WASM_VECTOR_LEN = 0; + +let wasmModule, wasmInstance, wasm; +function __wbg_finalize_init(instance, module) { + wasmInstance = instance; + wasm = instance.exports; + wasmModule = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + wasm.__wbindgen_start(); + return wasm; +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + } catch (e) { + const validResponse = module.ok && expectedResponseType(module.type); + + if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { throw e; } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + } else { + return instance; + } + } + + function expectedResponseType(type) { + switch (type) { + case 'basic': case 'cors': case 'default': return true; + } + return false; + } +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (module !== undefined) { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + const instance = new WebAssembly.Instance(module, imports); + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (module_or_path !== undefined) { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (module_or_path === undefined) { + module_or_path = new URL('thunderbolt_acp_client_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync, __wbg_init as default }; diff --git a/src/acp/iroh/pkg/thunderbolt_acp_client_bg.wasm b/src/acp/iroh/pkg/thunderbolt_acp_client_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..5412c9c952250b95deeb36ecd9685eb567dcdb74 GIT binary patch literal 2585876 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
m$;v92*L+E@A(^L}l` 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%0A(=?A!0l_iOH&?+vX@wn!RLdQusdvBjc$$v?} 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ⅅ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 uj|7=Tw_1Ir=0BW9R=y4Fi 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

;;3Z|CM+mosK%j**8>Qw!O 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Ξn?$i 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

%_Aa$TFH|2#%h z2-27#4!}G_0F1>p2%XG7GZ}j46eBNuBg)7bc?>dh-APXXw9Tcad6}kolD(IZ zfw`3Y!y;RM2t%Cb8KUSOZ?nC_K!`b0)|`TJ#KEj=m0`~rouY28O_Z^(*N5+e&>#X; z4YxD{(QD|^SL^Q!y;nju$TRJNe1v%ytU4g3CJV{j3w)Ps$^u#a0+Udo+jf(04s6u3 z75e)E-{0=08BI-_?W z-qWrK{ymKVpUaNKH^3K9K^Uw`JBou%Y51NU6L^X$r)crQY2LMGPm53CGyNbWQ20zw zo>uAB=CkhTQ`GvtKkC$a;MLP=z2=Xeb**d6w}Bdf=P6fQ&{|9pU|k-e^*)yOm0n{( z*WNDC9fH3oh@WF+EHXf;s`=aW@7Vg5&hW8AoL#3i6GF(v0qEqykSni~iFzv-b;#edBCfeIsI1&t-?nl{t9`?~vZX)X1V%&uj&T%Epu%7Y<*#Q7)>hqo~~N%Zo-;PnzY6LA`^Ewu%p=*jb;p)ia(CX;(^b z#qola*kmK=i^LTyAoHpp<$*X5E&MCVDq5avVR{Sv2a)DFeyWs5##Bvj%}9p;+c&Er zBgU9M>8affQ}k+SJ_H&0?Ks@6RUgZ&d$`kBzVwL2#8ZTs5T^4XiO_MXW|6pSw-r%A zCSBx^HJ<(dvUlbIR#jKJKj++gt1fkK6$dD!6g1~vQ3?e?<3Jpe+Vv8LXOcFFvD1k$ zb0-1YZii0W{S;AAQBl#L;t+#VZ~#Svii!~x6%`c~6&19cQBjF;zy!_veQTd{>K5XV z^m~83N9o<`OnX>+?X}ikd+oKwQ(;f1{*4H^9Bk%=8Og(3bUn z>X->_@`gk}WlVTLodc#0BTWBMsJv}Zajo5j>71Zd`e(BiQwevgM}uYSn}8RF=9^N+ zRg(1S_GIvW`q|e)+_XhOhD1mFp~VSeUa~Gkmo) zfqsp^0*(&C6f;KOvE<~Pf`wbn_~LV5H(-O$NX*}w2#?IET$5sQGd256-w)&aQq5?l zqe9m*15r!?D}EFSbVWHj+&&V9!uU_D8xgpmhLGrtcI8X479J*jOhi&L)4nM1KCUWI z2u6PKS@=3VBQmpmF={K*f;WTlHre{uR1Ri_m?4=$;^zX%`A-y>!otb}!w-a>OWbCO7AGPsKJTGRxTM z%$Bj%(X}KU;w(n=5k!yH!8z}r{_${8Io&}9iS}O^Rqjec!31p3q+)xh5sJraI9|-I z5D|C*>Q4#UY{P|Kg2(g%nL*&f@`{&1>JD!DsuaugP@avtT(f<%=tB$OK(q(+aU|y!35Lc55=gKOH36YSlr76jbyDVQgu)U7#|%0L5311p|SG z8{Mo{i_wvEz_qwJEaP%zu}4ZKuAvuU#=}yonU+xv3QIE-B4QMi#BKulA^m*Dp5|4O zUdt#|b6?SbQI<|y$3DY>C;QtEJ_HY$H42yDxDnqxw99-8dWw} z^jYYpzxNQt;impo2@USSVPoBgTs;0xdWR{ZyF?dH>qkhDdOUUv{hbhDc$_!a#? z9kkIc0&ei@IC{gi0DZn9J@4~r|K5r$nfh?xUOIsv1Pr6fm$*)M`*VXOW2?eU)s-ee zd2WRso_q>F;)YaVH8&cna7ZH_ddC^+K4Y>i3Plg0TW|~+STtM)j&k-(36VP<`jN1a zU{ODW?xraZi=AMhI(b{MYVr~HpNW+#@_q1A+l5%@(#XN1mRE)Qq7UaNGbeqo|G&ln z&>}&-`8yg4-{6E3+))MU)M>KTni;%pnl=!KG8lm1#moJ>LrTe3;}Nw{7a!WraIIU^ zE$(d+$%JT|fl+cyuCT9pPMtoF7i~6YV!bSNn$;_;p0hB0lEH+%6^2Vsljezf%I8NN zx;GwdI0k|#kWj?4Ox~Nt(E+?zlOT;)29*dL z-s{hvH(=hlu|25#kPZT^I=%>$h2ra;SV6kb{;NaXq!|l3bi{EHKf~xy29h2`dhpVu z83jFw?1=^}CN$O{=oL)A(%34Mk0C-&fzzI#Qp4PAC89aprj|VfJWn??Hio4)Zq^MA z1gLWUt-v!L=11dzAZcrs1JApOpB8Ec5l-Um1|t0T+&RT7L7H&Z3+@=%_#g=SuHcSN zFVtoc)Wx=IH}dzvx)Fe_5P~0SVFi&7jrL?{xfy>;>F|I)yGQj6a#?&p_>ovIM#O7& z;7mtlhNv%^5^0_(J7nEYkF1#Zk3+s95)^WCGCw5kr$E6d$gk?Hvm$T{5-tNSw>uhd zv%F-t5hC%O?7)N(TM8F%e64eQd?TC0%nvPoP(y!ppcRHcx>9pl`Ce1MPP-xjN=m|2bjK^LguY}j7lb~T7r!{f{|==l!YLNRTc)#5lc5Ox-8GnGgttujkh5lY32nwcCfvyU##IGd22Tx* zW5V{5YpKYYya0=Zm46KV!sk5+Pg#mD_a<)XgCxS)Dgkr#BkF{p*WCepy>4v64S42S z!58bNl^gJJd*dnHNSWxm2bML`?=c(Zl6CGbc0}47r z84<&1cU{;J<0pO&T@}rvqR?4T(_9v38KTzz-h59iL}(Z(tVLjSqWJO6c#4mOUu5SV zBPl+GjjS42(i_l%iIop=F`yaVI|ovXpTkb!gSK!S44rzUFOO-G6{mr>tJA;~`|yXj zIa?Bo{Bh-2vc$_t+>Dp-bhpE9OhXbmqT6~-0L{Snm`5O#YJMeFje#Teu3}R9PZjA@ zgF>$wCs5f1F(RzY(ye6%)xg0SI?YUYFKL0diFdWC)o*u{4F#iqCfMr`+q6jAz3OC! z+h638w**GT*ln$!0wn$zf&+>uS(+_`pbOx$_!~cZOF<45Nr?{>Q?WGCl@?spR*U>yF9=xB#GZt00dPCyj0_xz1OfIDPFiG*_f8~ z1K*y&Ex-(bC-gyeZXA^0N)ZY@1H3VU%6wYg?hS$g?Q?2994qW za#25iUf-FUI>q5uT#P?RxM0om4c%nn-BR{f#&?e32Eyk}JwV&_Ko6|TzI(ot+iM!H z*iLP_iDMz%zjG>1cN6mUbdZV>tH21NsiI|^%=a*ngQ#X0u?;4OXIW@g?A58XZ#5hd z7xgHX_{2Lj7^TH{32qZNMv6bo<;UsT<`3x}-us0PgeM*6FS}43DV!TJK#_E$k^30I z66K2P7X5<{@s!TTS(Ma6Fo)tOZ+>(!2`uVRFVq+V&_JEhBXU-rD9qfA;tRK;er)7U zw-?C(z;vBE2bvdvuphs(g+3=L4G#g}qIy>O1x#Gmpun=XX?%P?9w*#XCb;5=l_Pd# z@|A3+Tr4Kpwd6PX=hs3m6qsI1W=cgZR}K%NuEswJi5U?ql}$}yWCx$4f!vNHMj!FZ z)#tNQ{q}aRN^#m>{N5-?KsRqy?M4UZnq2Yf%jn=7g@2JCA%N!EEd)SazaLSlToKw@ z1=!9c6*rW0}s`XzQUyW1EEU+5Yf-3xxEfVx@%E|Yb`maI2Md>Mt92fx9an%5sz|@CmbS!V#xe>I^ z_>=O04jOLf;`h-g;wUMCVfob!_|9b!Ycqvzb48Tffk9V>l*PTTapDV!>Wvn$0P=rGB_NHWWn&?G~ky< z8j+oxLTG};!m%v!!eyCk2AJ9EsX4mnTcXNIVl3x7##R_#gd>5Q|11WkqeHir)XW%) z>8PQj8Qehn46mKg@8lgFz&x}!08H)@4zr*_h&wQnO7xLINuJbVjug;3zB9nz$4}Yy z1#>iB4I@~TADCi0jm3$jP+TD^F6-H>fWD=MBZKCK;`)E4;*9yv?bIl&XgtnbX)J$r z_{j$%+%q(y+2R)1jRmj*{I?y5FmAmA5ymmZH1d>M)Sr}98QB-Ptu+a1D4|H1_8tar zjeg#QXuy@~k)qOimSM%~`oZ=pZKvSK!5=K7a?)daDnC#852rs!Zx4(Wj!jay~e5`8X`p- z*I_9^25BQzOBfDx0Ly<`O|E*j)xwCQzU3O)Ke)BsQQj$&>hFej&lU`p8EuJs zny0~c_&^QRcePfS3c;UbAA%vJm_we3|5y#=m#;==+MJz5(u+A6%GC{abOLsHEE!0s zay)wwA62#S6~6fxu?>_BG?ZmyQ4bWkH7$~5y^&F;n3nc1)G)TDqMs-wLN+ZC?8Q>!*ZQs@fZ`AaZN>X<6b z08@cEvrX$mp}SlU`lYA5h3;BiHglOvlRJujC;M27AK^zkRLDPbyY)ORzHW0`Vm8Y& zYse?}?(Z?~hPvJCHr+W$NI;%8bh8#6#t#k_fA6RjATP{#+F2trD@KyDYo6jHmSoGb zGX`};9MkGp>-N2W+WHCOHQ&RiP((i(P~~SJOLZ}wB{B<23xrO+G z1jss#eu>Xifz%;0`MAZ;m|dDGT0d&2BQ*S|(Ka*)nPpQ5xd|#}jK=qkWwhXwfDK)v zphWwHJ?6ysh(X!XyiSv})8t>!I$D|b~d+M{m685=kWC^ zdH%}YN+vc%V55;LDMnX=^B8u0CHa)jGlXj7S9c60wzZN<&bJN+wjKiC>Ksnbz>p<- zen==DpS(16H>|5NA4;AxAUt)O36d)|N&?~bV3X4z1 ze~YqMY=j%ArBpk{{$RW}$B$ycdz}Z40g^;3#!pQR2ZLHRRDXJ9c5zWc>_74n&D7zk z215<_3F_&9Ih5~$uiFmFC{#Ak|Kvw8;A=S8=va_nGSSNiQ_niglZe5*ta7;YA6hN{G;V zv1SEyN8GcqZgDt>8=%F1V2C3TzGolD!7wjw!PlY;^tlDxaGmZ2-M1C~)swlgjXOWP zak%d}-$sVP`CFvITu9FpbcsrF1g*bk;*-z;@%3zKk8eZ26vXQuZyw@h>pW=NlmR{M z5L+(TNHML$Gd&v|@w)!;Z+DS6lNkZT+HD)?w+WHt&nCJ1}DPll18?PBe8*+Ki;k+sfGZqJWu(=NC1c zmCzlirGDbNg3|Y&Fdp|SYCNGf5KpzN6|vou&O{w+ZB!83I+d@pn^7b^fJ~7QSw&09 z07RX3#o)s*D!_4yErTY21~_8O*!`;e(!tP2>u4S~FQjf=U+0Zx_ql`BROP_wWcFtG zF>m(I-{i3S{7uWzp;t5=c1R`vk!zhS_PA8gL`m5;kES;7-9VE$h18lL{t&vp$SI>_ z#f_*T(C5IU9eue76eaDTULr^GL(*t}Xq@Cb=DRmYQvm2gd|;3Zlfiy*hUGk!y#(>a zQyIIKGN_@uCD?X?LKkmh-S0=OTK5JH4|9{21P6cR5N6rhoaFZ>tuOVa2 zJ8{N7WxbJzU`u3@u0SLD5ad?ze!jA})%T zS%4=8$4PO*_^>w*G()Vm6vLcdHU zmWIBLOTtvK;L+aR`{%%V|5lGnHAvPVsdi$|Ik`4R7X6j@Tfw64zZ5e12|B{JTv=Or23zmgko( zPpX9g8bhD?&#lF%d-Mi3XgW+ldg2Y1?Kn_H9=mEtO0VKa?E;(eb1ixz2PBg1#n0_? zDs1ocR$3J%Q~ed)&GbEQq=h`mDMHG)b9~Z2?`38>QX3OFU~+PX~$7 zfv<`$v>7sx^(mzSnvj>zMsnn8NC9{Fo)I})f7{>_iKad7HrG^7+O~O=p>HU~gAIY; z)?P~mF0*j?7RkFE9KO04gQqziJj#T|XQM{F#oQP~EpN8LCFWkRMv4uAvugZeyGBb& z=^y=EqZi7}>b-#i^hQBc9m%VhJP%jcS@7E#9ifg9eJlejd6OYL>u@@eshDs0MH`dH z`D6GwX`DXBxl624>&NOF)hlHRIZjnCq`D_WNTZ)On=#OK4sfWpHHV^GBh3%dDyCSO zS;zvbW;%<;JR5W3-*SebsR{Zif)v{*{k1UM!OHgu3 z)PRNRcMjwLtn3pDP7-Mh%YsK;$1}!xP4f{`WPgsy(5ogPxRlvm4VCW#356-Y!?+^1 zuMI_}Jl1CFbZQzFQG;W@@@HBnMhL1eWHS;ZDARR=gKWVSUo4>vS1ZO`y1a|RqZM2$ z6^k(&PE7++Zh<@gFFoQ>z#2QuyVOK`a-5!o4Nod{(V=EY;lb?Vf)A#~OxF2c>6A%S za*h)AQyqm8?LdyFZN)`;fSbS2#%mVFS@zMhg!q8_sZG0t`;t&L8Yi@Y5yUpmSNf}| zAq%{25k3{WRlb`m>3+U$h88Nt!s?Y<&@a%Q0-!^`C=wQJ40-2PT*o@_rGA&Pyt!8A z*YP|VMXa+Jrz(nhbbRV=mGp|Nb(L0QZIfHqq-vzst0K2LYPe<^w;*h|p3WiAR_*Nl z(5-HK-lNc2dSB<4;{+Uv{G%=~&q5Ytg3CI!Yf8^HOP$|EI^ddw6;x4ENOyyK?YL9) zMH}<}kRKjvw?D+q!mC7q?&4mJW!*k0# z!mz!nz829+21m%7rWOwKCMxVDzag5F77A!yfq|Ubhhd-9}q1i%wusXz1N#azM$EOg{gSffK!bEvBv zbqUtF=1MsyRuDs2&l%2;9hW}dvxW$9t2An8+=@D>l`@1+f#<)<32#KpR#J>l+pW^~ z{*v|YFMUlfx|vGKdLNxh`K;BAs++Q!#NakJ9XOu08;4=AlsFLh|7PBP*>br@x2p5xpQ2*0ck`p+=X>5v*!~LT8j(iH6juyht#i!?^V+Ll& zMrvOgx@C5qzMZ(?qJ8fVpe0Z1MH%R$Ph5FC|D!99paJ~z=_f5Yo)tFsu2|UUU^~hx zYWInFanr%hoFHu-q0>Qv8i!+tj)y_W8J^4d>dl~5?>d95G@@`#@eRY6_z|JfwE-r< z-nuBVz@A@R_S<^{cQsRtnfIm#taw_W%2_wgc;kL`?}=+jrs=22%_LDbis5=WB4bvU zdfi69wR*2!50e5lD8_HKh#EiYVUiS>zRD88$MmSkROE=c$ONgEGbyKRTfU?3P720Mj(Obw8_ z$m5U*wz`I}B!#o*X}?Zz?f+sLiXT8XHSW|aYJO-;1I%dSV;#N%o#Rq1#+Yd?WNlgi z{Z7R4BkRrSeo^|qh(8;f&s-+r!IEB1nsJEMB8zv|he_Z9ExBvjAhv|vC1<_fd3mQ) zCAKdyI@Aau+O{ex9F(sWAtO~Qg-b8*H8mhM< z`q9u#*UOYxXK^L|%Lpd4bb)3@A|Z7_b5hCU0KwE{bFw%<~So@@YVyf>%L)W*!*wCz>|`Uh~0d6EWUV%!o~9)04(AVyVS&uLN{{L<#T;fV6^4 z{+r{K4K@t)newuji3nb+yH$RW3s!HFvu=R*6LI9MO-W?PvBuUhG=&p5J4saOX&;3a z7M7jd=GzLgL+l}9_5gxFnz4uc znz|W#NT28Ip#%1Sh%zKsh6%NyJL?S0^i_9~lA=4FBt9cMpqg^lM)9vRJ&(&mpR28O z^&P3z^ygv1G)6T>8%bCT3SAMLMS>qR@j!h8@3nAt=q=ny0&HFy3{VjShKVlql#5)j zM^?cP&(S)9dtXVjdy7OB>~$6qXA?`%452fkznC}TCzzCQ)LSh65{(WXEy}qVkhzU# zI+2^{kA~=sW@Zk^d|+BN$YTyth#x|xdtCiI@B9*_Y4&RhWXFJlt~5^MIj9v^4VEk# zu-+=VWp`2WLfq3rM-8{J>mJvwD4wJZy68NMKSydh&yT%an3h_H%}`U<3b&@)?+mqy z)kSh=)WuPyBdQM<`Ors29f)CO{1wlzK(jTkGlg(VbaBaZtiWg&Ny^!1qBxuUCp?#c z>gX;BJ(M+@So$O1QsPlkhJ%3Qq)0r?WhbygaLwmz6lu;%vrYChR$0Gb0uRdvUyeJYZSMo4Y78BR ztwFssMs+GDqs5B0q4jf1y$hRlo!H3IQM^i%csli~GY$S| zu#j{zr`9`3C-GLnCGoEn$~!Voqftp`eC)8Oi(Z57C!vS=ql-GJoL?JrGtm;af^z0U zKFL<`8~Su%dhbE$a=tmA+>lPbe0=AG>8p}L;>-QmGJD9M!J#tMc=q)AW~te@r}_&u z81IFK1|zd473hmK^w}u7YLuK7ROZYQuyzrQB-5GNe64N`c_mCnYOrlJhY`{#XzMxk zrit}R_j&6cIwPEDnoD>rD$K*zEGbUZE5-WQIj9z;iTbiw-*!$NmOb%^di@CECA>cC z@t4DiN#%&{O{W}DAG%&H{kq$a*H_j0c5_&KC|iEz`se4=W8E&-x1UpQop^*wsn)+R zr#>*Lay4=X=01pBJrIaxoZ>b=GTB-$w%2zaKc~)$JCCRmWvLaQOAuF z>c7dvWUD##VF|V0l-r$i>YF7a=hQz(-G(2j&7TvA78&yd3D0kfwFT@Z$$;LFrkqo&RRYoqoOx1f*CVx?wC=y6^n+ z1NKRkOvq0t<%BZJbs)KpAlK}betG_tEdR=S`8TcCi>3UNerY!3M?;QCHa`L-D64NN z%deE>*W~NFetsWqSo&gly@H#3DMhuaKll|=)wWHNWMcBUq&D%0BO#==q+?=IKa#Vl zK&dKZRV!_v#Z6fao3a{~eGRMY6;F$E3}@f<~8f3{Z?Zqt-ZMu_mJENs4u`V ztEL;1RlV(qBU#W>&Lu0W>T~R+cArnFH=pgvr^pv%rfT&UepJhppi5S6vG;uh8>piP z1~RVKf4D0T%X&C`0}oLPlByn7Ht_JvJhYB&%O8^Y7m=G(uebC)5v!8asO|MmH+A~c zL3|#XUlQ&BhbnfTdio#M1rw!YRO@h}QupI;th*3yY+47rs-^qrtM9u{yo5Wkar*9C zKD=&rdZ*nOd-vJbFI}TM#qKk1`tZqsz8P>NoRv?8)x`s=c`hS$GcoSkzkAVp(=O6y zTkGcV`bgf4yPukI_HPQ@ETwrREm`*P+?MW_p19^1WXy*mnOw#&s?)bwAI~I;r^7+( zjSAma&;m=|#`Rmfmn}MZxk{w{1G_Ic_gR`EHr>|!`V?_k_-}jnEvMd$kUFA1}R`SOJa@Kpy4o1XN@7B^1$i^m(4&rsTwBXDEdk+H>(a=Sqr zZd@-LFQr+Mx38^+Z`MuaycAAV$%oD-vGugP(t5~j$*VYkjI2?;EUTBTw`5GBC1VmL zU;p*<`)EVc7YD3YaLOOcSywdWT~W+&Ik@|dKQ5XvksfTz`e6{A;CnmS=*Xmh)*(5^ zZ`lAcJ}Q$2_{y(er(X70%&Jw+t2Ma$xfd@u%~vL?*1)V<8&NG!_Q}SoRz{FAKUicY!M+iu4$Q<#OvT;&D4&G5DRzf*YO`sHn}iF?NZz`v_nziv zGdVe7txk{BT*W3LnyYA9#9W2L9nvY=T8iDu-vZj&=1pg59c^Y|e6qD_!*SkL8_k9m z=VfT3#Nn`MEi{K(t|?Vst23>hmlZ6QOrW;>#@D>z&ZWL}y?0dah16SJ(6KYQ7ic3*aA~~HnftPmCs$_(P&K_a80nwPed=xe_4#lS_g2Pyr-{TLr)-uW# zGGanq?3}b0>R~)-l$kZP=_yF~)5I5xv8||)YO6oSDHC&-41-wl{)s$4dr59(4z&80o zCY@&5(}1w^oKpM}?pcHerg_z3pT?(eONm+?sC-*1%4{v8H>g<|2Su49RR|+lc;Q$Z zS@^KWh3rxWYY>1|-mrMGt5{YpGbPbFZ|ssW+XBY=&xv~UT!@k0!X8apxhQZ6dxjQy z-&*pOBgQVgVjxC!<%Xjc_Hb{Cv_*=*YNY)2fp*iFZLKVvvT?HVJws9w(s1fl^Z`Ao z;-MS`h&!976C!x9g-6IyY6c>!y)MZQvt4RSMoHHq3XNA&J|XYoVZC`%Da%`FL*Blw zAIaO71%cXfrgr>l(I@$)2%0g0gAkozK`Sg|8r@;UWoXck;*o1$U}e^uM)UM9Mf1aY zB5^GI>dC+7W?QWY=HpHst8v4q$>SQG_wrpqgG>9Ry396wz>pX#wnXO^>Os{lvDbx7 zHsk`wC$f?uo0ct)_lX~1Lo|0*Vb$^_av*jp&4P?me-ahp7h@u~sY;RoF$<)0=A*Z( z=pY-k+u#$u1 zXJ&s#Wk0d4Z^z1dhOF^@x`<&&-L=BbAXnAc;Q_Cu^va;r5)TLWz97teYfI1-^jFB2$-J^f-x87v&mb4kT>MIrI3VHK8k&7z)Udr7P_girM!QK5@MoYo?Y%`(8X%>;)p^W=_aZedFT z3})M;Qg&;HgKoJ@^7S7+PikH`RTa2eVR@(TRx?%z`0iGM?R`MZ6} zJ2C0qW)6al?m-OQbK7R!q3!#WWHxs$k&O1Esq=Z^Sri#82lN!$kL`LF%ZAd?OA6)g zz%z4TUhp{fULhDcLBXD|eA`$oRfFpecoZWP*J^RDt~$g>fXaGlU;4E~c(PF8$+SQk z+OdlILaQUZQ$eGm2+!VCT;<1p&8ML~Zr%#p7pBcsYK|g)2||Rc5o`!6Pz!1zp?b@3 zjg$#`0}}L-nI=Fk`M#Zpi?H2SpRtHD z|Gpw-Jl&@itU-P}qLvP$6|69-6|6UY)>bU;Tf`^!#dLz@{2hIvfiWbv{8*M{ z?Z6WYAq4{>cT+5r!UVTUPfr`6MQZu7q1nP-v^+}>n||pPm>>H>(CZBwsO9%=PBvn+ zz3q-?)OAtLre8u@URkO0I5^BWhs|SK^XZqEaS2{=E)~!!^n|<}(#*O{q{=VRZWC>|P`5Np5^7$ScDL+AHFG`wb}ujmwH z_@B4%l7lj6oyw-m%5Yv16n;h#deZ<^!RNjp%=tIilJHgKx+fh!_pETg4EV-S1P>cj zTfqh5i0%cc9}E=&v3_T})vX`Y`^X6Z0+-%(L+vIVsv2v| zO6^JLRAwWZC0K0jKU0E@AKPxuOVzOLLR5hO7lcIG7Omj*r}ktW2i+zgb>e3G-CnV!|OH) zOE65-oBRnwMuO}hj$a+-da!P%t9r2Yno^}KV=DTGaF-!opwUK0wrAgLdz6FOLX z8eC0X?8k-roRY;=aJd%>OP(|tB58m4abd5J5w8@wqAnM(`#PwB{hIt=HDENkF51=z znnw*GJSmQL45Jj#ruc$^(stP|uUg}ZWm;v?EnK&f+?ehq3Sv+o(?#6jb8Zn{#p}U( zxz?g06`qm?wJ<5BAbj%VCqcXc5Jxc-LK%U|&6N0~4o#XZ6g@ZPTFFAM7ywJv)WfLU zn5(b=;aauTE6}DI#7WS2UXdpR=X*e`!Tcbkor??;or~-}?YzH{plN@SEZCe@wjaES0^Om`f(f&Vb`18Iny?YFo8lsVM|0xy|2Hokci$boZB56h-u zGD#F9zWE9oAT6fRJfz4Pqbk|!h8y(~W!ih3(wDxedYPQJSdMfoy)QBsiVQmmLk(hZ z;1mb8p*R_uwE_9Zb0Y?GU8QMD5?||&>8|+LArK$~4at7Ly(+uShLOE)BfYAf_VEL} z8ZR1QW(S`?r3$a%Ax!C$;47T|dWbxE8JN1AJvF-b6STzJhZ58qC$C-JL-Es3B*Q?Z z;e7XW-fS7UfnY)eu9>o$8(EF$?)T5dW4vFycuO8lIU5*B>(-uy>-g`R-1PJ0Rn85Z z$tDAHFTPnShFJps)na0~RlmJEs6`SDQI`uf4S-N)xe88#-7VkoJL@C%B^ar}L#EsN zCVHqut-uJ!U`>fNI1_cWE>mxq3CQ|Jo=QPwWT0Mhs~1oyHeo24e2c-;l@z^?WPIjs zl>>6WuTax>!@sfx66x6d#9(l2*btJ;8e^lIq2LZbcs#XB3O3?QbY4wJ1mEy~?jzo_ zan3#j*DSRYEL&l2g}nELPjrWcIOr?j25nR?WX6xhdIi#mwZ+Wi*k^djyWHOx%Z4vsgFqjm;(M(lo|}xY8yk0Rds41zM8EMR5@jb%9YVZj;dB6es_Snh8;2YZ$W=k zNbf0;kM?SsLXt32w*wK9LU-`3Xkyyy(Jb<8i=u!|7ORmefauV!6x4TAW^+f!8?B-$ zB!wgD(SC=j@KVA;j$R^>p1^wEF=*rqZ$GOak)EAQZ|wP|t}YabrCp#QgyNu>`-KiF z1ywydgeIIMWggaH7}X|f&hIGGNg_S3R;0G9pJjmqv4EIfMe9WYnZXS9w{xKVHK-o# z3iu!oW*Cp!&)~SI&Ai?5DOY?X*~rl26q!0LrQj9a@fK>nL7UdsCR$9R356T&iYU#h zYtmHQYbedvqG@x9rat+#acmGX3;PijGl)8YGcnT>l?)MqmO)!!nFl44^{1 zkBW^iBDq;Eb(7GVzMz`xWz^PH4>`IvfxTvh4pP%lr;RNh_2(E^(CYTl{gIbYWx2dzTwfug_0ag-?mPtT-d*Ae2U{_&{MiYdD#(#Hf`q zl^&n1XhNUxG@tII0&@8yINq1sDkYN^DVCEv|2C4;5nMtetsH_KAwuOED%*ICMTr$b zo~IMqNepLZ8YsC(d-`V%;flM2@`{8$4+C*p`ic)bgw;yfA6fcQQ&`5>)YKJ8_eP3oa47njgPl z%g1IyQiIf93WG7);Bgmc4NSF%ALfPn0i=-%mX{4mY!OEz2je_^M*~rA&(`@yT-a>R zv^YS{0+&!K<74L_bi?c3@*-QmKiv%v0$5xDk>F?Gd5&9s|coI zp_i$?W&#@SCD#9mv#gUVv?0@-GRKE(kv z1sTR?XTyi<&?UO=-9jpqP*o5sN)|V>9b**bRifqhVmCriiFy|U=hSOm1gf&B4<-<27oX04{f4jE(k57N+-l2KvPZuLjnr;9a(}XtdcwA|xnoH6N?unC8|VjV)$7 zQ%HL^BlZrr_@vFCq!64DK2D03lvsqfbbt^33MU^Ewm`!LH)-yzM{&H!v;{})H8g&C z7e74c8VwK4Nx-t9D&>zLN>arHIM3o+V|do0K(iyEMAk&KD^SSrxYdqdrt`UFZ|Mz; z54360+yaI2;e@p48qy)PGeou{$#;q`3jrL(cW)`|6)46}K4dQD6R2v+>YgAz2Tunh zLrO;A)I-~wrkCR75;xX}{X)#@(xFX+ z@0Rz7A~!&oqw1ltvX2^A*iU!KW|E>9qr>>GTkGwy!nP@};6%L%ilp%2VbZTs(L>sN z{snggZnl0V>1UdL*8PT90yB2|=qn38^2(3;u45Z@L&5b@{Fm*G!)rtdfJJL$Qlx4E za>XD-EErL^B?XF6Mm2S}Q6cLsK|+l7Y}ii)&S*?MUNF?guKC0@6Qa%gsl1?NZIJ<@ z()+1E8!wDvL{uu@|7@NxG6<^1@hy}vI{2dBOAS7Y@v|eyy^j|RTGF#4{txB;yz0Jw z?$7(Wr@grP!Mo@-{Vdf_kA9Z$)6k2(uS{LK{woTuv3bS_*K@TnrrzsnF@FYAbVbj! ziHN&ZmqT>PziG!SJ?TVW$y6zT<&PUI&BYcW>X z6$;(n$o5H*7_7u=AH2ZH?+{evCkp>YL!z$6KXfM>1Dr6yzh)^Tre}R^Xj_?;bz*8Z z**Zjg@>toM#4@h!pF!u3lh2XeoMT&3^|<%NtHxCh*D$3zY!nicopB~dvgv3G-NR4d zAX)6BIp-WTP}7)1qG+=Oq7eaE!XdK2xm**yN-QgHBceiEhNE9uXS08g^?}OA;_!4F z-2PiQOmj}9BHd#8j=TTd2T=YLf`k$6xe7vi1$Qm%h;A_!c!n!eU^Mn+m9k?9`o zRAZh^_)IcLByi)4iTce9R2(0Y;;t4@=-V)UabtRmXT(&&&KO_Zsq-N+%>$Y0SlS>T zv;zY7{zDpwpw6V-CU-s|S2U#;hSKZ?-u4HaoPl3EVWrS7Jbx2vM(F6g~R1TyJ(?(td85hU)<84{obb zjS2L~Xnxc^sr+4@72-=bp==hX?lNr-P0)ok0vWh3Nn{r2g%)D9Ag1}6z}qgeNCZ45 zOV*eKU~Q*?MP4N#14Xz>1KP*DVa5h_fX+#xIo-+elSMyG&~<#pNK)%u8NKLLc3R4) z0Ah@IxtU$dCS(B;0yls5BXANS6ZC;f&j5d(jS4!cD0zuquG;t+t$Lo0qP6d}aQuU_ zLs)$w@uS0J=P9d~bXFOtkR1jcF`eI~ld#+_mkkkmCn8ss5$x&LbB5Kq+}D4pZLJId zbqedM{PSmoX%KTC-oja{c5*pLH9aTO&sk!;sK_{py0SlKBpomZNLhK5v2tj&jdu&h zpm)jD*^;Ebg_c!LCdg!rp!;+VhIt{Xqd*B~_dy~3#VpRQ0jWd0Of)@I^BekF*@W40 zKvuE8KlPq$8f$HvQ!h!Q=5oK5O0~7Ee>`B|p!UHV4e8i;lcB>l-Hd&P_021;rOHox zwO(<9tF?;TsG3yVX4TJCTxWH&iW^zowBoj^4y(AWt3xYpRCSYz8(rPF;A zkct~y-KgTWtq!iZ?W*k+_xb9eirck1u;T6tssk$S?w}f1aKNs@W*!TwZ58)qP;ITa z7lLZF;$9D`969|)P;IHWH-le~Is5V#JTY&;4{wYw1>bC>Ms9r1oUiZFP zEhDT(iDss-gB;IZHy0xo2|>+_*Z9rtvl}M7t9HX3yYNv+iOxwyGVm+gHw0tx^B=R< zJu=7*^Yb4qGY&JdcY{s;bXU(>rg5V%QbqxaFi@(~{g59O3z;x`9bXe-PX>K=zNa=D z*JgZF^AQ;jmw3Jdl&yVSeAPl_fF|fq(6m|o;^Q#5Y;GDVd<6edabOdUa@K92Hyior zs@`s5oU^V8B!k&TiXT!S#Pa}3$3ANfa-bN4uWY@hN8m882GK8kOUsT=geUH>ei5d6zv3 z+w-GA@zStuPG~DcK^RorvTJF0r(1Uec9siu`f$t#i!av)vcVYkU^g~iU_ex3B=K$JISo{}Vc)`aAAr4c2J+l|j%I(DUBXT4 zah<==`f6=Cmww6WMwpBRtFMfoKDP4OR~=1A&fSs|OD=tA|H)U#o{g zpS!T8lTy6n39akv^uqR_UMClKa{(Mf5bJruM6SW}#SKp1$-Q5^TPY`xh&5mbR*-kp zeI|cZExCwzJfUE{krx*Yu=%SSv~vLGO1sonce#=h&qUX_7vyfs+uGNlDFELICFCei z4t6&9jwhBe9bcd*x2CYWm5Bmq$|vt@(t!R6B;C+!Y2*b%TBDAqzwO8n12kfLgW%YR z;?+jeS-M&#h2(h#J66o`@rPSPw2Hv8(6G{d>a0nZwW}hC;as-FwQ{%>PyXuls7tkt z=M!7V%qtSQ1x!G2e(76jXnSTjnxohZh`gvh*X_O63?i8f{d12nVZV3X8?3m{(B(?w z@v?}QZDE6mItDN>`dS7vDz71z6g;cP^kTZ9=Q75beKbDL78=xk&vEbyn7hTDz z9gaq!pNz3rx}l_a4S_6dy0V}375b*G%17kl>CS4@p2xCkXH>V-*jf|p2@TzjM=|18 z(^Oq{k=fxO2`g<`&kWGA=Q66m&bH*{2uZopMRbPFx12lWAbRd3Q>CBIXtRAWi5 zh6G9lG5t}d*pdy~8r{zpt~Aajr@&}LnB$oI$He^zQ3|J3gY1r@(53Ei*Aw6Gk0StUfmL6fsL*2?sk zYb;DFwsnwD53UEEH#sVM%u{J=-_H+$NOhriAX+~*eA)$6$DfB;yCbuNjS`(v-66c2X zvM4K77uiqwD}?lAE~s0@`1!$lUEwO3AWE8u`vd!vc{F3B0)9K0EgTT$BM~PJ<5jJS zfo+q@FOzVVTn|Y6s@^se+@79b*n?hro={Oc@!F)FzoiIY=N6I4Vi@R$4a zkB9Sd6R0QDaZ-_!q`LpBBow?S2`KwAg^7ebmdf!O;-FY1JjGC~Tm8(U!0q5J>B)BS z5dzfg=@hDv$jP`Bh{vAg>2vr>ThrV}oP55{Rs0r^hlYRNw;H3H$3n0X-e4 zuJ4}=fYH#gY3XnTdO+0ep?LWia1e?KGHQeZ{6>{@zzs--87tuj%!`}YI66(?S-r5d zQ$vX%-2wrtSRna+@M1qJLEYBkcZI>CwfU5UhYUM-5cBoJ%;B`ncqn34yk##6L8Jur zj(veTzJW`eOeRPbl|U7+WK<9rV!M_7y=I8akaR*OX?RH1BejVJNJZl}616wz>&L@r zH^Bn2N>SkgB}CuFuOS8_pSg5#drO2YMq8t1;(i1L3uFPp2hf7m!FO}ZPiU4ObVDpZ z;<+*gV2!q;rVX^U)%B);RGc!L>=|}MR77EXm9utJ3}nJlQzT~3+Ck&i?18GhUe`Bd zqQ*pq-^y79Z}Va@VJx5byoQ!KOxnIu3A{QBY3d&90KYdF_dd|cUGHAYheCqiKk5ro zmA!{;0W9iUa;m9@u)_G(9cetCt(yEGE|j~?#*6iSwLsiV`FmDir8p@sp_$Ifs9pQc zUBqI(7UI;K@f2^)L_yYktsbTN3#ng&I(D#R347;+$@Sk7N?1(PkrnYh95XI7Vmi}- zZE9uqnbguSJ~1tcvjUV=b6OIqmLtRX*H}G@<16tK9Fa)VWddY=JVEVaoTL~i$B&Pr z^#t_3Wk=(k@#A$;n}_Y|i8eK|QV0dT<0UC~A)k?c(tFpz@D?-ath|8(l%Xx>JfcSnxA! z5fpT)xpX|U1sQv>ZB|vz6wCBPwCPuI z;&aR1!6IF7k1K&ki;uZWbn&!)AY|LcXm_619rQW|ubU_M75y+pq<(G@aJ&esz3&1o z>>$HvS!0oOpD%UVU-+`>UOGY1UCD9AU%7rmSMp|Kox*M$H-#IBM6&cZ&eaVf_^ZIx za)J7^0)1)I*OGgao5>fB)+@V7g4cYY``jQNyS4Bl-PJ&&h0_GTt2bmWqQD;DPc1NS z;qp_cYRRosBEqH2^QQtoYxlV^TUU4KCq?OeJ$Xq#>`qmIi-8*o{HI1%tUfGjaf6(^ zKW*e*MrgNWjd?fm(_*!8Q+e3XvX3cH z=RSx;Us%SM8@rkJksw#pTZ?pS&U}9Qaf9BnGC$B=b>A`pXWYmSjyFQ(8eaX>0)1(J zna5`X+!U48=IcLWG4NTsq4sV+-Yr+-^7@P&?^fwXV++^zZQjAebjN}lV@<`vE7rh zi=&S9hFHES>|=&UGNbl||C;3rzap2UdT_lGpEeTtQs@qkObUG9RRQ)jgva;EY9B-l z#znFEiu=xi;9w{b&iSR0%m|xN86lJw&8I6FSCdfmxqEG-`yS zYoH)sM5z48Z!4u@gpwqW&X^_e%Ym>k+omLKpf@K?=`Ear4pueys5P(9(bBGe(uW$Y zBI$RY8pHUK!OBcT1~K&NW8UAwv~8H#__06bUfd{SH$#bB7vMCD?*YD4H)QUC zi!axWdAgxS4QK4@#;yJhV>WBK(ZFneVuLkc;Y^!%;YR5u-VTpjwM->ps#b%HSJ zweShnJ=RaT2yhn5mLYRi#@W_M#7Gg%vCbq{07{XeC89}vJK7VHpHFDI!elh%FmDv1 zk~eqFWyXOv&PZQ_IkpJ5Ey|dKS~&)YWr{j{gbT_HM+e{3#;v_5lY;M)%u}a$_h*)b;!7e1MjSeYP3Clq3CAXNGLkRQ5a`Nd>u(1^$0)Adsj&R zT*ZM?#3c4l5nbFup;TSI5l5XdxSxl&owv9-z{WwowpPLHK*MB6cX0njZkjE`q100xFL zLmQ^P_}Pu%N|*vfsZ8WG*ja-M+^fN%T605h=eT0ei_~4R;OQeUr7Sr3Ol?(D))X`= zWrEE_$GbI%@q^gnA#S!`^q}hv$vQ60c*AAWY*#a9E(w^eR?Btb`7rHo;{8mDCb%wC zaPls=bvn<>trbS&r`gEBK&qG2tDVu>Fg`|ShK)UhbB%r{0c^_~0l|AHQ>GKO(~U(Y zK^#SHV^Bdbq<32ldpdkx)0U)2>{4n=1K_IK*RB<;0>!$S*F6@D-+_k^8oUvRn6Kq8 z>IQ?NJ3JPHYWkg~0@O{lTNlR9GjrmP4YwTYz~uXYPiBY0T`xz}MaGfiMcUZXV8Ewa z#G0tLDjj*LoE_ioiY{_@*-Bh`T_%_gAn!BDjnn)Hy-B=wAtdn}dJ zvMMA;_n<#vl~iFiJX5_UwOcU%0FfrtOq`M>gbzJn6&lct37c#v#{g6@pAQWOMd86V zXY+!w?`l>7a?bw$UOFx0YgHYF9kcF9!m0D@7((ibyC^J2*@ zSt1KD&Wr|rl4GADQvFXp6Ic?x$c12}0M321N2;~Sx0%4}>t*NbxfDcdGSxrNd9z&d zqb_)PaRMm9vT!(q)iD$2^}@mR2=~nK-rvV$g&Q$`@1YE~Aih2V@5^2!=WX2NmnhU0 zqNf9KV^MY^9VM8kVEe+en#aUdl#X+Z>Q9FY1soVa{pJ`6FTA;cM-Rr}q~vc*vKz6V zB*~C~kwr&E>~FQF{@`CGVRy`=MHViLYr4QD>*^VcUj&Oi2=*vW8y&a@_ADEQhW>ou z(5C4p;jk;W!zGbll&A8>zP!rG=c+tpWc#le2A@M{+hH?)QYT+%8i{qZoW1?0sAUt_N^b7*=rszwQouA?$JnSB*jYxqFqNtrmfC`IMx)ZM zblQw3YI~nD?LEek7vfeg2vdC16SvVp)w0)*%?8vXbU;$ju6C7YtY=ypAA*io|3F}} zS&9Rq@GxMEVmg5!>ES+658GmcC6cGKSW)zLj7CAWT3hopM2Iyb{X+bld`ih{80*;L zydo*OjwN7uE2~TzWoVRq941L-&JGc}yw!l3X=X?ti+*hpTGkX?QWVgmQypK(iB#tu zQ4vTEO|#HN(MBdEsv(_>m;!cAgct-JLjIcY7LWtWMqmWw1*k(o0eL%JnbtC@+L%>F zHeOo>FbxZT$4;IaiE6Z%E|QKj&c&oP>P1FdFV9(Mnsk8=HH2&l4P0pqRle!Df7&62 zKojQiLmhZ&&y+xh#Cf*7 zfb@ggHpQ>n6s|Zr2t<|SAU3Vrsvdh^;4v)Q#M3%NjhZM{eilSvHv7|B{I+eSpj1K! zR9l%8owgSbG7Ht?#Q8eShA=(H%^z%Pa;?7!ANHUH-ro%lmB z=F1Ey*PI@A2pefD1o-_)J3@wo&dcw{46h}kg#;uJ9sA89>Eqe6b(2DbtxQL$+|d-Z z=3ALs7z#2gd43KA%IfLL0kf5O&Ikx#3cwW{GOkmV<10pZjt#|WHC%B9#p|_t(CDuO zyVE!Vhgwm!t9E}yyc-*@+QcC3YF= zYg*;zUMtn0nbAk`RV;>2NW8KyDN5gj@k)QT zPF?vjDnW#ewp5u+@O2_bjVu|&Wp_`Y&?^Skn=N<7kLN-Z{$Nrg- zg5mBB@kEVO-8vy#7_-q#7r3K06ixI;sFcd0vxbnVNnSA{;Il&fRydRT!Ejj`b8xm4uv;P zL3Qb%}{nzld` z47F~auKhHwB!1H|2PV~-h<;VAfa0F?i{JemmE=7gKA4ZqLOzaR&M@1QakcmisGQHh zv}8DtCc9EF&|$=#^e~+;rH28^P@ZWtB^!ebcT;7|CC8d1jg0U7G|K$HG_8uSkxLMd zBq>N}-vn1Zs20)qNaQAVE!sL6uTzN<&tmg{B_ORcXfrXJ_}a>juNzFIt$Q9V z`Y2{#TeVYgu{tA%N*hzR-q#P5UbIkSUWrp7neQ8%Sxh*hOX8DSebiPdW$Xjto}?8Q zif*Bd`*exTT(tdZ?zL=~T0vZEP-s0O_aYQUzO99xK9J2^*;v{We3%)-6N9O+`cQ}8 zsG%n2Qk71F({v!crGY8=s}5I0nx-tw0bkLe_}2b7?te;EXZ}r9{Yu}eYW4uF7!_yr z4LxP`);BZAn9TYt)wP<_m^5Yyy=aZzqqQiVEp6HQ&s%N#M*{}*k<>SlfH2VuDi5P~ z%Q^PtXyd(fEELTL#<@^)JtJa2ahw_XUHv`ze1b`=#-nw)n1igY;G9DBnW-pRYDGQW zU!CkHwMH*Cde8`%Pjf~+!voby(IrNaVCA2(3HTI0(WFoV$w<*c5s*JL`KDR@+hI3Q zP>h7YDjP@>m*)VyvB0I~Vq}*xjrj2`^lo-$J+1DH2%?IxitO)zQyl&8P$2R!gh!9nHcje?gK#jGQ57`lK#!Vq_J zpHVBy?$T#&SB03`t?9|CV917r_{AkHw4@MOg&gRehhx+hd|zQ^^CyK^87yM_nir^S z;-QNj>SHa2)#Qxy9N1cWA0WX}L4k%+@sKD(7V!`?d5 z6%oP1ppp*Fsl^KF{jGwafW;6K3F3LRz%xU0Hx{c#uKB#=tmg9qVxxuVmsW5Wlc{&j zm%&seT!X>X&M_X0@D$C9Z2BdG{UN#-fW>h^gXDn}7{s+0CxRI{Fsx>Rp#zIMSM4=u zK+m8Zjh7}Hdw@Z`)z3+oYBK?~RZ_r1we`bJXcmI^;7I0B{$^s*${=RCM^eVmvdd(5G zJ{U5!F_hTdC>iWEdb)iOl@5m1bHxZ^M2Q+&$MsR4FtRi@5BKtj2f7V%CeT{3N@QUR zBZn>sQ*W&nE7$Au-Z@dtUh@<#1Dm_)1mN~uL@wA#e=4fi@o@LYn?hmY=M7&>&cA53 zJS$&s*hU#b2;$vP4}YRiZNj8Z#vm|7;^8QrP~1Ue&sY%GU=Zj#KfboiE$^Dh*%XbS z$pg||YK753zDo@pDU%f!HSSX5AYW+{|Nrm*W8nWS3?zjyVN<=>HYo}lx4{nIV#^Vo zBe&Xm)aY%-jNNv-&u_oOjysL}!p^(wy4x4O)aAPW$Ctmd`yPAl^*{Ii>es&h5Bq%M zo8Q{^+xz|FcmC5AO&U zg?EN`g?ERG!+XMe!~4P|;r-zQd2O>=|KCrGK?Px=xTI|JygGa^TpB(UJ{&$0E(;$G z9}8P5kB7^{C&DMgr@|HC%JAv1+WJh`6FwV07d{`p5WX0`6uum;3SS9d4POgahi&~| z58nvm0dIzD!hwVS7`_#@5B^j5cKA;CZunlfHhe$)bNH8VUHC!xVffc@Qgn25Omr+e z`Hzc^k4}iDL?=ckMJGp7qf??&qtl{k(dp3{(XXTF(V5X%(b>_A=$z=>=)CCs=r_>? z(Ql)f(S^}P(Z$gv(WTMvqFK>p(dE$<(UsBcXijuhbaga0x+c0d`h7Gnx-Pmtx&eRj z8>5?|o1+EMEzuvMTcd^1ZPD$~9nqrb&gib_?r3pzPjqi|U$i8;KYAc~kR`5%qKBhL zqGi#e(PPo$cz-+*JsCZPhsVn3>FAlLCwew|E_yzCA$l=-DSA0t6}=L@8od^+j$V)6 zh~A9WM1Mpa0MeI82a>)>%0}Vp3#80&tIv}TCVh@{ zBhqI{hmiJ=c91?px-sd~q??egBqjWKbp`1#(x*r_C4G`~GtwtWKS#QpG$DPQv_|?E zX`S>@(#=Vikq#$)gmeqihe@|2eTZ}f=~B{8(g#ULl0HDX73uw?Tazv!9YuN{>1fh> zNw*=rhja|-V$!jscav^QdKc+-q<4~jo^%oE_M~@^?m&7w>5ingk?usgkaQgBt)yQd z{R8RFq_>dnLb`x-SJInFcO$)t^oyi7l75MFKIy^$;0A!(1Y8eryMXHe?hr5!V3B~| z1KcU#T7bI*Tmx{ofVlvR1zZhqkASNH?iDZx;64Gf0hS2365xITR{%U9;BtTm1zZNO zRKP5NhXni%;9&um0z4w%5`bj_E(Ty*cvQUz;4uLg0z58YCctt5zXfi{PUSPd{$z-s`f2zV9XQ~|F5oF-ruz%&6b1Dr14C4e&oya@1X z0WSbd7w|m5nF5{zI7`5@0A~y60hl4+8Gv&HJPmNJfRzB}30MJezJR9yek0&XfC~gX z0q|P^%K>HzcpTtD0gnM(B;Zkiiv=tLxJ1As0GA4Q7~ppT9s-ypU@5?50v-goT)+bW zR|vQt;7S2Y0A>rg4`7afdjYNza1X%M0u}?z6>vAeH3IGexK_ZO0KXTo2wZ| za67>D0&WAiLBK+Q`2ubQxKY3#0B#a+3&70+762>|a5KOy0&W8MgMb?WZWS;eV4;8; z0B#d-J;3b(t^>G3z&wCO0)7v0r+{k#?hEq1zZa7h=5A~mI=5R;86h=0X!z)LV(8w z%mi32;I{xz2)F>?NddnBcuK(e04oHX2e4AWxd2ZKI0xVv0W$!41e^`nN5FfO{x4XM(*J_7lS3 zrH8RmWyHR=&+(zlYz-*Kr2(M8(0al}QJe)@9FJUxFe*vFS`g7Qf z(tn1_DE%2sM(I!CF-m^|i&6SxIE>OC!C;jB5dNa{2e22V2f$sFejnzdbbok@((l1q zlztb^qV%6&EK0uvUs3vxuob2I!Bv!g8>XUkUwDerZ^2TOeiM$O^cye~rTf57l>P(k zMCsSzCQ82sGg10gc!|=zVI@lcC!9p-UN91+d%{PQ?g1N7x;tD%=~rMPO1}&bQTjh% zAxgX9AW9t!L}?fNL+O`bA4GtpprJsjoDBTW@p>$gqhSIU{3#DUV7fQE*TPPh3vrsw;UZHerScTH9 z;1o(n!YGt>!Y7oDfK4df5-y>13z&q`;qVBho5LcM*5MFJYcL3<3H(7R@tB@aN=T+B zl@gWdDWwEv!o@pMY^Ie;vCTcLln71FDD8kRC}qduvq}lo^qf+nH9fDCfK4wbC1%r$ zN(tNal2QUUy{webO{G$z~Tjv)_%gf$D9zRV!@ z(|i@yOvB!K&Js*Hk)w;&5~^5-6(nTYVRMC9ur0)P20B zK&*=`R)``icc2dW}b~H6iNM-*|4c)0{lT6&$^W>+H?1Wug>nurx z#WP)LEnu*WujCXlUrc&Jm0v=1I=~0J^FFxW!_p4Kdrl@+nfA5nP9hgk3TRjTWi`hG zM8#Pkaj+L(HmcU7Whh&6YN`yhnyZCw<^_cNId8YdTT|!zTR+V4S(df3Gul&&#+}iZ zYoVETwU!Xyxt;A>!bc7Ru-w+LSNw3RLkF@sY@GY{*h7%w5thHvBn-mf(Fo+(

qm6_fU3sP-B6q+_ble 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

>jtvm8sZ`Y*9 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

r+gaucR0A_=h0QBWxZ*18w{MBUUViQ9 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

40IAHrDA_X>}F5#;t90Oh35h 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 z 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 b5COl-{S0(Ie*VF{r@x;vEmRSx3~Tpar?sKS literal 0 HcmV?d00001 diff --git a/src/acp/iroh/pkg/thunderbolt_acp_client_bg.wasm.d.ts b/src/acp/iroh/pkg/thunderbolt_acp_client_bg.wasm.d.ts new file mode 100644 index 000000000..0d92f8369 --- /dev/null +++ b/src/acp/iroh/pkg/thunderbolt_acp_client_bg.wasm.d.ts @@ -0,0 +1,43 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const __wbg_irohclient_free: (a: number, b: number) => void; +export const __wbg_irohconnection_free: (a: number, b: number) => void; +export const irohclient_connect: (a: number, b: number, c: number, d: number, e: number) => number; +export const irohclient_create: (a: number, b: number) => number; +export const irohclient_nodeId: (a: number, b: number) => void; +export const irohclient_secretKeyHex: (a: number, b: number) => void; +export const irohconnection_close: (a: number) => void; +export const irohconnection_readable: (a: number, b: number) => void; +export const irohconnection_send: (a: number, b: number, c: number) => number; +export const start: () => void; +export const __wbg_intounderlyingsource_free: (a: number, b: number) => void; +export const intounderlyingsource_cancel: (a: number) => void; +export const intounderlyingsource_pull: (a: number, b: number) => number; +export const __wbg_intounderlyingsink_free: (a: number, b: number) => void; +export const intounderlyingsink_abort: (a: number, b: number) => number; +export const intounderlyingsink_close: (a: number) => number; +export const intounderlyingsink_write: (a: number, b: number) => number; +export const __wbg_intounderlyingbytesource_free: (a: number, b: number) => void; +export const intounderlyingbytesource_autoAllocateChunkSize: (a: number) => number; +export const intounderlyingbytesource_cancel: (a: number) => void; +export const intounderlyingbytesource_pull: (a: number, b: number) => number; +export const intounderlyingbytesource_start: (a: number, b: number) => void; +export const intounderlyingbytesource_type: (a: number) => number; +export const ring_core_0_17_14__bn_mul_mont: (a: number, b: number, c: number, d: number, e: number, f: number) => void; +export const __wasm_bindgen_func_elem_16128: (a: number, b: number, c: number, d: number) => void; +export const __wasm_bindgen_func_elem_16112: (a: number, b: number, c: number, d: number) => void; +export const __wasm_bindgen_func_elem_5292: (a: number, b: number, c: number) => void; +export const __wasm_bindgen_func_elem_2968: (a: number, b: number, c: number) => void; +export const __wasm_bindgen_func_elem_7152: (a: number, b: number, c: number) => void; +export const __wasm_bindgen_func_elem_5123: (a: number, b: number) => void; +export const __wasm_bindgen_func_elem_6276: (a: number, b: number) => void; +export const __wasm_bindgen_func_elem_6410: (a: number, b: number) => void; +export const __wasm_bindgen_func_elem_14796: (a: number, b: number) => void; +export const __wbindgen_export: (a: number, b: number) => number; +export const __wbindgen_export2: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_export3: (a: number) => void; +export const __wbindgen_export4: (a: number, b: number, c: number) => void; +export const __wbindgen_export5: (a: number, b: number) => void; +export const __wbindgen_add_to_stack_pointer: (a: number) => number; +export const __wbindgen_start: () => void; diff --git a/src/acp/iroh/types.ts b/src/acp/iroh/types.ts new file mode 100644 index 000000000..e55ffaa76 --- /dev/null +++ b/src/acp/iroh/types.ts @@ -0,0 +1,35 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Structural seams for the wasm iroh client (`crates/thunderbolt-acp-client`). + * + * The generated `pkg/*.d.ts` types are wasm-bindgen flavoured (`Promise`, + * raw `ReadableStream`), so the transport speaks to these narrow structural + * shapes instead. That keeps the transport's framing logic unit-testable with a + * fake client — without instantiating the multi-MB wasm or binding a real + * relay endpoint. + */ + +/** One open bridge connection: a single QUIC bidi stream over the relay. */ +export type IrohConnectionLike = { + /** Queue bytes for the send half; resolves once enqueued. */ + send: (data: Uint8Array) => Promise + /** The receive half as a byte stream — consumed once. */ + readable: () => ReadableStream + /** Close the connection (finishes the send half, closes QUIC). */ + close: () => void +} + +/** The long-lived relay endpoint. One instance backs every iroh transport. */ +export type IrohClientLike = { + /** This client's NodeId (base32) — what a bridge operator allowlists. */ + nodeId: () => string + /** Dial a ticket or bare NodeId over `alpn`, opening one bidi stream. */ + connect: (target: string, alpn: string) => Promise +} + +/** Loads (and binds) the shared iroh client. Production dynamic-imports the wasm + * chunk; tests inject a fake. */ +export type IrohClientLoader = () => Promise diff --git a/src/acp/transports/index.ts b/src/acp/transports/index.ts index 782c22b12..fa379f311 100644 --- a/src/acp/transports/index.ts +++ b/src/acp/transports/index.ts @@ -35,12 +35,13 @@ import { computeEffectiveProxyEnabled, createProxyWebSocket } from '@/lib/proxy- import { useLocalSettingsStore } from '@/stores/local-settings-store' import type { AgentType } from '@shared/acp-types' import { encodeWsBearer, wsBearerSubprotocolPrefix, wsCarrierSubprotocol } from '@shared/ws-bearer' +import { openIrohTransport } from '../iroh/iroh-transport' import type { AcpTransport } from '../types' import { openWebSocketTransport, type WebSocketFactory, type WebSocketLike } from './websocket' export type OpenTransportInputs = { url: string - transport: 'websocket' + transport: 'websocket' | 'iroh' /** Agent type drives proxy routing — see file header. `built-in` never * reaches the transport, but the union stays full for type-safety. */ agentType: AgentType @@ -88,6 +89,11 @@ export const isStandaloneTransport = ( * `new WebSocket()` — and unlike the URL/Referer, the subprotocol header is * not logged by default. */ export const openTransport = async (inputs: OpenTransportInputs): Promise => { + // iroh dials a peer bridge by NodeId/ticket over an n0 relay — no URL, proxy, + // or bearer routing applies. `inputs.url` carries the NodeId/ticket. + if (inputs.transport === 'iroh') { + return openIrohTransport({ target: inputs.url, signal: inputs.signal }) + } const webSocketFactory = inputs.webSocketFactory ?? resolveWebSocketFactory(inputs) return openWebSocketTransport({ url: inputs.url, diff --git a/src/acp/types.ts b/src/acp/types.ts index 39db30e99..3120f79b7 100644 --- a/src/acp/types.ts +++ b/src/acp/types.ts @@ -27,11 +27,11 @@ export type AcpTransport = { closed?: Promise } -/** Inputs to `openTransport(...)`. WebSocket is the only remote transport; - * the factory honours the proxy toggle (native socket vs subprotocol tunnel). */ +/** Inputs to `openTransport(...)`. WebSocket honours the proxy toggle (native + * socket vs subprotocol tunnel); `iroh` dials a peer bridge over an n0 relay. */ export type OpenTransportOptions = { url: string - transport: 'websocket' + transport: 'websocket' | 'iroh' /** AbortSignal that, when aborted, must close the transport and cancel any * in-flight retries. The adapter owns this controller and aborts on * `disconnect()`. */ diff --git a/src/types/acp.ts b/src/types/acp.ts index 3720e1f96..070be83a1 100644 --- a/src/types/acp.ts +++ b/src/types/acp.ts @@ -36,7 +36,9 @@ export type Agent = { id: string name: string type: 'built-in' | 'remote-acp' | 'managed-acp' - transport: 'in-process' | 'websocket' + /** `iroh` is a remote-acp agent dialed peer-to-peer over an n0 relay; its + * `url` carries the bridge's NodeId/ticket instead of a `ws(s)://` URL. */ + transport: 'in-process' | 'websocket' | 'iroh' url: string | null description: string | null icon: string | null From 7cd577d966d63ef4a6430b59c8b699832809f3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Menezes?= Date: Mon, 29 Jun 2026 08:43:13 -0300 Subject: [PATCH 08/86] feat: bind a device iroh node id via a canary-gated route with qr pairing --- backend/drizzle/0021_overrated_mindworm.sql | 6 + backend/drizzle/meta/0021_snapshot.json | 2218 +++++++++++++++++++ backend/drizzle/meta/_journal.json | 7 + backend/src/api/encryption.test.ts | 112 + backend/src/api/encryption.ts | 44 + backend/src/dal/devices.ts | 12 + backend/src/dal/index.ts | 1 + backend/src/dal/powersync.ts | 13 +- backend/src/db/powersync-schema.ts | 4 + bun.lock | 49 + package.json | 3 + src/api/encryption.ts | 13 + src/components/device-qr-code.tsx | 56 + src/components/set-node-id-dialog.tsx | 129 ++ src/dal/devices.ts | 2 + src/db/tables.ts | 3 + src/hooks/use-device-pairing.ts | 40 + src/hooks/use-set-device-node-id.ts | 22 + src/lib/pairing-ticket.test.ts | 42 + src/lib/pairing-ticket.ts | 65 + src/lib/qr-scan.ts | 30 + src/services/encryption.ts | 15 + src/settings/devices.tsx | 66 +- 23 files changed, 2949 insertions(+), 3 deletions(-) create mode 100644 backend/drizzle/0021_overrated_mindworm.sql create mode 100644 backend/drizzle/meta/0021_snapshot.json create mode 100644 src/components/device-qr-code.tsx create mode 100644 src/components/set-node-id-dialog.tsx create mode 100644 src/hooks/use-device-pairing.ts create mode 100644 src/hooks/use-set-device-node-id.ts create mode 100644 src/lib/pairing-ticket.test.ts create mode 100644 src/lib/pairing-ticket.ts create mode 100644 src/lib/qr-scan.ts diff --git a/backend/drizzle/0021_overrated_mindworm.sql b/backend/drizzle/0021_overrated_mindworm.sql new file mode 100644 index 000000000..86866c89b --- /dev/null +++ b/backend/drizzle/0021_overrated_mindworm.sql @@ -0,0 +1,6 @@ +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +ALTER TABLE "powersync"."devices" ADD COLUMN "node_id" text;--> statement-breakpoint +ALTER TABLE "powersync"."devices" ADD COLUMN "node_id_attested_at" timestamp; \ No newline at end of file diff --git a/backend/drizzle/meta/0021_snapshot.json b/backend/drizzle/meta/0021_snapshot.json new file mode 100644 index 000000000..93db6dd10 --- /dev/null +++ b/backend/drizzle/meta/0021_snapshot.json @@ -0,0 +1,2218 @@ +{ + "id": "d89abf7b-a292-429d-85bc-33095d917080", + "prevId": "f5c953ed-42f2-4ee1-b614-2ef307e1cde0", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "account_userId_idx": { + "name": "account_userId_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "device_id": { + "name": "device_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "session_userId_idx": { + "name": "session_userId_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "session_deviceId_idx": { + "name": "session_deviceId_idx", + "columns": [ + { + "expression": "device_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sso_provider": { + "name": "sso_provider", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "issuer": { + "name": "issuer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "oidc_config": { + "name": "oidc_config", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "saml_config": { + "name": "saml_config", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "sso_provider_user_id_user_id_fk": { + "name": "sso_provider_user_id_user_id_fk", + "tableFrom": "sso_provider", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_new": { + "name": "is_new", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "is_anonymous": { + "name": "is_anonymous", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "verification_identifier_idx": { + "name": "verification_identifier_idx", + "columns": [ + { + "expression": "identifier", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.waitlist": { + "name": "waitlist", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "batch_id": { + "name": "batch_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "waitlist_status_idx": { + "name": "waitlist_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "waitlist_batch_id_idx": { + "name": "waitlist_batch_id_idx", + "columns": [ + { + "expression": "batch_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "waitlist_email_unique": { + "name": "waitlist_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.agents": { + "name": "agents", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "transport": { + "name": "transport", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "icon": { + "name": "icon", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "idx_agents_user_id": { + "name": "idx_agents_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "agents_user_id_user_id_fk": { + "name": "agents_user_id_user_id_fk", + "tableFrom": "agents", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "agents_id_user_id_pk": { + "name": "agents_id_user_id_pk", + "columns": [ + "id", + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.chat_messages": { + "name": "chat_messages", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "parts": { + "name": "parts", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "chat_thread_id": { + "name": "chat_thread_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "model_id": { + "name": "model_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cache": { + "name": "cache", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_chat_messages_user_id": { + "name": "idx_chat_messages_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "chat_messages_user_id_user_id_fk": { + "name": "chat_messages_user_id_user_id_fk", + "tableFrom": "chat_messages", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.chat_threads": { + "name": "chat_threads", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_encrypted": { + "name": "is_encrypted", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "triggered_by": { + "name": "triggered_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "was_triggered_by_automation": { + "name": "was_triggered_by_automation", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "context_size": { + "name": "context_size", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "mode_id": { + "name": "mode_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "acp_session_id": { + "name": "acp_session_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "agent_id": { + "name": "agent_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_chat_threads_user_id": { + "name": "idx_chat_threads_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "chat_threads_user_id_user_id_fk": { + "name": "chat_threads_user_id_user_id_fk", + "tableFrom": "chat_threads", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.devices": { + "name": "devices", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "trusted": { + "name": "trusted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "approval_pending": { + "name": "approval_pending", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mlkem_public_key": { + "name": "mlkem_public_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "last_seen": { + "name": "last_seen", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "revoked_at": { + "name": "revoked_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "app_version": { + "name": "app_version", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "node_id": { + "name": "node_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "node_id_attested_at": { + "name": "node_id_attested_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "idx_devices_user_id": { + "name": "idx_devices_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "devices_user_id_user_id_fk": { + "name": "devices_user_id_user_id_fk", + "tableFrom": "devices", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.model_profiles": { + "name": "model_profiles", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "temperature": { + "name": "temperature", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "max_steps": { + "name": "max_steps", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_attempts": { + "name": "max_attempts", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "nudge_threshold": { + "name": "nudge_threshold", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "use_system_message_mode_developer": { + "name": "use_system_message_mode_developer", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "tools_override": { + "name": "tools_override", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "link_previews_override": { + "name": "link_previews_override", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "chat_mode_addendum": { + "name": "chat_mode_addendum", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "search_mode_addendum": { + "name": "search_mode_addendum", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "research_mode_addendum": { + "name": "research_mode_addendum", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "citation_reinforcement_enabled": { + "name": "citation_reinforcement_enabled", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "citation_reinforcement_prompt": { + "name": "citation_reinforcement_prompt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "nudge_final_step": { + "name": "nudge_final_step", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "nudge_preventive": { + "name": "nudge_preventive", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "nudge_retry": { + "name": "nudge_retry", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "nudge_search_final_step": { + "name": "nudge_search_final_step", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "nudge_search_preventive": { + "name": "nudge_search_preventive", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "nudge_search_retry": { + "name": "nudge_search_retry", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "provider_options": { + "name": "provider_options", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "default_hash": { + "name": "default_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_model_profiles_user_id": { + "name": "idx_model_profiles_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "model_profiles_user_id_user_id_fk": { + "name": "model_profiles_user_id_user_id_fk", + "tableFrom": "model_profiles", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "model_profiles_id_user_id_pk": { + "name": "model_profiles_id_user_id_pk", + "columns": [ + "id", + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.models": { + "name": "models", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "model": { + "name": "model", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_system": { + "name": "is_system", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "enabled": { + "name": "enabled", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "tool_usage": { + "name": "tool_usage", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "is_confidential": { + "name": "is_confidential", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "start_with_reasoning": { + "name": "start_with_reasoning", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "supports_parallel_tool_calls": { + "name": "supports_parallel_tool_calls", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "context_window": { + "name": "context_window", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "default_hash": { + "name": "default_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "vendor": { + "name": "vendor", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_models_user_id": { + "name": "idx_models_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "models_user_id_user_id_fk": { + "name": "models_user_id_user_id_fk", + "tableFrom": "models", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "models_id_user_id_pk": { + "name": "models_id_user_id_pk", + "columns": [ + "id", + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.modes": { + "name": "modes", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "icon": { + "name": "icon", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "system_prompt": { + "name": "system_prompt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_default": { + "name": "is_default", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "default_hash": { + "name": "default_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_modes_user_id": { + "name": "idx_modes_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "modes_user_id_user_id_fk": { + "name": "modes_user_id_user_id_fk", + "tableFrom": "modes", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "modes_id_user_id_pk": { + "name": "modes_id_user_id_pk", + "columns": [ + "id", + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.prompts": { + "name": "prompts", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "prompt": { + "name": "prompt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "model_id": { + "name": "model_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "default_hash": { + "name": "default_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_prompts_user_id": { + "name": "idx_prompts_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "prompts_user_id_user_id_fk": { + "name": "prompts_user_id_user_id_fk", + "tableFrom": "prompts", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "prompts_id_user_id_pk": { + "name": "prompts_id_user_id_pk", + "columns": [ + "id", + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.settings": { + "name": "settings", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "default_hash": { + "name": "default_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_settings_user_id": { + "name": "idx_settings_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "settings_user_id_user_id_fk": { + "name": "settings_user_id_user_id_fk", + "tableFrom": "settings", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "settings_id_user_id_pk": { + "name": "settings_id_user_id_pk", + "columns": [ + "id", + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.skills": { + "name": "skills", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "instruction": { + "name": "instruction", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "pinned_order": { + "name": "pinned_order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "default_hash": { + "name": "default_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_skills_user_id": { + "name": "idx_skills_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "skills_user_id_user_id_fk": { + "name": "skills_user_id_user_id_fk", + "tableFrom": "skills", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "skills_id_user_id_pk": { + "name": "skills_id_user_id_pk", + "columns": [ + "id", + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.tasks": { + "name": "tasks", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "item": { + "name": "item", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "is_complete": { + "name": "is_complete", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "default_hash": { + "name": "default_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_tasks_user_id": { + "name": "idx_tasks_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "tasks_user_id_user_id_fk": { + "name": "tasks_user_id_user_id_fk", + "tableFrom": "tasks", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "tasks_id_user_id_pk": { + "name": "tasks_id_user_id_pk", + "columns": [ + "id", + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "powersync.triggers": { + "name": "triggers", + "schema": "powersync", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "trigger_type": { + "name": "trigger_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "trigger_time": { + "name": "trigger_time", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "prompt_id": { + "name": "prompt_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_enabled": { + "name": "is_enabled", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_triggers_user_id": { + "name": "idx_triggers_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "triggers_user_id_user_id_fk": { + "name": "triggers_user_id_user_id_fk", + "tableFrom": "triggers", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.rate_limits": { + "name": "rate_limits", + "schema": "", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "points": { + "name": "points", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "expire": { + "name": "expire", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "rate_limits_expire_idx": { + "name": "rate_limits_expire_idx", + "columns": [ + { + "expression": "expire", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.encryption_metadata": { + "name": "encryption_metadata", + "schema": "", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "canary_iv": { + "name": "canary_iv", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canary_ctext": { + "name": "canary_ctext", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canary_secret_hash": { + "name": "canary_secret_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "encryption_metadata_user_id_user_id_fk": { + "name": "encryption_metadata_user_id_user_id_fk", + "tableFrom": "encryption_metadata", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.envelopes": { + "name": "envelopes", + "schema": "", + "columns": { + "device_id": { + "name": "device_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "wrapped_ck": { + "name": "wrapped_ck", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "idx_envelopes_user_id": { + "name": "idx_envelopes_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "envelopes_device_id_devices_id_fk": { + "name": "envelopes_device_id_devices_id_fk", + "tableFrom": "envelopes", + "tableTo": "devices", + "schemaTo": "powersync", + "columnsFrom": [ + "device_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "envelopes_user_id_user_id_fk": { + "name": "envelopes_user_id_user_id_fk", + "tableFrom": "envelopes", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.otp_challenge": { + "name": "otp_challenge", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "challenge_token": { + "name": "challenge_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "otp_challenge_email_unique": { + "name": "otp_challenge_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/backend/drizzle/meta/_journal.json b/backend/drizzle/meta/_journal.json index 16a6dae4a..9ff507354 100644 --- a/backend/drizzle/meta/_journal.json +++ b/backend/drizzle/meta/_journal.json @@ -148,6 +148,13 @@ "when": 1781546434494, "tag": "0020_conscious_silverclaw", "breakpoints": true + }, + { + "idx": 21, + "version": "7", + "when": 1782728897095, + "tag": "0021_overrated_mindworm", + "breakpoints": true } ] } \ No newline at end of file diff --git a/backend/src/api/encryption.test.ts b/backend/src/api/encryption.test.ts index 068c40078..e197eec92 100644 --- a/backend/src/api/encryption.test.ts +++ b/backend/src/api/encryption.test.ts @@ -1358,4 +1358,116 @@ describe('Encryption API', () => { expect(response.status).toBe(204) }) }) + + // ─── PATCH /devices/:deviceId/node-id ─────────────────────────────── + + describe('PATCH /devices/:deviceId/node-id', () => { + const nodeId = 'k51qzi5uqu5dh-test-endpoint-id' + + const patchNodeId = (token: string, callerDeviceId: string, targetDeviceId: string, body: object) => + app.handle( + new Request(`${baseUrl}/devices/${targetDeviceId}/node-id`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${signToken(token)}`, + 'X-Device-ID': callerDeviceId, + }, + body: JSON.stringify(body), + }), + ) + + it('rejects without canarySecret (body validation)', async () => { + await createUserAndSession(p('u-nid-nobody'), p('tok-nid-nobody')) + await insertDevice(p('d-nid-nobody-caller'), p('u-nid-nobody'), { trusted: true }) + await insertDevice(p('d-nid-nobody-target'), p('u-nid-nobody'), { trusted: true }) + + const response = await patchNodeId(p('tok-nid-nobody'), p('d-nid-nobody-caller'), p('d-nid-nobody-target'), { + nodeId, + }) + + expect(response.status).toBe(422) + }) + + it('rejects with wrong canarySecret', async () => { + await createUserAndSession(p('u-nid-bad'), p('tok-nid-bad')) + await insertDevice(p('d-nid-bad-caller'), p('u-nid-bad'), { trusted: true }) + await insertDevice(p('d-nid-bad-target'), p('u-nid-bad'), { trusted: true }) + await insertCanaryWithSecret(p('u-nid-bad')) + + const response = await patchNodeId(p('tok-nid-bad'), p('d-nid-bad-caller'), p('d-nid-bad-target'), { + nodeId, + canarySecret: 'wrong-secret', + }) + + expect(response.status).toBe(403) + expect((await response.json()).error).toBe('Invalid canary secret') + }) + + it('rejects when caller device is not trusted', async () => { + await createUserAndSession(p('u-nid-untrusted'), p('tok-nid-untrusted')) + await insertDevice(p('d-nid-untrusted-caller'), p('u-nid-untrusted')) // pending, not trusted + await insertDevice(p('d-nid-untrusted-target'), p('u-nid-untrusted'), { trusted: true }) + await insertCanaryWithSecret(p('u-nid-untrusted')) + + const response = await patchNodeId( + p('tok-nid-untrusted'), + p('d-nid-untrusted-caller'), + p('d-nid-untrusted-target'), + { nodeId, canarySecret: testCanarySecret }, + ) + + expect(response.status).toBe(403) + expect((await response.json()).error).toBe('Only trusted devices can set a device node ID') + }) + + it('returns 404 when target device does not exist', async () => { + await createUserAndSession(p('u-nid-missing'), p('tok-nid-missing')) + await insertDevice(p('d-nid-missing-caller'), p('u-nid-missing'), { trusted: true }) + await insertCanaryWithSecret(p('u-nid-missing')) + + const response = await patchNodeId(p('tok-nid-missing'), p('d-nid-missing-caller'), p('d-nid-missing-absent'), { + nodeId, + canarySecret: testCanarySecret, + }) + + expect(response.status).toBe(404) + }) + + it('rejects binding a node ID to a revoked target', async () => { + await createUserAndSession(p('u-nid-revoked'), p('tok-nid-revoked')) + await insertDevice(p('d-nid-revoked-caller'), p('u-nid-revoked'), { trusted: true }) + await insertDevice(p('d-nid-revoked-target'), p('u-nid-revoked'), { trusted: true, revokedAt: now }) + await insertCanaryWithSecret(p('u-nid-revoked')) + + const response = await patchNodeId(p('tok-nid-revoked'), p('d-nid-revoked-caller'), p('d-nid-revoked-target'), { + nodeId, + canarySecret: testCanarySecret, + }) + + expect(response.status).toBe(404) + }) + + it('sets node_id with a valid canarySecret from a trusted device', async () => { + await createUserAndSession(p('u-nid-ok'), p('tok-nid-ok')) + await insertDevice(p('d-nid-ok-caller'), p('u-nid-ok'), { trusted: true }) + await insertDevice(p('d-nid-ok-target'), p('u-nid-ok'), { trusted: true }) + await insertCanaryWithSecret(p('u-nid-ok')) + + const response = await patchNodeId(p('tok-nid-ok'), p('d-nid-ok-caller'), p('d-nid-ok-target'), { + nodeId, + canarySecret: testCanarySecret, + }) + + expect(response.status).toBe(200) + expect((await response.json()).nodeId).toBe(nodeId) + + const [row] = await db + .select() + .from(devicesTable) + .where(eq(devicesTable.id, p('d-nid-ok-target'))) + expect(row.nodeId).toBe(nodeId) + expect(row.nodeIdAttestedAt).not.toBeNull() + }) + }) }) diff --git a/backend/src/api/encryption.ts b/backend/src/api/encryption.ts index 45ddbf636..390799f9f 100644 --- a/backend/src/api/encryption.ts +++ b/backend/src/api/encryption.ts @@ -11,6 +11,7 @@ import { registerDevice, denyDevice, markDeviceTrusted, + setDeviceNodeId, getEnvelopeByDeviceId, hasEnvelopesForUser, upsertEnvelope, @@ -417,6 +418,49 @@ export const createEncryptionRoutes = (auth: Auth, database: typeof DbType) => }), }, ) + .post( + '/devices/:deviceId/node-id', + async ({ params, body, request, set, user: sessionUser }) => { + const userId = sessionUser!.id + const callerDeviceId = request.headers.get('x-device-id')?.trim() + + if (!callerDeviceId) { + set.status = 400 + return { error: 'X-Device-ID header is required' } + } + + // Proof-of-CK-possession prevents X-Device-ID spoofing: only a device that holds the + // Content Key can decrypt the canary and produce this secret. Mirrors the deny route. + const validProof = await verifyCanaryProof(database, userId, body.canarySecret) + if (!validProof) { + set.status = 403 + return { error: 'Invalid canary secret' } + } + + // Caller must be a trusted device (defense-in-depth — Option B1: only a trusted app + // device may attest another device's P2P identity). + const callerDevice = await getDeviceById(database, callerDeviceId) + if (!callerDevice || callerDevice.userId !== userId || !callerDevice.trusted) { + set.status = 403 + return { error: 'Only trusted devices can set a device node ID' } + } + + const updated = await setDeviceNodeId(database, params.deviceId, userId, body.nodeId) + if (updated.length === 0) { + set.status = 404 + return { error: 'Device not found' } + } + + return { nodeId: body.nodeId } + }, + { + auth: true, + body: t.Object({ + nodeId: t.String({ minLength: 1, maxLength: 512 }), + canarySecret: t.String({ maxLength: 500 }), + }), + }, + ) .post( '/devices/me/cancel-pending', async ({ request, set, user: sessionUser }) => { diff --git a/backend/src/dal/devices.ts b/backend/src/dal/devices.ts index bca03b7a3..f9c8418ad 100644 --- a/backend/src/dal/devices.ts +++ b/backend/src/dal/devices.ts @@ -101,6 +101,18 @@ export const denyDevice = async (database: typeof DbType, deviceId: string, user .where(and(eq(devicesTable.id, deviceId), eq(devicesTable.userId, userId), eq(devicesTable.trusted, false))) .returning() +/** + * Bind a device to an iroh P2P endpoint identity (node_id) and stamp the attestation time. + * Only matches non-revoked devices owned by the user, so a revoked device cannot be re-bound. + * Returns updated rows so callers can detect the 0-row (not found / revoked) case. + */ +export const setDeviceNodeId = async (database: typeof DbType, deviceId: string, userId: string, nodeId: string) => + database + .update(devicesTable) + .set({ nodeId, nodeIdAttestedAt: new Date() }) + .where(and(eq(devicesTable.id, deviceId), eq(devicesTable.userId, userId), isNull(devicesTable.revokedAt))) + .returning() + /** * Register a device with a public key for encryption. * Used during the encryption setup flow when the FE sends POST /devices. diff --git a/backend/src/dal/index.ts b/backend/src/dal/index.ts index d333f47e1..cd3bada77 100644 --- a/backend/src/dal/index.ts +++ b/backend/src/dal/index.ts @@ -10,6 +10,7 @@ export { denyDevice, markDeviceTrusted, registerDevice, + setDeviceNodeId, countActiveDevices, } from './devices' diff --git a/backend/src/dal/powersync.ts b/backend/src/dal/powersync.ts index a106825fd..7ca331d0d 100644 --- a/backend/src/dal/powersync.ts +++ b/backend/src/dal/powersync.ts @@ -17,7 +17,18 @@ const validTables = new Set(powersyncTableNames) /** DB column names that clients cannot set via PowerSync upload (server-managed fields). */ const uploadDenyColumns: Partial> = { - devices: ['revoked_at', 'trusted', 'public_key', 'mlkem_public_key', 'approval_pending', 'app_version'], + devices: [ + 'revoked_at', + 'trusted', + 'public_key', + 'mlkem_public_key', + 'approval_pending', + 'app_version', + // node_id binds a device to a P2P identity — trust-sensitive. Only settable via the + // canary-gated PATCH /devices/:id/node-id route, never via a raw PowerSync upload. + 'node_id', + 'node_id_attested_at', + ], } /** Tables that cannot be deleted via PowerSync upload — must use dedicated API endpoints. */ diff --git a/backend/src/db/powersync-schema.ts b/backend/src/db/powersync-schema.ts index 3f4fc6e04..e1176f5c2 100644 --- a/backend/src/db/powersync-schema.ts +++ b/backend/src/db/powersync-schema.ts @@ -242,6 +242,10 @@ export const devicesTable = powersyncSchema.table( createdAt: timestamp('created_at').defaultNow(), revokedAt: timestamp('revoked_at'), appVersion: text('app_version'), + // iroh P2P endpoint identity for this device. Nullable: only set once a trusted device + // attests it via the canary-gated POST /devices/:id/node-id route (proof-of-CK-possession). + nodeId: text('node_id'), + nodeIdAttestedAt: timestamp('node_id_attested_at'), }, (table) => [index('idx_devices_user_id').on(table.userId)], ) diff --git a/bun.lock b/bun.lock index 991d633d1..c86301731 100644 --- a/bun.lock +++ b/bun.lock @@ -72,6 +72,7 @@ "events": "^3.3.0", "framer-motion": "^12.23.12", "input-otp": "^1.4.2", + "jsqr": "^1.4.0", "just-bash": "^3.0.2", "katex": "^0.16.0", "lucide-react": "^1.8.0", @@ -80,6 +81,7 @@ "marked": "^18.0.0", "path-browserify": "^1.0.1", "posthog-js": "^1.288.1", + "qrcode": "^1.5.4", "react": "^19.2.1", "react-dom": "^19.2.1", "react-hook-form": "^7.62.0", @@ -117,6 +119,7 @@ "@testing-library/react": "^16.3.0", "@types/bun": "^1.2.20", "@types/node": "^25.8.0", + "@types/qrcode": "^1.5.6", "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", "@types/sinonjs__fake-timers": "^15.0.1", @@ -1049,6 +1052,8 @@ "@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="], + "@types/qrcode": ["@types/qrcode@1.5.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw=="], + "@types/react": ["@types/react@19.2.15", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q=="], "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], @@ -1237,6 +1242,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + "caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -1325,6 +1332,8 @@ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], @@ -1361,6 +1370,8 @@ "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], + "dijkstrajs": ["dijkstrajs@1.0.3", "", {}, "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="], + "dingbat-to-unicode": ["dingbat-to-unicode@1.0.1", "", {}, "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w=="], "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], @@ -1791,6 +1802,8 @@ "jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], + "jsqr": ["jsqr@1.4.0", "", {}, "sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A=="], + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], @@ -2095,6 +2108,8 @@ "p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="], + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], "papaparse": ["papaparse@5.5.4", "", {}, "sha512-SwzWD9gl/ElwYLCI0nUja1mFJzjq2D8ziShfNBa7zCHzkOozeOGDwHWQ+tvCzEZcewecWZ5U7kUopDnG+DFYEQ=="], @@ -2183,6 +2198,8 @@ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "qrcode": ["qrcode@1.5.4", "", { "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "bin": { "qrcode": "bin/qrcode" } }, "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg=="], + "qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="], "query-selector-shadow-dom": ["query-selector-shadow-dom@1.0.1", "", {}, "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw=="], @@ -2253,6 +2270,8 @@ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "require-main-filename": ["require-main-filename@2.0.0", "", {}, "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="], + "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], @@ -2303,6 +2322,8 @@ "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], @@ -2587,6 +2608,8 @@ "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + "which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="], + "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], @@ -2801,6 +2824,10 @@ "pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + "qrcode/pngjs": ["pngjs@5.0.0", "", {}, "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="], + + "qrcode/yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], + "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], "react-docgen/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], @@ -2923,6 +2950,14 @@ "log-update/wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "qrcode/yargs/cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], + + "qrcode/yargs/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "qrcode/yargs/y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], + + "qrcode/yargs/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], + "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA=="], @@ -2982,5 +3017,19 @@ "eslint-plugin-react/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "log-update/wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "qrcode/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "qrcode/yargs/cliui/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "qrcode/yargs/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "qrcode/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "qrcode/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "qrcode/yargs/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "qrcode/yargs/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], } } diff --git a/package.json b/package.json index 81f7da565..cd86b7ff5 100644 --- a/package.json +++ b/package.json @@ -122,6 +122,7 @@ "events": "^3.3.0", "framer-motion": "^12.23.12", "input-otp": "^1.4.2", + "jsqr": "^1.4.0", "just-bash": "^3.0.2", "katex": "^0.16.0", "lucide-react": "^1.8.0", @@ -130,6 +131,7 @@ "marked": "^18.0.0", "path-browserify": "^1.0.1", "posthog-js": "^1.288.1", + "qrcode": "^1.5.4", "react": "^19.2.1", "react-dom": "^19.2.1", "react-hook-form": "^7.62.0", @@ -167,6 +169,7 @@ "@testing-library/react": "^16.3.0", "@types/bun": "^1.2.20", "@types/node": "^25.8.0", + "@types/qrcode": "^1.5.6", "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", "@types/sinonjs__fake-timers": "^15.0.1", diff --git a/src/api/encryption.ts b/src/api/encryption.ts index 382675311..4e99873ba 100644 --- a/src/api/encryption.ts +++ b/src/api/encryption.ts @@ -57,6 +57,19 @@ export const revokeDevice = async (httpClient: HttpClient, deviceId: string, can }) } +/** + * Bind a device row to an iroh P2P endpoint identity (node_id). Requires canary + * proof-of-CK-possession — only a trusted device holding the Content Key may attest it. + */ +export const setDeviceNodeId = async ( + httpClient: HttpClient, + deviceId: string, + nodeId: string, + canarySecret: string, +): Promise => { + await httpClient.post(`devices/${encodeURIComponent(deviceId)}/node-id`, { json: { nodeId, canarySecret } }) +} + /** Cancel this device's pending approval state (called by the pending device itself). */ export const cancelPending = async (httpClient: HttpClient): Promise => { await httpClient.post('devices/me/cancel-pending') diff --git a/src/components/device-qr-code.tsx b/src/components/device-qr-code.tsx new file mode 100644 index 000000000..a2c1777fc --- /dev/null +++ b/src/components/device-qr-code.tsx @@ -0,0 +1,56 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QRCode from 'qrcode' +import { useEffect, useState } from 'react' + +type DeviceQrCodeProps = { + /** The pairing string to encode (see `encodePairingTicket`). */ + value: string + /** Rendered width/height in pixels. */ + size?: number +} + +/** + * Renders a QR code for a device pairing string. Default export so it can be + * lazily loaded — the `qrcode` dependency is only pulled in when pairing UI is shown. + */ +export default function DeviceQrCode({ value, size = 160 }: DeviceQrCodeProps) { + const [dataUrl, setDataUrl] = useState(null) + const [failed, setFailed] = useState(false) + + useEffect(() => { + let cancelled = false + QRCode.toDataURL(value, { margin: 1, width: size, errorCorrectionLevel: 'M' }) + .then((url) => { + if (!cancelled) { + setFailed(false) + setDataUrl(url) + } + }) + .catch(() => { + if (!cancelled) { + setFailed(true) + } + }) + return () => { + cancelled = true + } + }, [value, size]) + + if (failed) { + return

Could not render pairing code.

+ } + + return ( + Device pairing QR code + ) +} diff --git a/src/components/set-node-id-dialog.tsx b/src/components/set-node-id-dialog.tsx new file mode 100644 index 000000000..d17110f31 --- /dev/null +++ b/src/components/set-node-id-dialog.tsx @@ -0,0 +1,129 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { Button } from '@/components/ui/button' +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' +import { Textarea } from '@/components/ui/textarea' +import { decodePairingTicket } from '@/lib/pairing-ticket' +import { decodeQrFromFile } from '@/lib/qr-scan' +import { Loader2, Upload } from 'lucide-react' +import { useRef, useState } from 'react' + +type SetNodeIdDialogProps = { + open: boolean + onOpenChange: (open: boolean) => void + deviceName: string + onConfirm: (nodeId: string) => void + isPending: boolean +} + +type Status = { kind: 'idle' } | { kind: 'scanning' } | { kind: 'error'; message: string } + +/** + * Lets a trusted device bind a P2P pairing identity onto a device row by pasting a + * pairing code or scanning one from an uploaded QR image. Default export for lazy loading. + */ +export default function SetNodeIdDialog({ + open, + onOpenChange, + deviceName, + onConfirm, + isPending, +}: SetNodeIdDialogProps) { + const [text, setText] = useState('') + const [status, setStatus] = useState({ kind: 'idle' }) + const fileInputRef = useRef(null) + + const handleFile = async (file: File) => { + setStatus({ kind: 'scanning' }) + try { + const decoded = await decodeQrFromFile(file) + setText(decoded) + setStatus({ kind: 'idle' }) + } catch (err) { + setStatus({ kind: 'error', message: err instanceof Error ? err.message : 'Could not read QR code' }) + } + } + + const handleSave = () => { + try { + const { nodeId } = decodePairingTicket(text) + onConfirm(nodeId) + } catch (err) { + setStatus({ kind: 'error', message: err instanceof Error ? err.message : 'Invalid pairing code' }) + } + } + + const scanning = status.kind === 'scanning' + + return ( + + + + Pair {deviceName} + + Paste a pairing code or upload its QR image to bind this device to its peer-to-peer identity. + + + +
+

>d&d7`|NZFn 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