diff --git a/npm/.gitignore b/npm/.gitignore new file mode 100644 index 0000000000..9d41eb50ea --- /dev/null +++ b/npm/.gitignore @@ -0,0 +1 @@ +*/bin/ diff --git a/npm/README.md b/npm/README.md new file mode 100644 index 0000000000..ecddcc84af --- /dev/null +++ b/npm/README.md @@ -0,0 +1,35 @@ +# Native Binary Packages + +This directory contains the npm package scaffolding for distributing the +`goose-acp-server` Rust binary as platform-specific npm packages. + +## Packages + +| Package | Platform | +|---------|----------| +| `@block/goose-acp-server-darwin-arm64` | macOS Apple Silicon | +| `@block/goose-acp-server-darwin-x64` | macOS Intel | +| `@block/goose-acp-server-linux-arm64` | Linux ARM64 | +| `@block/goose-acp-server-linux-x64` | Linux x64 | +| `@block/goose-acp-server-win32-x64` | Windows x64 | + +## Building + +From the repository root: + +```bash +# Build for all platforms (requires cross-compilation toolchains) +./ui/text/scripts/build-native-packages.sh + +# Build for a single platform +./ui/text/scripts/build-native-packages.sh darwin-arm64 +``` + +The built binaries are placed into `npm/goose-acp-server-{platform}/bin/`. +These directories are git-ignored. + +## Publishing + +```bash +./ui/text/scripts/publish.sh +``` diff --git a/npm/goose-acp-server-darwin-arm64/package.json b/npm/goose-acp-server-darwin-arm64/package.json new file mode 100644 index 0000000000..4c659f6def --- /dev/null +++ b/npm/goose-acp-server-darwin-arm64/package.json @@ -0,0 +1,19 @@ +{ + "name": "@block/goose-acp-server-darwin-arm64", + "version": "0.1.0", + "description": "Goose ACP server binary for macOS ARM64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/block/goose.git" + }, + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ], + "files": [ + "bin/goose-acp-server" + ] +} diff --git a/npm/goose-acp-server-darwin-x64/package.json b/npm/goose-acp-server-darwin-x64/package.json new file mode 100644 index 0000000000..f477ffa09f --- /dev/null +++ b/npm/goose-acp-server-darwin-x64/package.json @@ -0,0 +1,19 @@ +{ + "name": "@block/goose-acp-server-darwin-x64", + "version": "0.1.0", + "description": "Goose ACP server binary for macOS x64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/block/goose.git" + }, + "os": [ + "darwin" + ], + "cpu": [ + "x64" + ], + "files": [ + "bin/goose-acp-server" + ] +} diff --git a/npm/goose-acp-server-linux-arm64/package.json b/npm/goose-acp-server-linux-arm64/package.json new file mode 100644 index 0000000000..363570a1c1 --- /dev/null +++ b/npm/goose-acp-server-linux-arm64/package.json @@ -0,0 +1,19 @@ +{ + "name": "@block/goose-acp-server-linux-arm64", + "version": "0.1.0", + "description": "Goose ACP server binary for Linux ARM64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/block/goose.git" + }, + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "files": [ + "bin/goose-acp-server" + ] +} diff --git a/npm/goose-acp-server-linux-x64/package.json b/npm/goose-acp-server-linux-x64/package.json new file mode 100644 index 0000000000..a6473be396 --- /dev/null +++ b/npm/goose-acp-server-linux-x64/package.json @@ -0,0 +1,19 @@ +{ + "name": "@block/goose-acp-server-linux-x64", + "version": "0.1.0", + "description": "Goose ACP server binary for Linux x64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/block/goose.git" + }, + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "files": [ + "bin/goose-acp-server" + ] +} diff --git a/npm/goose-acp-server-win32-x64/package.json b/npm/goose-acp-server-win32-x64/package.json new file mode 100644 index 0000000000..9aea886231 --- /dev/null +++ b/npm/goose-acp-server-win32-x64/package.json @@ -0,0 +1,19 @@ +{ + "name": "@block/goose-acp-server-win32-x64", + "version": "0.1.0", + "description": "Goose ACP server binary for Windows x64", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/block/goose.git" + }, + "os": [ + "win32" + ], + "cpu": [ + "x64" + ], + "files": [ + "bin/goose-acp-server.exe" + ] +} diff --git a/ui/text/.npmrc b/ui/.npmrc similarity index 100% rename from ui/text/.npmrc rename to ui/.npmrc diff --git a/ui/acp/.gitignore b/ui/acp/.gitignore new file mode 100644 index 0000000000..1eae0cf670 --- /dev/null +++ b/ui/acp/.gitignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ diff --git a/ui/acp/package.json b/ui/acp/package.json index 94b98b968e..3978c06c66 100644 --- a/ui/acp/package.json +++ b/ui/acp/package.json @@ -1,11 +1,14 @@ { - "name": "goose-acp-types", + "name": "@block/goose-acp", "version": "0.1.0", - "private": true, "type": "module", - "main": "./src/index.ts", - "types": "./src/index.ts", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], "scripts": { + "build": "tsc", "generate": "tsx generate-schema.ts", "lint": "tsc --noEmit", "format": "prettier --write src/" diff --git a/ui/acp/src/goose-client.ts b/ui/acp/src/goose-client.ts index f64a190329..306632838c 100644 --- a/ui/acp/src/goose-client.ts +++ b/ui/acp/src/goose-client.ts @@ -27,12 +27,17 @@ import { type SetSessionModelResponse, } from "@agentclientprotocol/sdk"; import { GooseExtClient } from "./generated/client.gen.js"; +import { createHttpStream } from "./http-stream.js"; export class GooseClient { private conn: ClientSideConnection; private ext: GooseExtClient; - constructor(toClient: () => Client, stream: Stream) { + constructor(toClient: () => Client, streamOrUrl: Stream | string) { + const stream = + typeof streamOrUrl === "string" + ? createHttpStream(streamOrUrl) + : streamOrUrl; this.conn = new ClientSideConnection(toClient, stream); this.ext = new GooseExtClient(this.conn); } diff --git a/ui/text/src/transport.ts b/ui/acp/src/http-stream.ts similarity index 88% rename from ui/text/src/transport.ts rename to ui/acp/src/http-stream.ts index 193b5a1375..c9ebfb6eed 100644 --- a/ui/text/src/transport.ts +++ b/ui/acp/src/http-stream.ts @@ -41,6 +41,7 @@ export function createHttpStream(serverUrl: string): Stream { const msg = JSON.parse(line.slice(6)) as AnyMessage; pushMessage(msg); } catch { + // ignore malformed JSON } } } @@ -51,10 +52,6 @@ export function createHttpStream(serverUrl: string): Stream { } } - // POST initialize (no session header) opens a long-lived SSE stream that receives - // ALL subsequent responses and notifications. Later POSTs with the session header - // are fire-and-forget for requests (responses arrive on the first stream) or - // return 202 immediately for notifications/responses. let isFirstRequest = true; const readable = new ReadableStream({ @@ -69,7 +66,10 @@ export function createHttpStream(serverUrl: string): Stream { const writable = new WritableStream({ async write(msg) { const isRequest = - "method" in msg && "id" in msg && msg.id !== undefined && msg.id !== null; + "method" in msg && + "id" in msg && + msg.id !== undefined && + msg.id !== null; const headers: Record = { "Content-Type": "application/json", diff --git a/ui/acp/src/index.ts b/ui/acp/src/index.ts index eb8a86ec5a..9e4f469d24 100644 --- a/ui/acp/src/index.ts +++ b/ui/acp/src/index.ts @@ -1,6 +1,7 @@ export * from "./generated/types.gen.js"; export * from "./generated/zod.gen.js"; export { GooseClient } from "./goose-client.js"; +export { createHttpStream } from "./http-stream.js"; export { ClientSideConnection, diff --git a/ui/acp/tsconfig.json b/ui/acp/tsconfig.json index 8c18285d40..138847cae9 100644 --- a/ui/acp/tsconfig.json +++ b/ui/acp/tsconfig.json @@ -1,14 +1,15 @@ { "compilerOptions": { "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", + "module": "NodeNext", + "moduleResolution": "nodenext", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "declaration": true, + "declarationMap": true, "outDir": "./dist", - "rootDir": "./src" + "rootDir": "./src", }, - "include": ["src"] + "include": ["src"], } diff --git a/ui/package-lock.json b/ui/package-lock.json new file mode 100644 index 0000000000..f7e1a20ad6 --- /dev/null +++ b/ui/package-lock.json @@ -0,0 +1,2335 @@ +{ + "name": "ui", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "workspaces": [ + "acp", + "text" + ] + }, + "acp": { + "name": "@block/goose-acp", + "version": "0.1.0", + "dependencies": { + "zod": "^3.25.76" + }, + "devDependencies": { + "@agentclientprotocol/sdk": "^0.14.1", + "@hey-api/openapi-ts": "^0.92.3", + "prettier": "^3.8.1", + "tsx": "^4.21.0", + "typescript": "~5.9.3" + }, + "peerDependencies": { + "@agentclientprotocol/sdk": "*" + } + }, + "acp/node_modules/@hey-api/codegen-core": { + "version": "0.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@hey-api/types": "0.1.3", + "ansi-colors": "4.1.3", + "c12": "3.3.3", + "color-support": "1.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + }, + "peerDependencies": { + "typescript": ">=5.5.3" + } + }, + "acp/node_modules/@hey-api/json-schema-ref-parser": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "7.1.3", + "@types/json-schema": "7.0.15", + "js-yaml": "4.1.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + } + }, + "acp/node_modules/@hey-api/openapi-ts": { + "version": "0.92.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@hey-api/codegen-core": "0.7.0", + "@hey-api/json-schema-ref-parser": "1.3.0", + "@hey-api/shared": "0.2.0", + "@hey-api/types": "0.1.3", + "ansi-colors": "4.1.3", + "color-support": "1.1.3", + "commander": "14.0.3" + }, + "bin": { + "openapi-ts": "bin/run.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + }, + "peerDependencies": { + "typescript": ">=5.5.3" + } + }, + "acp/node_modules/@hey-api/shared": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@hey-api/codegen-core": "0.7.0", + "@hey-api/json-schema-ref-parser": "1.3.0", + "@hey-api/types": "0.1.3", + "ansi-colors": "4.1.3", + "cross-spawn": "7.0.6", + "open": "11.0.0", + "semver": "7.7.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + }, + "peerDependencies": { + "typescript": ">=5.5.3" + } + }, + "acp/node_modules/@hey-api/types": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.5.3" + } + }, + "acp/node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/ansi-colors": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "acp/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "acp/node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/c12": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^17.2.3", + "exsolve": "^1.0.8", + "giget": "^2.0.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.0.0", + "pkg-types": "^2.3.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "acp/node_modules/chokidar": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "acp/node_modules/citty": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "acp/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "acp/node_modules/commander": { + "version": "14.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "acp/node_modules/confbox": { + "version": "0.2.4", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/consola": { + "version": "3.4.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "acp/node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "acp/node_modules/default-browser": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/default-browser-id": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/defu": { + "version": "6.1.4", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/destr": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/dotenv": { + "version": "17.3.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "acp/node_modules/exsolve": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/giget": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "acp/node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/is-in-ssh": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/is-wsl": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "acp/node_modules/jiti": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "acp/node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "acp/node_modules/node-fetch-native": { + "version": "1.6.7", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/nypm": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.2.0", + "pathe": "^2.0.3", + "tinyexec": "^1.0.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "acp/node_modules/nypm/node_modules/citty": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/ohash": { + "version": "2.0.11", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/open": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "acp/node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/perfect-debounce": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "acp/node_modules/pkg-types": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "acp/node_modules/powershell-utils": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/prettier": { + "version": "3.8.1", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "acp/node_modules/rc9": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "acp/node_modules/readdirp": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "acp/node_modules/run-applescript": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/semver": { + "version": "7.7.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "acp/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "acp/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "acp/node_modules/tinyexec": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "acp/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "acp/node_modules/wsl-utils": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "acp/node_modules/zod": { + "version": "3.25.76", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@agentclientprotocol/sdk": { + "version": "0.14.1", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@agentclientprotocol/sdk/-/sdk-0.14.1.tgz", + "integrity": "sha512-b6r3PS3Nly+Wyw9U+0nOr47bV8tfS476EgyEMhoKvJCZLbgqoDFN7DJwkxL88RR0aiOqOYV1ZnESHqb+RmdH8w==", + "license": "Apache-2.0", + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/@alcalzone/ansi-tokenize": { + "version": "0.1.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", + "integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=14.13.1" + } + }, + "node_modules/@block/goose": { + "resolved": "text", + "link": true + }, + "node_modules/@block/goose-acp": { + "resolved": "acp", + "link": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/node": { + "version": "25.3.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "devOptional": true, + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "license": "MIT", + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-toolkit": { + "version": "1.44.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/es-toolkit/-/es-toolkit-1.44.0.tgz", + "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ink": { + "version": "5.2.1", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/ink/-/ink-5.2.1.tgz", + "integrity": "sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@alcalzone/ansi-tokenize": "^0.1.3", + "ansi-escapes": "^7.0.0", + "ansi-styles": "^6.2.1", + "auto-bind": "^5.0.1", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "cli-cursor": "^4.0.0", + "cli-truncate": "^4.0.0", + "code-excerpt": "^4.0.0", + "es-toolkit": "^1.22.0", + "indent-string": "^5.0.0", + "is-in-ci": "^1.0.0", + "patch-console": "^2.0.0", + "react-reconciler": "^0.29.0", + "scheduler": "^0.23.0", + "signal-exit": "^3.0.7", + "slice-ansi": "^7.1.0", + "stack-utils": "^2.0.6", + "string-width": "^7.2.0", + "type-fest": "^4.27.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0", + "ws": "^8.18.0", + "yoga-layout": "~3.2.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "react": ">=18.0.0", + "react-devtools-core": "^4.19.1" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } + } + }, + "node_modules/ink-text-input": { + "version": "6.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/ink-text-input/-/ink-text-input-6.0.0.tgz", + "integrity": "sha512-Fw64n7Yha5deb1rHY137zHTAbSTNelUKuB5Kkk2HACXEtwIHBCf9OH2tP/LQ9fRYTl1F0dZgbW0zPnZk6FA9Lw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "type-fest": "^4.18.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "ink": ">=5", + "react": ">=18" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-in-ci": { + "version": "1.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/is-in-ci/-/is-in-ci-1.0.0.tgz", + "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==", + "license": "MIT", + "bin": { + "is-in-ci": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-console": { + "version": "2.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/patch-console/-/patch-console-2.0.0.tgz", + "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-reconciler": { + "version": "0.29.2", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/react-reconciler/-/react-reconciler-0.29.2.tgz", + "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "license": "MIT" + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://global.block-artifacts.com/artifactory/api/npm/square-npm/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "text": { + "name": "@block/goose", + "version": "0.1.0", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@agentclientprotocol/sdk": "^0.14.1", + "@block/goose-acp": "^0.1.0", + "ink": "^5.1.0", + "ink-text-input": "^6.0.0", + "meow": "^13.2.0", + "react": "^18.3.1" + }, + "bin": { + "goose": "dist/cli.js" + }, + "devDependencies": { + "@types/node": "^25.2.3", + "@types/react": "^18.3.0", + "esbuild": "^0.25.0", + "tsx": "^4.19.0", + "typescript": "^5.7.0" + }, + "optionalDependencies": { + "@block/goose-acp-server-darwin-arm64": "0.1.0", + "@block/goose-acp-server-darwin-x64": "0.1.0", + "@block/goose-acp-server-linux-arm64": "0.1.0", + "@block/goose-acp-server-linux-x64": "0.1.0", + "@block/goose-acp-server-win32-x64": "0.1.0" + } + }, + "text/node_modules/@block/goose-acp-server-darwin-arm64": { + "optional": true + }, + "text/node_modules/@block/goose-acp-server-darwin-x64": { + "optional": true + }, + "text/node_modules/@block/goose-acp-server-linux-arm64": { + "optional": true + }, + "text/node_modules/@block/goose-acp-server-linux-x64": { + "optional": true + }, + "text/node_modules/@block/goose-acp-server-win32-x64": { + "optional": true + } + } +} diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000000..83cf54c8e2 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,7 @@ +{ + "private": true, + "workspaces": [ + "acp", + "text" + ] +} diff --git a/ui/scripts/publish.sh b/ui/scripts/publish.sh new file mode 100755 index 0000000000..6630542f07 --- /dev/null +++ b/ui/scripts/publish.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Publishes @block/goose-acp, @block/goose, and all native binary packages to npm. +# +# Usage: +# ./ui/scripts/publish.sh # publish all (dry-run) +# ./ui/scripts/publish.sh --real # publish for real +# +# Prerequisites: +# - npm login to the @block scope +# - Native binaries built via build-native-packages.sh + +REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +NPM_DIR="${REPO_ROOT}/npm" +ACP_DIR="${REPO_ROOT}/ui/acp" +TEXT_DIR="${REPO_ROOT}/ui/text" + +DRY_RUN="--dry-run" +if [[ "${1:-}" == "--real" ]]; then + DRY_RUN="" + echo "==> Publishing for real" +else + echo "==> Dry run (pass --real to publish)" +fi + +# Build and publish @block/goose-acp first (dependency of @block/goose) +echo "==> Building @block/goose-acp" +(cd "${ACP_DIR}" && npm run build) + +echo "==> Publishing @block/goose-acp" +(cd "${ACP_DIR}" && npm publish --access public ${DRY_RUN}) + +# Build @block/goose +echo "==> Building @block/goose" +(cd "${TEXT_DIR}" && npm run build) + +NATIVE_PACKAGES=( + "goose-acp-server-darwin-arm64" + "goose-acp-server-darwin-x64" + "goose-acp-server-linux-arm64" + "goose-acp-server-linux-x64" + "goose-acp-server-win32-x64" +) + +# Publish native binary packages +for pkg in "${NATIVE_PACKAGES[@]}"; do + pkg_dir="${NPM_DIR}/${pkg}" + + if [ ! -f "${pkg_dir}/bin/goose-acp-server" ] && [ ! -f "${pkg_dir}/bin/goose-acp-server.exe" ]; then + echo " SKIP ${pkg} (no binary found โ€” run build-native-packages.sh first)" + continue + fi + + echo "==> Publishing @block/${pkg}" + (cd "${pkg_dir}" && npm publish --access public ${DRY_RUN}) +done + +# Publish the main package +echo "==> Publishing @block/goose" +(cd "${TEXT_DIR}" && npm publish --access public ${DRY_RUN}) + +echo "==> Done" diff --git a/ui/text/.gitignore b/ui/text/.gitignore index 1521c8b765..5712d1d0b4 100644 --- a/ui/text/.gitignore +++ b/ui/text/.gitignore @@ -1 +1,3 @@ dist +node_modules +server-binary.json diff --git a/ui/text/package-lock.json b/ui/text/package-lock.json index bf6499854a..dedfa1a349 100644 --- a/ui/text/package-lock.json +++ b/ui/text/package-lock.json @@ -1,49 +1,50 @@ { - "name": "goose-text", + "name": "@block/goose", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "goose-text", + "name": "@block/goose", "version": "0.1.0", + "bundleDependencies": [ + "@block/goose-acp" + ], + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@agentclientprotocol/sdk": "^0.14.1", - "@goose/acp": "file:../acp", + "@block/goose-acp": "file:../acp", "ink": "^5.1.0", "ink-text-input": "^6.0.0", "meow": "^13.2.0", "react": "^18.3.1" }, + "bin": { + "goose": "dist/tui.js" + }, "devDependencies": { "@types/node": "^25.2.3", "@types/react": "^18.3.0", + "esbuild": "^0.25.0", "tsx": "^4.19.0", "typescript": "^5.7.0" - } - }, - "../acp": { - "name": "goose-acp-types", - "version": "0.1.0", - "dependencies": { - "zod": "^3.25.76" }, - "devDependencies": { - "@agentclientprotocol/sdk": "^0.14.1", - "@hey-api/openapi-ts": "^0.92.3", - "prettier": "^3.8.1", - "tsx": "^4.21.0", - "typescript": "~5.9.3" - }, - "peerDependencies": { - "@agentclientprotocol/sdk": "*" + "optionalDependencies": { + "@block/goose-acp-server-darwin-arm64": "0.1.0", + "@block/goose-acp-server-darwin-x64": "0.1.0", + "@block/goose-acp-server-linux-arm64": "0.1.0", + "@block/goose-acp-server-linux-x64": "0.1.0", + "@block/goose-acp-server-win32-x64": "0.1.0" } }, "node_modules/@agentclientprotocol/sdk": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-0.14.1.tgz", "integrity": "sha512-b6r3PS3Nly+Wyw9U+0nOr47bV8tfS476EgyEMhoKvJCZLbgqoDFN7DJwkxL88RR0aiOqOYV1ZnESHqb+RmdH8w==", + "inBundle": true, "license": "Apache-2.0", + "peer": true, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } @@ -61,10 +62,46 @@ "node": ">=14.13.1" } }, + "node_modules/@block/goose-acp": { + "version": "0.1.0", + "resolved": "file:../acp", + "inBundle": true, + "dependencies": { + "zod": "^3.25.76" + }, + "peerDependencies": { + "@agentclientprotocol/sdk": "*" + } + }, + "node_modules/@block/goose-acp-server-darwin-arm64": { + "optional": true + }, + "node_modules/@block/goose-acp-server-darwin-x64": { + "optional": true + }, + "node_modules/@block/goose-acp-server-linux-arm64": { + "optional": true + }, + "node_modules/@block/goose-acp-server-linux-x64": { + "optional": true + }, + "node_modules/@block/goose-acp-server-win32-x64": { + "optional": true + }, + "node_modules/@block/goose-acp/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -79,9 +116,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -96,9 +133,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -113,9 +150,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -130,9 +167,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -147,9 +184,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -164,9 +201,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -181,9 +218,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -198,9 +235,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -215,9 +252,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -232,9 +269,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -249,9 +286,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -266,9 +303,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -283,9 +320,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -300,9 +337,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -317,9 +354,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -334,9 +371,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -351,9 +388,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -368,9 +405,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -385,9 +422,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -402,9 +439,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -419,9 +456,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", "cpu": [ "arm64" ], @@ -436,9 +473,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -453,9 +490,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -470,9 +507,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -487,9 +524,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -503,10 +540,6 @@ "node": ">=18" } }, - "node_modules/@goose/acp": { - "resolved": "../acp", - "link": true - }, "node_modules/@types/node": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", @@ -715,9 +748,9 @@ ] }, "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -728,32 +761,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/escape-string-regexp": { @@ -1138,6 +1171,490 @@ "fsevents": "~2.3.3" } }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, "node_modules/type-fest": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", @@ -1234,6 +1751,7 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "inBundle": true, "license": "MIT", "peer": true, "funding": { diff --git a/ui/text/package.json b/ui/text/package.json index ded27fb2af..741932f20f 100644 --- a/ui/text/package.json +++ b/ui/text/package.json @@ -1,24 +1,49 @@ { - "name": "goose-text", + "name": "@block/goose", "version": "0.1.0", - "private": true, + "description": "Goose - an open-source AI agent", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/block/goose.git" + }, "type": "module", + "bin": { + "goose": "dist/tui.js" + }, + "files": [ + "dist", + "scripts/postinstall.mjs", + "server-binary.json" + ], "scripts": { "build": "tsc", - "start": "tsx src/cli.tsx", + "start": "tsx src/tui.tsx", + "postinstall": "node scripts/postinstall.mjs", "lint": "tsc --noEmit" }, "dependencies": { "@agentclientprotocol/sdk": "^0.14.1", - "@goose/acp": "file:../acp", + "@block/goose-acp": "^0.1.0", "ink": "^5.1.0", "ink-text-input": "^6.0.0", + "marked": "^15.0.12", + "marked-terminal": "^7.3.0", "meow": "^13.2.0", "react": "^18.3.1" }, + "optionalDependencies": { + "@block/goose-acp-server-darwin-arm64": "0.1.0", + "@block/goose-acp-server-darwin-x64": "0.1.0", + "@block/goose-acp-server-linux-arm64": "0.1.0", + "@block/goose-acp-server-linux-x64": "0.1.0", + "@block/goose-acp-server-win32-x64": "0.1.0" + }, "devDependencies": { + "@types/marked-terminal": "^6.1.1", "@types/node": "^25.2.3", "@types/react": "^18.3.0", + "esbuild": "^0.25.0", "tsx": "^4.19.0", "typescript": "^5.7.0" } diff --git a/ui/text/scripts/build-native-packages.sh b/ui/text/scripts/build-native-packages.sh new file mode 100755 index 0000000000..dab0d9cf78 --- /dev/null +++ b/ui/text/scripts/build-native-packages.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Builds the goose-acp-server binary for each target platform and places it +# into the corresponding npm package directory under npm/. +# +# Usage: +# ./ui/text/scripts/build-native-packages.sh # build all targets +# ./ui/text/scripts/build-native-packages.sh darwin-arm64 # build one target +# +# Prerequisites: +# - Rust cross-compilation toolchains installed for each target +# - Run from the repository root + +REPO_ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" +NPM_DIR="${REPO_ROOT}/npm" + +declare -A RUST_TARGETS=( + ["darwin-arm64"]="aarch64-apple-darwin" + ["darwin-x64"]="x86_64-apple-darwin" + ["linux-arm64"]="aarch64-unknown-linux-gnu" + ["linux-x64"]="x86_64-unknown-linux-gnu" + ["win32-x64"]="x86_64-pc-windows-msvc" +) + +build_target() { + local platform="$1" + local rust_target="${RUST_TARGETS[$platform]}" + local pkg_dir="${NPM_DIR}/goose-acp-server-${platform}" + local bin_dir="${pkg_dir}/bin" + + echo "==> Building goose-acp-server for ${platform} (${rust_target})" + + cargo build --release --target "${rust_target}" --bin goose-acp-server + + mkdir -p "${bin_dir}" + + local ext="" + if [[ "$platform" == win32-* ]]; then + ext=".exe" + fi + + cp "${REPO_ROOT}/target/${rust_target}/release/goose-acp-server${ext}" "${bin_dir}/goose-acp-server${ext}" + chmod +x "${bin_dir}/goose-acp-server${ext}" + + echo " Placed binary at ${bin_dir}/goose-acp-server${ext}" +} + +if [ $# -gt 0 ]; then + # Build specific target(s) + for target in "$@"; do + if [[ -z "${RUST_TARGETS[$target]+x}" ]]; then + echo "Unknown target: ${target}" + echo "Valid targets: ${!RUST_TARGETS[*]}" + exit 1 + fi + build_target "$target" + done +else + # Build all targets + for platform in "${!RUST_TARGETS[@]}"; do + build_target "$platform" + done +fi + +echo "==> Done. Native packages staged in ${NPM_DIR}/" diff --git a/ui/text/scripts/postinstall.mjs b/ui/text/scripts/postinstall.mjs new file mode 100644 index 0000000000..72042c74d8 --- /dev/null +++ b/ui/text/scripts/postinstall.mjs @@ -0,0 +1,57 @@ +#!/usr/bin/env node + +// Resolves the path to the goose-acp-server binary from the platform-specific +// optional dependency. Writes the result to a JSON file that the CLI reads at +// startup so it can spawn the server automatically. + +import { writeFileSync, mkdirSync } from "node:fs"; +import { createRequire } from "node:module"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const require = createRequire(import.meta.url); + +const PLATFORMS = { + "darwin-arm64": "@block/goose-acp-server-darwin-arm64", + "darwin-x64": "@block/goose-acp-server-darwin-x64", + "linux-arm64": "@block/goose-acp-server-linux-arm64", + "linux-x64": "@block/goose-acp-server-linux-x64", + "win32-x64": "@block/goose-acp-server-win32-x64", +}; + +const key = `${process.platform}-${process.arch}`; +const pkg = PLATFORMS[key]; + +if (!pkg) { + console.warn( + `@block/goose: no prebuilt goose-acp-server binary for ${key}. ` + + `You will need to provide a server URL manually with --server.`, + ); + process.exit(0); +} + +let binaryPath; +try { + // Resolve the package directory, then point at the binary inside it + const pkgDir = dirname(require.resolve(`${pkg}/package.json`)); + const binName = + process.platform === "win32" ? "goose-acp-server.exe" : "goose-acp-server"; + binaryPath = join(pkgDir, "bin", binName); +} catch { + // The optional dependency wasn't installed (e.g. wrong platform). That's fine. + console.warn( + `@block/goose: optional dependency ${pkg} not installed. ` + + `You will need to provide a server URL manually with --server.`, + ); + process.exit(0); +} + +const outDir = join(__dirname, ".."); +mkdirSync(outDir, { recursive: true }); +writeFileSync( + join(outDir, "server-binary.json"), + JSON.stringify({ binaryPath }, null, 2) + "\n", +); + +console.log(`@block/goose: found native server binary at ${binaryPath}`); diff --git a/ui/text/src/cli.tsx b/ui/text/src/cli.tsx deleted file mode 100644 index 568890a1b9..0000000000 --- a/ui/text/src/cli.tsx +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env node -import React from "react"; -import { render } from "ink"; -import meow from "meow"; -import App from "./app.js"; - -const cli = meow( - ` - Usage - $ goose-text - - Options - --server, -s Server URL (default: http://127.0.0.1:3284) - --text, -t Send a single prompt and exit -`, - { - importMeta: import.meta, - flags: { - server: { type: "string", shortFlag: "s", default: "http://127.0.0.1:3284" }, - text: { type: "string", shortFlag: "t" }, - }, - } -); - -render(); diff --git a/ui/text/src/colors.tsx b/ui/text/src/colors.tsx new file mode 100644 index 0000000000..4c5bcb319d --- /dev/null +++ b/ui/text/src/colors.tsx @@ -0,0 +1,7 @@ +export const CRANBERRY = "#C0354A"; +export const TEAL = "#3A7D7B"; +export const GOLD = "#C4883A"; +export const TEXT_PRIMARY = "#E8E4DF"; +export const TEXT_SECONDARY = "#8FA4BD"; +export const TEXT_DIM = "#5A6D84"; +export const RULE_COLOR = "#2E3D54"; diff --git a/ui/text/src/markdown.tsx b/ui/text/src/markdown.tsx new file mode 100644 index 0000000000..2345333622 --- /dev/null +++ b/ui/text/src/markdown.tsx @@ -0,0 +1,10 @@ +import { marked } from "marked"; +import { markedTerminal } from "marked-terminal"; + +marked.use(markedTerminal({ width: 76, reflowText: true, tab: 2 }) as any); + +export function renderMarkdown(src: string): string { + if (!src) return ""; + const rendered = marked.parse(src) as string; + return rendered.replace(/\n+$/, ""); +} diff --git a/ui/text/src/toolcall.tsx b/ui/text/src/toolcall.tsx new file mode 100644 index 0000000000..e0fd61b8ee --- /dev/null +++ b/ui/text/src/toolcall.tsx @@ -0,0 +1,279 @@ +import React from "react"; +import { Box, Text } from "ink"; +import type { + ToolCallContent, + ToolCallStatus, + ToolKind, +} from "@agentclientprotocol/sdk"; +import { CRANBERRY, TEAL, GOLD, TEXT_SECONDARY, TEXT_DIM } from "./colors.js"; + +export interface ToolCallInfo { + toolCallId: string; + title: string; + status: ToolCallStatus; + kind?: ToolKind; + rawInput?: unknown; + rawOutput?: unknown; + content?: ToolCallContent[]; + locations?: Array<{ path: string; line?: number | null }>; +} + +const CEDAR = "#6B5344"; + +const KIND_ICONS: Record = { + read: "๐Ÿ“–", + edit: "โœ๏ธ", + delete: "๐Ÿ—‘", + move: "๐Ÿ“ฆ", + search: "๐Ÿ”", + execute: "โ–ถ", + think: "๐Ÿ’ญ", + fetch: "๐ŸŒ", + switch_mode: "๐Ÿ”€", + other: "โš™", +}; + +const STATUS_INDICATORS: Record = { + pending: { icon: "โ—‹", color: TEXT_DIM }, + in_progress: { icon: "โ—‘", color: GOLD }, + completed: { icon: "โ—", color: TEAL }, + failed: { icon: "โœ—", color: CRANBERRY }, +}; + +function formatJsonCompact(value: unknown, maxWidth: number): string[] { + if (value === undefined || value === null) return []; + let raw: string; + try { + raw = JSON.stringify(value, null, 2); + } catch { + raw = String(value); + } + const lines = raw.split("\n"); + const result: string[] = []; + for (const line of lines) { + if (line.length <= maxWidth) { + result.push(line); + } else { + let remaining = line; + while (remaining.length > maxWidth) { + result.push(remaining.slice(0, maxWidth)); + remaining = remaining.slice(maxWidth); + } + if (remaining) result.push(remaining); + } + } + return result; +} + +function extractTextFromContent(content: ToolCallContent[]): string[] { + const lines: string[] = []; + for (const item of content) { + if (item.type === "content" && item.content) { + const block = item.content as any; + if (block.type === "text" && block.text) { + lines.push(...block.text.split("\n")); + } + } else if (item.type === "diff") { + const diff = item as any; + lines.push(`diff: ${diff.path || "unknown"}`); + } else if (item.type === "terminal") { + const term = item as any; + lines.push(`terminal: ${term.terminalId || "unknown"}`); + } + } + return lines; +} + +function summarizeContent(info: ToolCallInfo): string { + const parts: string[] = []; + + if (info.locations && info.locations.length > 0) { + for (const loc of info.locations) { + parts.push(loc.path + (loc.line ? `:${loc.line}` : "")); + } + } + + if (info.content && info.content.length > 0) { + const textLines = extractTextFromContent(info.content); + if (textLines.length > 0) { + const first = textLines[0]!.trim(); + if (first.length > 60) { + parts.push(first.slice(0, 57) + "โ€ฆ"); + } else if (first) { + parts.push(first); + } + } + } + + if (parts.length === 0 && info.rawOutput !== undefined && info.rawOutput !== null) { + const raw = String( + typeof info.rawOutput === "string" ? info.rawOutput : JSON.stringify(info.rawOutput), + ); + const firstLine = raw.split("\n")[0] ?? ""; + if (firstLine.length > 60) { + parts.push(firstLine.slice(0, 57) + "โ€ฆ"); + } else if (firstLine) { + parts.push(firstLine); + } + } + + return parts.join(" ยท "); +} + +const MAX_PREVIEW_LINES = 8; + +export function findFeaturedToolCallId( + toolCallOrder: string[], + toolCalls: Map, +): string | undefined { + for (let i = toolCallOrder.length - 1; i >= 0; i--) { + const tc = toolCalls.get(toolCallOrder[i]!); + if (tc && (tc.status === "pending" || tc.status === "in_progress")) { + return toolCallOrder[i]!; + } + } + return toolCallOrder[toolCallOrder.length - 1]; +} + +export function buildToolCallCardLines( + info: ToolCallInfo, + indent: number, + totalWidth: number, + expanded: boolean, + keyPrefix: string = "card", +): React.ReactNode[] { + const cardWidth = Math.min(totalWidth - indent - 2, 72); + const innerWidth = cardWidth - 2; + const contentWidth = innerWidth - 2; + const kindIcon = KIND_ICONS[info.kind ?? "other"] ?? "โš™"; + const statusInfo = STATUS_INDICATORS[info.status] ?? STATUS_INDICATORS.pending!; + const borderColor = info.status === "failed" ? CRANBERRY : CEDAR; + const dimBorder = info.status !== "failed"; + + const hasInput = info.rawInput !== undefined && info.rawInput !== null; + const hasOutput = info.rawOutput !== undefined && info.rawOutput !== null; + const hasContent = info.content && info.content.length > 0; + const hasLocations = info.locations && info.locations.length > 0; + + const inputLines = hasInput ? formatJsonCompact(info.rawInput, contentWidth - 6) : []; + const outputLines = hasOutput ? formatJsonCompact(info.rawOutput, contentWidth - 6) : []; + const contentLines = hasContent ? extractTextFromContent(info.content!) : []; + + const shownInput = expanded ? inputLines : inputLines.slice(0, MAX_PREVIEW_LINES); + const shownOutput = expanded ? outputLines : outputLines.slice(0, MAX_PREVIEW_LINES); + const shownContent = expanded ? contentLines : contentLines.slice(0, MAX_PREVIEW_LINES); + + const hasTruncated = + inputLines.length > MAX_PREVIEW_LINES || + outputLines.length > MAX_PREVIEW_LINES || + contentLines.length > MAX_PREVIEW_LINES; + + const bodyRows: Array<{ text: string; color?: string; italic?: boolean }> = []; + + const runningText = info.status === "in_progress" ? " runningโ€ฆ" : ""; + const tabHint = hasTruncated && !expanded ? "tab โ†”" : ""; + bodyRows.push({ text: "__HEADER__" }); + + if (hasLocations) { + for (const loc of info.locations!) { + bodyRows.push({ text: ` ๐Ÿ“ ${loc.path}${loc.line ? `:${loc.line}` : ""}`, color: TEXT_DIM }); + } + } + + function addSection(label: string, lines: string[], totalCount: number) { + if (lines.length === 0) return; + bodyRows.push({ text: ` โ–ธ ${label}:`, color: TEXT_DIM }); + for (const line of lines) { + bodyRows.push({ text: ` ${line}`, color: TEXT_DIM }); + } + if (!expanded && totalCount > MAX_PREVIEW_LINES) { + const remaining = totalCount - MAX_PREVIEW_LINES; + bodyRows.push({ text: ` โ–ธ ${remaining} more lines (tab to expand)`, color: GOLD, italic: true }); + } + } + + addSection("input", shownInput, inputLines.length); + addSection("output", shownOutput, outputLines.length); + addSection("content", shownContent, contentLines.length); + + const result: React.ReactNode[] = []; + const topBorder = "โ•ญ" + "โ”€".repeat(innerWidth) + "โ•ฎ"; + const botBorder = "โ•ฐ" + "โ”€".repeat(innerWidth) + "โ•ฏ"; + + result.push( + + {topBorder} + , + ); + + for (let i = 0; i < bodyRows.length; i++) { + const row = bodyRows[i]!; + + if (row.text === "__HEADER__") { + result.push( + + โ”‚ + + + {statusInfo.icon} + {kindIcon} + {info.title} + {runningText ? {runningText} : null} + + {tabHint ? {tabHint} : null} + + โ”‚ + , + ); + continue; + } + + result.push( + + โ”‚ + + {row.text} + + โ”‚ + , + ); + } + + result.push( + + {botBorder} + , + ); + + return result; +} + +export function ToolCallCompact({ + info, + indent, + width, +}: { + info: ToolCallInfo; + indent: number; + width: number; +}) { + const statusInfo = STATUS_INDICATORS[info.status] ?? STATUS_INDICATORS.pending!; + const kindIcon = KIND_ICONS[info.kind ?? "other"] ?? "โš™"; + const summary = summarizeContent(info); + const maxSummaryWidth = width - indent - 12 - info.title.length; + const trimmedSummary = + summary.length > maxSummaryWidth && maxSummaryWidth > 3 + ? summary.slice(0, maxSummaryWidth - 1) + "โ€ฆ" + : summary; + + return ( + + {statusInfo.icon} + {kindIcon} + {info.title} + {trimmedSummary ? ( + โ€” {trimmedSummary} + ) : null} + + ); +} diff --git a/ui/text/src/app.tsx b/ui/text/src/tui.tsx similarity index 60% rename from ui/text/src/app.tsx rename to ui/text/src/tui.tsx index 3125d097b6..a16bf62aff 100644 --- a/ui/text/src/app.tsx +++ b/ui/text/src/tui.tsx @@ -1,13 +1,26 @@ +#!/usr/bin/env node import React, { useState, useEffect, useCallback, useRef } from "react"; -import { Box, Text, useApp, useInput, useStdout } from "ink"; +import { Box, Text, render, useApp, useInput, useStdout, measureElement } from "ink"; +import type { DOMElement } from "ink"; import TextInput from "ink-text-input"; +import meow from "meow"; +import { spawn } from "node:child_process"; +import { readFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; import type { SessionNotification, RequestPermissionRequest, RequestPermissionResponse, + ToolCallContent, + ToolCallStatus, + ToolKind, } from "@agentclientprotocol/sdk"; -import { GooseClient } from "@goose/acp"; -import { createHttpStream } from "./transport.js"; +import { GooseClient } from "@block/goose-acp"; +import { renderMarkdown } from "./markdown.js"; +import { buildToolCallCardLines, ToolCallCompact, findFeaturedToolCallId } from "./toolcall.js"; +import type { ToolCallInfo } from "./toolcall.js"; +import { CRANBERRY, TEAL, GOLD, TEXT_PRIMARY, TEXT_SECONDARY, TEXT_DIM, RULE_COLOR } from "./colors.js"; interface PendingPermission { toolTitle: string; @@ -15,15 +28,16 @@ interface PendingPermission { resolve: (response: RequestPermissionResponse) => void; } -const CRANBERRY = "#C0354A"; -const TEAL = "#3A7D7B"; -const GOLD = "#C4883A"; -const CEDAR = "#6B5344"; +interface Turn { + userText: string; + toolCalls: Map; + toolCallOrder: string[]; + agentText: string; +} -const TEXT_PRIMARY = "#E8E4DF"; -const TEXT_SECONDARY = "#8FA4BD"; -const TEXT_DIM = "#5A6D84"; -const RULE_COLOR = "#2E3D54"; +function isErrorStatus(status: string): boolean { + return status.startsWith("error") || status.startsWith("failed"); +} const GOOSE_FRAMES = [ [ @@ -104,30 +118,11 @@ const PERMISSION_KEYS: Record = { reject_always: "N", }; -interface Turn { - userText: string; - toolCalls: string[]; - agentText: string; -} - -// โ”€โ”€โ”€ Layout constants โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -// -// Every element indents by a multiple of INDENT (3 spaces). This keeps the -// left edge of user prompts, agent prose, and tool-call badges on a -// predictable grid so the eye can scan vertically without friction. -// -// col 0 rule / header -// col 3 user prompt caret + text, input caret + text -// col 5 agent prose, tool badges, loading spinner, permission dialog - const INDENT = 3; const CONTENT_INDENT = 5; -const MAX_PROSE_WIDTH = 76; function Rule({ width }: { width: number }) { - return ( - {"โ”€".repeat(Math.max(width, 1))} - ); + return {"โ”€".repeat(Math.max(width, 1))}; } function Spinner({ idx }: { idx: number }) { @@ -153,9 +148,7 @@ function Header({ hasPendingPermission: boolean; turnInfo?: { current: number; total: number }; }) { - const isError = - status.startsWith("error") || status.startsWith("failed"); - const statusColor = status === "ready" ? TEAL : isError ? CRANBERRY : TEXT_DIM; + const statusColor = status === "ready" ? TEAL : isErrorStatus(status) ? CRANBERRY : TEXT_DIM; return ( @@ -167,7 +160,10 @@ function Header({ ยท {status} {loading && !hasPendingPermission && ( - + + {" "} + + )} @@ -198,25 +194,6 @@ function UserPrompt({ text }: { text: string }) { ); } -function ToolBadge({ title, width }: { title: string; width: number }) { - const badgeWidth = Math.min(width - CONTENT_INDENT - 2, 68); - return ( - - โš™ - - {title} - - - ); -} - function PermissionDialog({ toolTitle, options, @@ -286,16 +263,6 @@ function QueuedMessage({ text }: { text: string }) { ); } -function inputBarHeight(input: string, width: number, queued: boolean): number { - // Inner text width: width minus border (2), paddingX (2), prompt "โฏ " (2) - const textWidth = Math.max(width - 2 - 2 - 2, 1); - // +1 for the trailing cursor character - const contentLen = input.length + 1; - const wrappedLines = Math.max(Math.ceil(contentLen / textWidth), 1); - const queuedLine = queued ? 1 : 0; - return 2 + wrappedLines + queuedLine + 1; -} - function InputBar({ width, input, @@ -327,9 +294,7 @@ function InputBar({ - {scrollHint && ( - shift+โ†‘โ†“ history - )} + {scrollHint && shift+โ†‘โ†“ history} {queued && ( @@ -343,77 +308,70 @@ function InputBar({ ); } -function wrapText(text: string, width: number): string[] { - if (width <= 0) return [text]; - const result: string[] = []; - for (const rawLine of text.split("\n")) { - if (rawLine.length === 0) { - result.push(""); - continue; - } - let remaining = rawLine; - while (remaining.length > width) { - let breakAt = remaining.lastIndexOf(" ", width); - if (breakAt <= 0) breakAt = width; - result.push(remaining.slice(0, breakAt)); - remaining = remaining.slice(breakAt).replace(/^ /, ""); - } - result.push(remaining); - } - return result; -} - -function TurnResponseBody({ +function buildTurnBodyLines({ turn, width, - height, - scrollOffset, loading, status, spinIdx, pendingPermission, permissionIdx, + expandedToolCall, }: { turn: Turn; width: number; - height: number; - scrollOffset: number; loading: boolean; status: string; spinIdx: number; pendingPermission: PendingPermission | null; permissionIdx: number; -}) { - const allLines: React.ReactNode[] = []; - const proseWidth = Math.min(width - CONTENT_INDENT - 1, MAX_PROSE_WIDTH); + expandedToolCall: string | null; +}): React.ReactNode[] { + const toolCallIds = turn.toolCallOrder; + const toolCalls = turn.toolCalls; + const featuredId = findFeaturedToolCallId(toolCallIds, toolCalls); - // blank line between user prompt and response content - allLines.push(); + const lines: React.ReactNode[] = []; - for (const tc of turn.toolCalls) { - allLines.push( - , - ); + lines.push(); + + for (const tcId of toolCallIds) { + const tc = toolCalls.get(tcId); + if (!tc) continue; + + if (tcId === featuredId || expandedToolCall === tcId) { + const cardLines = buildToolCallCardLines(tc, CONTENT_INDENT, width, expandedToolCall === tcId, `tc-${tcId}`); + lines.push(...cardLines); + } else { + lines.push( + , + ); + } } if (turn.agentText) { - // visual break between tool calls and prose - if (turn.toolCalls.length > 0) { - allLines.push(); + if (toolCallIds.length > 0) { + lines.push(); } - const wrapped = wrapText(turn.agentText, proseWidth); - for (const line of wrapped) { - allLines.push( - - {line} + const rendered = renderMarkdown(turn.agentText); + const mdLines = rendered.split("\n"); + for (let i = 0; i < mdLines.length; i++) { + lines.push( + + {mdLines[i]} , ); } } if (loading && !pendingPermission) { - allLines.push( - + lines.push( + {" "} @@ -424,9 +382,9 @@ function TurnResponseBody({ } if (pendingPermission) { - allLines.push( + lines.push( 0; - const hasBelow = offset + visibleCount < totalLines; + return lines; +} + +function ScrollableBody({ + lines, + width, + scrollOffset, +}: { + lines: React.ReactNode[]; + width: number; + scrollOffset: number; +}) { + const ref = useRef(null); + const [measured, setMeasured] = useState(0); + + useEffect(() => { + if (ref.current) { + const { height } = measureElement(ref.current); + if (height !== measured) setMeasured(height); + } + }); + + const total = lines.length; + const availableHeight = measured || total; + const needsScroll = total > availableHeight; + const viewSize = needsScroll + ? Math.max(availableHeight - 2, 1) + : availableHeight; + const maxOffset = Math.max(total - viewSize, 0); + const clampedOffset = Math.min(Math.max(scrollOffset, 0), maxOffset); + const endIdx = total - clampedOffset; + const startIdx = Math.max(endIdx - viewSize, 0); + const visible = lines.slice(startIdx, endIdx); + + const hiddenAbove = startIdx; + const hiddenBelow = Math.max(total - endIdx, 0); return ( - - {hasAbove && ( - - โ–ฒ more + + {needsScroll && ( + + {hiddenAbove > 0 ? ( + โ–ฒ {hiddenAbove} more (โ†‘) + ) : ( + + )} )} - {visible} - {hasBelow && !hasAbove && visible.length > 1 && ( - - โ–ผ more + + {visible} + + {needsScroll && ( + + {hiddenBelow > 0 ? ( + โ–ผ {hiddenBelow} more (โ†“) + ) : ( + + )} )} @@ -484,9 +481,7 @@ function SplashScreen({ onInputSubmit: (v: string) => void; }) { const frame = GOOSE_FRAMES[animFrame % GOOSE_FRAMES.length]!; - const isError = - status.startsWith("error") || status.startsWith("failed"); - const statusColor = status === "ready" ? TEAL : isError ? CRANBERRY : TEXT_DIM; + const statusColor = status === "ready" ? TEAL : isErrorStatus(status) ? CRANBERRY : TEXT_DIM; const inputWidth = Math.min(56, width - 8); return ( @@ -497,7 +492,6 @@ function SplashScreen({ width={width} height={height} > - {/* Goose art */} {frame.map((line, i) => ( @@ -506,7 +500,6 @@ function SplashScreen({ ))} - {/* Title + subtitle */} goose @@ -514,7 +507,6 @@ function SplashScreen({ your on-machine AI agent - {/* Input or status */} {showInput ? ( @@ -546,7 +538,7 @@ function SplashScreen({ ); } -export default function App({ +function App({ serverUrl, initialPrompt, }: { @@ -571,6 +563,7 @@ export default function App({ const [queuedMessages, setQueuedMessages] = useState([]); const [viewTurnIdx, setViewTurnIdx] = useState(-1); + const [expandedToolCall, setExpandedToolCall] = useState(null); const [scrollOffset, setScrollOffset] = useState(0); const clientRef = useRef(null); @@ -592,10 +585,10 @@ export default function App({ if (turns.length > 0) setBannerVisible(false); }, [turns]); - const turnsLen = turns.length; useEffect(() => { - if (viewTurnIdx === -1) setScrollOffset(0); - }, [turnsLen, viewTurnIdx]); + setExpandedToolCall(null); + setScrollOffset(0); + }, [viewTurnIdx, turns.length]); const appendAgent = useCallback((text: string) => { setTurns((prev) => { @@ -606,21 +599,89 @@ export default function App({ }); }, []); - const appendToolCall = useCallback((title: string) => { - setTurns((prev) => { - if (prev.length === 0) return prev; - const last = { ...prev[prev.length - 1]! }; - last.toolCalls = [...last.toolCalls, title]; - return [...prev.slice(0, -1), last]; - }); - }, []); + const handleToolCall = useCallback( + (tc: { + toolCallId: string; + title: string; + status?: ToolCallStatus; + kind?: ToolKind; + rawInput?: unknown; + rawOutput?: unknown; + content?: ToolCallContent[]; + locations?: Array<{ path: string; line?: number | null }>; + }) => { + setTurns((prev) => { + if (prev.length === 0) return prev; + const last = { ...prev[prev.length - 1]! }; + const newMap = new Map(last.toolCalls); + const info: ToolCallInfo = { + toolCallId: tc.toolCallId, + title: tc.title, + status: tc.status ?? "pending", + kind: tc.kind, + rawInput: tc.rawInput, + rawOutput: tc.rawOutput, + content: tc.content, + locations: tc.locations, + }; + newMap.set(tc.toolCallId, info); + const newOrder = last.toolCallOrder.includes(tc.toolCallId) + ? last.toolCallOrder + : [...last.toolCallOrder, tc.toolCallId]; + return [ + ...prev.slice(0, -1), + { ...last, toolCalls: newMap, toolCallOrder: newOrder }, + ]; + }); + }, + [], + ); + + const handleToolCallUpdate = useCallback( + (update: { + toolCallId: string; + title?: string | null; + status?: ToolCallStatus | null; + kind?: ToolKind | null; + rawInput?: unknown; + rawOutput?: unknown; + content?: ToolCallContent[] | null; + locations?: Array<{ path: string; line?: number | null }> | null; + }) => { + setTurns((prev) => { + if (prev.length === 0) return prev; + const last = { ...prev[prev.length - 1]! }; + const newMap = new Map(last.toolCalls); + const existing = newMap.get(update.toolCallId); + if (!existing) return prev; + const updated: ToolCallInfo = { ...existing }; + if (update.title != null) updated.title = update.title; + if (update.status != null) updated.status = update.status; + if (update.kind != null) updated.kind = update.kind; + if (update.rawInput !== undefined) updated.rawInput = update.rawInput; + if (update.rawOutput !== undefined) + updated.rawOutput = update.rawOutput; + if (update.content != null) updated.content = update.content; + if (update.locations != null) updated.locations = update.locations; + newMap.set(update.toolCallId, updated); + return [...prev.slice(0, -1), { ...last, toolCalls: newMap }]; + }); + }, + [], + ); const addUserTurn = useCallback((text: string) => { setTurns((prev) => [ ...prev, - { userText: text, toolCalls: [], agentText: "" }, + { + userText: text, + toolCalls: new Map(), + toolCallOrder: [], + agentText: "", + }, ]); setViewTurnIdx(-1); + setExpandedToolCall(null); setScrollOffset(0); }, []); @@ -641,48 +702,7 @@ export default function App({ [pendingPermission], ); - const processQueue = useCallback(async () => { - if (isProcessingRef.current) return; - isProcessingRef.current = true; - - while (queueRef.current.length > 0) { - const next = queueRef.current.shift()!; - setQueuedMessages([...queueRef.current]); - - const client = clientRef.current; - const sid = sessionIdRef.current; - if (!client || !sid) break; - - addUserTurn(next); - setLoading(true); - setStatus("thinkingโ€ฆ"); - streamBuf.current = ""; - - try { - const result = await client.prompt({ - sessionId: sid, - prompt: [{ type: "text", text: next }], - }); - - if (streamBuf.current) appendAgent(""); - - setStatus( - result.stopReason === "end_turn" - ? "ready" - : `stopped: ${result.stopReason}`, - ); - } catch (e: unknown) { - const errMsg = e instanceof Error ? e.message : String(e); - setStatus(`error: ${errMsg}`); - } finally { - setLoading(false); - } - } - - isProcessingRef.current = false; - }, [appendAgent, addUserTurn]); - - const sendPrompt = useCallback( + const executePrompt = useCallback( async (text: string) => { const client = clientRef.current; const sid = sessionIdRef.current; @@ -711,10 +731,30 @@ export default function App({ setStatus(`error: ${errMsg}`); } finally { setLoading(false); - if (queueRef.current.length > 0) processQueue(); } }, - [appendAgent, addUserTurn, processQueue], + [appendAgent, addUserTurn], + ); + + const processQueue = useCallback(async () => { + if (isProcessingRef.current) return; + isProcessingRef.current = true; + + while (queueRef.current.length > 0) { + const next = queueRef.current.shift()!; + setQueuedMessages([...queueRef.current]); + await executePrompt(next); + } + + isProcessingRef.current = false; + }, [executePrompt]); + + const sendPrompt = useCallback( + async (text: string) => { + await executePrompt(text); + if (queueRef.current.length > 0) processQueue(); + }, + [executePrompt, processQueue], ); useEffect(() => { @@ -723,7 +763,6 @@ export default function App({ (async () => { try { setStatus("initializingโ€ฆ"); - const stream = createHttpStream(serverUrl); const client = new GooseClient( () => ({ @@ -736,7 +775,27 @@ export default function App({ appendAgent(update.content.text); } } else if (update.sessionUpdate === "tool_call") { - appendToolCall(update.title || "tool"); + handleToolCall({ + toolCallId: update.toolCallId, + title: update.title, + status: update.status, + kind: update.kind, + rawInput: update.rawInput, + rawOutput: update.rawOutput, + content: update.content, + locations: update.locations, + }); + } else if (update.sessionUpdate === "tool_call_update") { + handleToolCallUpdate({ + toolCallId: update.toolCallId, + title: update.title, + status: update.status, + kind: update.kind, + rawInput: update.rawInput, + rawOutput: update.rawOutput, + content: update.content, + locations: update.locations, + }); } }, requestPermission: async ( @@ -754,7 +813,7 @@ export default function App({ }); }, }), - stream, + serverUrl, ); if (cancelled) return; @@ -783,7 +842,7 @@ export default function App({ if (initialPrompt && !sentInitialPrompt.current) { sentInitialPrompt.current = true; await sendPrompt(initialPrompt); - if (initialPrompt) setTimeout(() => exit(), 100); + setTimeout(() => exit(), 100); } } catch (e: unknown) { if (cancelled) return; @@ -796,7 +855,15 @@ export default function App({ return () => { cancelled = true; }; - }, [serverUrl, initialPrompt, sendPrompt, appendAgent, appendToolCall, exit]); + }, [ + serverUrl, + initialPrompt, + sendPrompt, + appendAgent, + handleToolCall, + handleToolCallUpdate, + exit, + ]); const handleSubmit = useCallback( (value: string) => { @@ -804,6 +871,7 @@ export default function App({ if (!trimmed) return; setInput(""); setViewTurnIdx(-1); + setExpandedToolCall(null); setScrollOffset(0); if (loading || isProcessingRef.current) { @@ -825,7 +893,6 @@ export default function App({ exit(); } - // Permission navigation if (pendingPermission) { const opts = pendingPermission.options; @@ -857,13 +924,34 @@ export default function App({ return; } - // Turn navigation: shift+arrow + if (key.tab) { + const effectiveIdx = + viewTurnIdx === -1 ? turns.length - 1 : viewTurnIdx; + const currentTurn = turns[effectiveIdx]; + if (!currentTurn || currentTurn.toolCallOrder.length === 0) return; + + const featuredId = findFeaturedToolCallId(currentTurn.toolCallOrder, currentTurn.toolCalls); + if (!featuredId) return; + + setExpandedToolCall((prev) => (prev === featuredId ? null : featuredId)); + return; + } + + if (key.upArrow && !key.shift && !key.meta) { + setScrollOffset((prev) => prev + 3); + return; + } + if (key.downArrow && !key.shift && !key.meta) { + setScrollOffset((prev) => Math.max(prev - 3, 0)); + return; + } + if (key.upArrow && key.shift) { setTurns((currentTurns) => { if (currentTurns.length <= 1) return currentTurns; setViewTurnIdx((prev) => { - const effectiveIdx = prev === -1 ? currentTurns.length - 1 : prev; - setScrollOffset(0); + const effectiveIdx = + prev === -1 ? currentTurns.length - 1 : prev; return Math.max(effectiveIdx - 1, 0); }); return currentTurns; @@ -876,44 +964,16 @@ export default function App({ setViewTurnIdx((prev) => { if (prev === -1) return -1; const next = prev + 1; - setScrollOffset(0); return next >= currentTurns.length ? -1 : next; }); return currentTurns; }); return; } - - // Scroll within turn - if (key.pageUp || (key.upArrow && key.meta)) { - setScrollOffset((prev) => Math.max(prev - 5, 0)); - return; - } - if (key.pageDown || (key.downArrow && key.meta)) { - setScrollOffset((prev) => prev + 5); - return; - } }); - // โ”€โ”€ Layout math โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ - // - // The vertical budget is: - // header (2 lines: title row + rule) - // user prompt (2 lines: blank line above + prompt text) - // body (flex: remaining space) - // input bar (dynamic: border top/bottom + wrapped content lines + margin bottom) โ€” absent in pipe mode - const GUTTER = 2; const innerWidth = Math.max(termWidth - GUTTER * 2, 20); - const headerLines = 2; - const userPromptLines = 2; - const inputLines = initialPrompt - ? 0 - : inputBarHeight(input, innerWidth, queuedMessages.length > 0); - const bodyHeight = Math.max( - termHeight - headerLines - userPromptLines - inputLines - 1, - 3, - ); if (bannerVisible) { return ( @@ -941,6 +1001,33 @@ export default function App({ viewTurnIdx !== -1 && viewTurnIdx < turns.length - 1; const isLatest = !isViewingHistory; + const emptyTurn: Turn = { + userText: "", + toolCalls: new Map(), + toolCallOrder: [], + agentText: "", + }; + + const bodyLines = buildTurnBodyLines({ + turn: currentTurn ?? emptyTurn, + width: innerWidth, + loading: isLatest && loading, + status, + spinIdx, + pendingPermission: isLatest ? pendingPermission : null, + permissionIdx, + expandedToolCall, + }); + + const allBodyLines = isLatest + ? [ + ...bodyLines, + ...queuedMessages.map((text, i) => ( + + )), + ] + : bodyLines; + return ( - - 0 - ? queuedMessages.length - : 0) - } - scrollOffset={scrollOffset} - loading={isLatest && loading} - status={status} - spinIdx={spinIdx} - pendingPermission={isLatest ? pendingPermission : null} - permissionIdx={permissionIdx} - /> - - {isLatest && - queuedMessages.map((text, i) => ( - - ))} - + ) : ( - + )} {isViewingHistory && ( @@ -1022,3 +1087,123 @@ export default function App({ ); } + +const cli = meow( + ` + Usage + $ goose + + Options + --server, -s Server URL (default: auto-launch bundled server) + --text, -t Send a single prompt and exit +`, + { + importMeta: import.meta, + flags: { + server: { type: "string", shortFlag: "s" }, + text: { type: "string", shortFlag: "t" }, + }, + }, +); + +const DEFAULT_PORT = 3284; +const DEFAULT_URL = `http://127.0.0.1:${DEFAULT_PORT}`; + +function findServerBinary(): string | null { + const __dirname = dirname(fileURLToPath(import.meta.url)); + + const candidates = [ + join(__dirname, "..", "server-binary.json"), + join(__dirname, "server-binary.json"), + ]; + + for (const candidate of candidates) { + try { + const data = JSON.parse(readFileSync(candidate, "utf-8")); + return data.binaryPath ?? null; + } catch { + // not found here, try next + } + } + + return null; +} + +async function waitForServer(url: string, timeoutMs = 10_000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + try { + const res = await fetch(`${url}/status`); + if (res.ok) return; + } catch { + // server not ready yet + } + await new Promise((r) => setTimeout(r, 200)); + } + throw new Error( + `Server did not become ready at ${url} within ${timeoutMs}ms`, + ); +} + +let serverProcess: ReturnType | null = null; + +async function main() { + let serverUrl = cli.flags.server; + + if (!serverUrl) { + const binary = findServerBinary(); + if (binary) { + serverProcess = spawn(binary, ["--port", String(DEFAULT_PORT)], { + stdio: "ignore", + detached: false, + }); + + serverProcess.on("error", (err) => { + console.error(`Failed to start goose-acp-server: ${err.message}`); + process.exit(1); + }); + + try { + await waitForServer(DEFAULT_URL); + } catch (err) { + console.error((err as Error).message); + serverProcess.kill(); + process.exit(1); + } + + serverUrl = DEFAULT_URL; + } else { + serverUrl = DEFAULT_URL; + } + } + + const { waitUntilExit } = render( + , + ); + + await waitUntilExit(); + cleanup(); +} + +function cleanup() { + if (serverProcess && !serverProcess.killed) { + serverProcess.kill(); + } +} + +process.on("exit", cleanup); +process.on("SIGINT", () => { + cleanup(); + process.exit(0); +}); +process.on("SIGTERM", () => { + cleanup(); + process.exit(0); +}); + +main().catch((err) => { + console.error(err); + cleanup(); + process.exit(1); +}); +