diff --git a/.github/TEAM_MEMBERS b/.github/TEAM_MEMBERS index ee2e26f4523..5268ff59ddc 100644 --- a/.github/TEAM_MEMBERS +++ b/.github/TEAM_MEMBERS @@ -10,6 +10,7 @@ kitlangton kommander ludvigrask MrMushrooooom +neriousy nexxeln R44VC0RP rekram1-node diff --git a/.github/workflows/deploy-lab-catalog.yml b/.github/workflows/deploy-lab-catalog.yml new file mode 100644 index 00000000000..fb5b7634f2b --- /dev/null +++ b/.github/workflows/deploy-lab-catalog.yml @@ -0,0 +1,49 @@ +name: deploy-lab-catalog + +on: + push: + branches: [v2] + paths: + - ".github/workflows/deploy-lab-catalog.yml" + - "bun.lock" + - "package.json" + - "packages/drive/**" + - "packages/protocol/src/simulation.ts" + - "packages/simulation/**" + - "packages/lab/catalog/**" + workflow_dispatch: + +concurrency: + group: deploy-lab-catalog-${{ github.ref_name }} + cancel-in-progress: false + +permissions: + contents: read + +jobs: + deploy: + if: github.repository == 'anomalyco/opencode' && github.ref_name == 'v2' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + + - uses: ./.github/actions/setup-bun + + - name: Install ffmpeg + run: | + sudo apt-get update + sudo apt-get install --yes ffmpeg + + - name: Validate + run: | + bun --cwd packages/protocol typecheck + bun --cwd packages/simulation typecheck + bun --cwd packages/drive run check + bun --cwd packages/drive run test + bun --cwd packages/lab/catalog run check + + - name: Deploy + working-directory: packages/lab/catalog + run: bun run deploy + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dcae87cda70..5dce1b33f04 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -55,6 +55,12 @@ jobs: git config --global user.email "bot@opencode.ai" git config --global user.name "opencode" + - name: Install ffmpeg + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install --yes ffmpeg + - name: Cache Turbo uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: @@ -66,7 +72,7 @@ jobs: - name: Run unit tests timeout-minutes: 20 - run: GITHUB_ACTIONS=false bun turbo test + run: GITHUB_ACTIONS=false bun turbo test ${{ runner.os == 'Windows' && '--filter=!opencode-drive' || '' }} env: OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: ${{ runner.os == 'Windows' && 'true' || 'false' }} diff --git a/.opencode/skills/opencode-drive/SKILL.md b/.opencode/skills/opencode-drive/SKILL.md index 3038e07beb4..371a1ef9151 100644 --- a/.opencode/skills/opencode-drive/SKILL.md +++ b/.opencode/skills/opencode-drive/SKILL.md @@ -51,7 +51,7 @@ files. If the script is unsuccessful, automatically fix the script and run it ag Scripts use one typed definition object. `setup` runs before OpenCode starts, and `fs.writeFile` always writes inside the simulated project. -You can read the full typed API here: https://raw.githubusercontent.com/jlongster/opencode-drive/refs/heads/main/src/script/types.ts +You can read the full typed API here: https://raw.githubusercontent.com/anomalyco/opencode/v2/packages/drive/src/script/types.ts ```ts import { defineScript } from "opencode-drive" @@ -83,7 +83,7 @@ itself (this is extremely rare, do not use this unless explicitly asked). In thi mode `ui` is typed as `null`; call `server.launch()` exactly once before launching clients. Each `clients.launch(name)` result provides the same UI methods as the automatic client. You can see an example of this API -here: https://raw.githubusercontent.com/jlongster/opencode-drive/refs/heads/main/examples/multiple-clients.ts +here: https://raw.githubusercontent.com/anomalyco/opencode/v2/packages/drive/examples/multiple-clients.ts Use the exported `wait(milliseconds)` utility for an unconditional delay. @@ -114,8 +114,8 @@ completion are automatic. You can see some example scripts here: -- https://raw.githubusercontent.com/jlongster/opencode-drive/refs/heads/main/examples/simple.ts -- https://raw.githubusercontent.com/jlongster/opencode-drive/refs/heads/main/examples/serve.ts +- https://raw.githubusercontent.com/anomalyco/opencode/v2/packages/drive/examples/simple.ts +- https://raw.githubusercontent.com/anomalyco/opencode/v2/packages/drive/examples/serve.ts ## Prune diff --git a/.opencode/tool/github-triage.ts b/.opencode/tool/github-triage.ts index e861e1e467b..d610a81e497 100644 --- a/.opencode/tool/github-triage.ts +++ b/.opencode/tool/github-triage.ts @@ -4,7 +4,7 @@ import { tool } from "@opencode-ai/plugin" const TEAM = { tui: ["kommander", "simonklee"], desktop_web: ["Hona", "Brendonovich"], - core: ["jlongster", "rekram1-node", "nexxeln", "kitlangton"], + core: ["jlongster", "rekram1-node", "neriousy", "nexxeln", "kitlangton"], inference: ["fwang", "MrMushrooooom", "starptech"], windows: ["Hona"], } as const diff --git a/AGENTS.md b/AGENTS.md index 749e8ef7131..be191e23dd9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,8 +1,9 @@ - After changing the public Protocol or Server `HttpApi`, run `bun run generate` from `packages/client`. Do not edit `src/generated` or `src/generated-effect` directly. - Keep runtime dependencies directed from Schema to Core and Protocol, then from Core and Protocol to Server. Client runtime code may depend on Schema and Protocol but never Core or Server; `sdk-next` composes Client, Core, and Server. - Do not modify `packages/opencode` unless the user explicitly asks for V1 work. `packages/opencode` is the V1 implementation and is present for reference only. New implementation changes should land in the V2 package set: `packages/core`, `packages/cli`, `packages/server`, `packages/protocol`, `packages/schema`, and related generated client surfaces when required. -- The default branch in this repo is `dev`. -- Local `main` ref may not exist; use `dev` or `origin/dev` for diffs. +- The default branch in this repo is `v2`. +- Base all new branches and worktrees on `v2`, or `origin/v2` when the local `v2` ref is unavailable. Do not base them on `dev`. +- Local `main` ref may not exist; use `v2` or `origin/v2` for diffs. ## Live V2 TUI Testing diff --git a/bun.lock b/bun.lock index f8814c3d071..2380111d1d1 100644 --- a/bun.lock +++ b/bun.lock @@ -28,6 +28,7 @@ "semver": "^7.6.0", "sst": "catalog:", "turbo": "2.10.2", + "vitest": "4.1.10", }, }, "packages/ai": { @@ -345,9 +346,6 @@ "packages/core": { "name": "@opencode-ai/core", "version": "1.18.4", - "bin": { - "opencode": "./bin/opencode", - }, "dependencies": { "@ai-sdk/alibaba": "1.0.17", "@ai-sdk/amazon-bedrock": "4.0.112", @@ -367,8 +365,6 @@ "@ai-sdk/togetherai": "2.0.41", "@ai-sdk/vercel": "2.0.39", "@aws-sdk/credential-providers": "3.1057.0", - "@effect/platform-node": "catalog:", - "@effect/sql-sqlite-bun": "catalog:", "@ff-labs/fff-bun": "0.10.1", "@ff-labs/fff-node": "0.10.1", "@lydell/node-pty": "catalog:", @@ -404,6 +400,8 @@ "zod": "catalog:", }, "devDependencies": { + "@effect/platform-node": "catalog:", + "@effect/sql-sqlite-bun": "catalog:", "@opencode-ai/http-recorder": "workspace:*", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", @@ -476,6 +474,31 @@ "@parcel/watcher-win32-x64": "2.5.1", }, }, + "packages/drive": { + "name": "opencode-drive", + "version": "1.4.3", + "bin": { + "opencode-drive": "bin/opencode-drive", + }, + "dependencies": { + "@effect/platform-node": "catalog:", + "@napi-rs/canvas": "1.0.2", + "@opencode-ai/client": "workspace:*", + "@opencode-ai/protocol": "workspace:*", + "@types/bun": "catalog:", + "@typescript/native-preview": "catalog:", + "@wterm/core": "0.3.0", + "@wterm/ghostty": "0.3.0", + "effect": "catalog:", + }, + "devDependencies": { + "@effect/vitest": "4.0.0-beta.101", + "@tsconfig/bun": "catalog:", + "oxlint": "1.60.0", + "typescript": "catalog:", + "vitest": "4.1.10", + }, + }, "packages/enterprise": { "name": "@opencode-ai/enterprise", "version": "1.18.15", @@ -557,6 +580,26 @@ "@typescript/native-preview": "catalog:", }, }, + "packages/lab/catalog": { + "name": "@opencode-ai/lab-catalog", + "dependencies": { + "@fontsource/commit-mono": "5.2.5", + "@fontsource/noto-sans-math": "5.2.8", + "@fontsource/noto-sans-symbols": "5.2.8", + "@fontsource/noto-sans-symbols-2": "5.2.8", + "react": "^19.2.7", + "react-dom": "^19.2.7", + }, + "devDependencies": { + "@types/bun": "catalog:", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "effect": "catalog:", + "opencode-drive": "workspace:*", + "typescript": "^7.0.2", + "wrangler": "4.110.0", + }, + }, "packages/merman": { "name": "@opencode-ai/merman", "version": "0.0.0", @@ -599,9 +642,9 @@ }, "peerDependencies": { "@opencode-ai/theme": "workspace:*", - "@opentui/core": "0.0.0-20260808-9ecf7c0a", - "@opentui/keymap": "0.0.0-20260808-9ecf7c0a", - "@opentui/solid": "0.0.0-20260808-9ecf7c0a", + "@opentui/core": ">=0.5.2", + "@opentui/keymap": ">=0.5.2", + "@opentui/solid": ">=0.5.2", "solid-js": ">=1.9.0", }, "optionalPeers": [ @@ -658,6 +701,7 @@ "@opencode-ai/plugin": "workspace:*", "@opencode-ai/schema": "workspace:*", "@opencode-ai/server": "workspace:*", + "@opencode-ai/util": "workspace:*", "effect": "catalog:", }, "devDependencies": { @@ -680,7 +724,6 @@ "@opencode-ai/util": "workspace:*", "drizzle-orm": "catalog:", "effect": "catalog:", - "modal": "0.9.0", }, "devDependencies": { "@tsconfig/bun": "catalog:", @@ -740,6 +783,7 @@ "@opencode-ai/ai": "workspace:*", "@opencode-ai/core": "workspace:*", "@opencode-ai/plugin": "workspace:*", + "@opencode-ai/protocol": "workspace:*", "@opencode-ai/util": "workspace:*", "@opentui/core": "catalog:", "effect": "catalog:", @@ -1035,6 +1079,31 @@ "typescript": "catalog:", }, }, + "packages/workerd-spike": { + "name": "@opencode-ai/workerd-spike", + "version": "0.0.0", + "dependencies": { + "@opencode-ai/core": "workspace:*", + "@opencode-ai/server": "workspace:*", + "effect": "catalog:", + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "0.12.6", + "@cloudflare/workers-types": "^4.20250808.0", + "@effect/platform-node": "catalog:", + "@vitest/expect": "3.2.7", + "@vitest/mocker": "3.2.7", + "@vitest/pretty-format": "3.2.7", + "@vitest/runner": "3.2.7", + "@vitest/snapshot": "3.2.7", + "@vitest/spy": "3.2.7", + "@vitest/utils": "3.2.7", + "unenv": "2.0.0-rc.24", + "vitest": "3.2.7", + "wrangler": "4.28.0", + "xdg-basedir": "5.1.0", + }, + }, "packages/www": { "name": "@opencode-ai/www", "dependencies": { @@ -1064,6 +1133,7 @@ "effect@4.0.0-beta.101": "patches/effect@4.0.0-beta.101.patch", "@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch", "@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch", + "@cloudflare/vitest-pool-workers@0.12.6": "patches/@cloudflare%2Fvitest-pool-workers@0.12.6.patch", "@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch", "@ai-sdk/mistral@3.0.51": "patches/@ai-sdk%2Fmistral@3.0.51.patch", "@ff-labs/fff-bun@0.10.1": "patches/@ff-labs%2Ffff-bun@0.10.1.patch", @@ -1075,9 +1145,9 @@ "@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch", }, "overrides": { - "@opentui/core": "0.0.0-20260808-9ecf7c0a", - "@opentui/keymap": "0.0.0-20260808-9ecf7c0a", - "@opentui/solid": "0.0.0-20260808-9ecf7c0a", + "@opentui/core": "catalog:", + "@opentui/keymap": "catalog:", + "@opentui/solid": "catalog:", "@types/bun": "catalog:", "@types/node": "catalog:", "effect": "catalog:", @@ -1095,9 +1165,9 @@ "@npmcli/arborist": "9.4.0", "@octokit/rest": "22.0.0", "@openauthjs/openauth": "0.0.0-20250322224806", - "@opentui/core": "0.0.0-20260808-9ecf7c0a", - "@opentui/keymap": "0.0.0-20260808-9ecf7c0a", - "@opentui/solid": "0.0.0-20260808-9ecf7c0a", + "@opentui/core": "0.5.2", + "@opentui/keymap": "0.5.2", + "@opentui/solid": "0.5.2", "@pierre/diffs": "1.2.10", "@playwright/test": "1.59.1", "@sentry/solid": "10.36.0", @@ -1179,15 +1249,15 @@ "@ai-sdk/cohere": ["@ai-sdk/cohere@3.0.27", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-OqcCq2PiFY1dbK/0Ck45KuvE8jfdxRuuAE9Y5w46dAk6U+9vPOeg1CDcmR+ncqmrYrhRl3nmyDttyDahyjCzAw=="], - "@ai-sdk/deepgram": ["@ai-sdk/deepgram@2.0.46", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.40" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ky7x7+nn07ZL/VSUl9Dx8nBYg87N2pnTHjFc4VpkT6MXVMIURwedUm4GJrfbT4ygeQ139smVvIbTC3ZJMujoDg=="], + "@ai-sdk/deepgram": ["@ai-sdk/deepgram@2.0.48", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.42" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-uuPOHZzHDq03YoBbBss+cvmty8jBOAsWUVPbZJbPPzoqsQeE0Tym+LVaVjyDq9bUjf6Sh6SV3+lnScBjJxo3Fw=="], "@ai-sdk/deepinfra": ["@ai-sdk/deepinfra@2.0.41", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.37", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-y6RoOP7DGWmDSiSxrUSt5p18sbz+Ixe5lMVPmdE7x+Tr5rlrzvftyHhjWHfqlAtoYERZTGFbP6tPW1OfQcrb4A=="], "@ai-sdk/deepseek": ["@ai-sdk/deepseek@2.0.47", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.38" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MzcQ321JO8OY+TVLFI81A7cIIuoeLLxrLCDD+8C1E3Ro6UFyfMtRXo9bw9OhTMRSDMo6hgSDOo4Fekz8aJtQYQ=="], - "@ai-sdk/elevenlabs": ["@ai-sdk/elevenlabs@2.0.46", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.40" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-HUStTC6DsjsgdRAYb0kJSFvAElHkYIiyAraRqgHPeLGCyec4FJnI9j2BgjK6HVntMv/1M6qXkzJmLOryCGfAzA=="], + "@ai-sdk/elevenlabs": ["@ai-sdk/elevenlabs@2.0.48", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.42" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-fiBMnAQYjn+LiS8ZTqZFrrUYbxumFJbSTpnyx8fWcdETV8C7/D5dNI4ZH3DxpuaOCHhe51Jbrf1Ub4tBwkN0Jg=="], - "@ai-sdk/fireworks": ["@ai-sdk/fireworks@2.0.70", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.62", "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.40" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-9ksD8Lx/vNw4GTUIEkL/V3cEj1Rvdqpt7y2JdJM3efp4Attyyg/g5mg7DFvzQlsXpk3zlkfPo9AcIf4eypfi6Q=="], + "@ai-sdk/fireworks": ["@ai-sdk/fireworks@2.0.73", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.64", "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.42" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-m4M8e1JqWiX+kTPVfhWNUK6jytStZZQZb3856biVOG86Grjeh7uzd7U+x3yz9nk4OdI6gCVZmp7mXxMDXxKoYQ=="], "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.104", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZKX5n74io8VIRlhIMSLWVlvT3sXC8Z7cZ9GHuWBWZDVi96+62AIsWuLGvMfcBA1STYuSoDrp6rIziZmvrTq0TA=="], @@ -1213,7 +1283,7 @@ "@ai-sdk/vercel": ["@ai-sdk/vercel@2.0.39", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.37", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8eu3ljJpkCTP4ppcyYB+NcBrkcBoSOFthCSgk5VnjaxnDaOJFaxnPwfddM7wx3RwMk2CiK1O61Px/LlqNc7QkQ=="], - "@ai-sdk/xai": ["@ai-sdk/xai@3.0.102", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.56", "@ai-sdk/provider": "3.0.13", "@ai-sdk/provider-utils": "4.0.35" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-NeQyOR7OCqDMgaLS4uNX/ep/HrwUzzFYLzXQSRoqLy2jsnqxAJhsgltRwAwf+ADjyPBIAKEOestWnIQA+LrLrQ=="], + "@ai-sdk/xai": ["@ai-sdk/xai@3.0.115", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.64", "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.42" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-CuFB1vEafWSQn5E11FKviNJWCQBO1tLSBSaUGpveyWKTWyGjZ5K3bwrGM7VB4HbfQQGOnpOIKN99UMy5dgpXnQ=="], "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], @@ -1247,27 +1317,27 @@ "@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="], - "@astrojs/compiler-binding": ["@astrojs/compiler-binding@0.3.1", "", { "optionalDependencies": { "@astrojs/compiler-binding-darwin-arm64": "0.3.1", "@astrojs/compiler-binding-darwin-x64": "0.3.1", "@astrojs/compiler-binding-linux-arm64-gnu": "0.3.1", "@astrojs/compiler-binding-linux-arm64-musl": "0.3.1", "@astrojs/compiler-binding-linux-x64-gnu": "0.3.1", "@astrojs/compiler-binding-linux-x64-musl": "0.3.1", "@astrojs/compiler-binding-wasm32-wasi": "0.3.1", "@astrojs/compiler-binding-win32-arm64-msvc": "0.3.1", "@astrojs/compiler-binding-win32-x64-msvc": "0.3.1" } }, "sha512-DaAUj29AIBU2XdJ8uwcab8lW5O2pk9pY8AXkcMw0sw77nVa3oeTYRcO+Dvbbpoexf6ThMc0FMWYCQ/wN1/T7oQ=="], + "@astrojs/compiler-binding": ["@astrojs/compiler-binding@0.3.2", "", { "optionalDependencies": { "@astrojs/compiler-binding-darwin-arm64": "0.3.2", "@astrojs/compiler-binding-darwin-x64": "0.3.2", "@astrojs/compiler-binding-linux-arm64-gnu": "0.3.2", "@astrojs/compiler-binding-linux-arm64-musl": "0.3.2", "@astrojs/compiler-binding-linux-x64-gnu": "0.3.2", "@astrojs/compiler-binding-linux-x64-musl": "0.3.2", "@astrojs/compiler-binding-wasm32-wasi": "0.3.2", "@astrojs/compiler-binding-win32-arm64-msvc": "0.3.2", "@astrojs/compiler-binding-win32-x64-msvc": "0.3.2" } }, "sha512-8w/9CWmYrAJJ8N0SY3O43ws2BgxoW6u3QsD8u2mE140lMYAlwh+tlNoUeSBq22wVheFuiBbR212l6ixZ2IIgCQ=="], - "@astrojs/compiler-binding-darwin-arm64": ["@astrojs/compiler-binding-darwin-arm64@0.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IEmEF2fUIlTHtpeE/isyEGVOB14cEyh/LZOFYt6wn3jNyVpdC8aR5OZ+RzFUR/f+8ZDM1LaMwZKvoA7eMyJeFw=="], + "@astrojs/compiler-binding-darwin-arm64": ["@astrojs/compiler-binding-darwin-arm64@0.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MM8tn8CSimcfytaOla4b6acN8mKWiL/rlAA1fpT3/Wl7dNGSE4y8FjTN/zJVNnb63CsLWG5zZwCt01TXtDKh9g=="], - "@astrojs/compiler-binding-darwin-x64": ["@astrojs/compiler-binding-darwin-x64@0.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-GF2kIxjpPDLsn94zbZNMsxEmkU828QqnmM7kiQJnaooS3jmI+I7kk6+oI6EpwOsK3femCMdcm+wmOsEqtGrmjQ=="], + "@astrojs/compiler-binding-darwin-x64": ["@astrojs/compiler-binding-darwin-x64@0.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-2lXOlzf8xb7jLomRsf/aswh61/NnGusynB2OwFkK6k4pmOtpfXMYnG0PLfXrEvxXYj69NdCnmUYXtHDd+JOOag=="], - "@astrojs/compiler-binding-linux-arm64-gnu": ["@astrojs/compiler-binding-linux-arm64-gnu@0.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-XJL3SDmOtVrqFhCirNcHwE91+IesJqlgNo23I4qW9QUYfwzm/TBZuH61fgqsb1ttgR1mMYz6ooPWs0JDhwMqpQ=="], + "@astrojs/compiler-binding-linux-arm64-gnu": ["@astrojs/compiler-binding-linux-arm64-gnu@0.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-BmU3kWj7qnLrd4vzm49zFEPJ5oFnn1tCT4Vt9hZbqdU5Cmb8GZl7fn6VFsnNfe7B18a2gIFtVzbLINtYl5kBjQ=="], - "@astrojs/compiler-binding-linux-arm64-musl": ["@astrojs/compiler-binding-linux-arm64-musl@0.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-xqE8BVbDoBueK/B47w30PtkVofUWJKGkwoMVE+EOMLf11rnoANxIAdA9FPqY+rng4oNI5ndHGsri1yPj2k8vZQ=="], + "@astrojs/compiler-binding-linux-arm64-musl": ["@astrojs/compiler-binding-linux-arm64-musl@0.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-f0heT9ZZEseSu5bHCeb80eL2DH07ArE6U9xi1WT/PEusNjzPmEr3GJsjG1tRLo5VYUUYX7h3ScaqGmGrMOVGmw=="], - "@astrojs/compiler-binding-linux-x64-gnu": ["@astrojs/compiler-binding-linux-x64-gnu@0.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-1y0StU1qiCuDFH3rmbRJXcxdfHxFPrES1Rd+RLffosvUR7I2cH5SF5SFnBN9vXpzpkmyElZm3Yr47iJBPN7vVA=="], + "@astrojs/compiler-binding-linux-x64-gnu": ["@astrojs/compiler-binding-linux-x64-gnu@0.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-M8fOUt0itRpqiGyoEA/ij184s8O+hqbCz3+YozRusOOM3osgGljpDThhbKAJjqh82wOo6FioQ4w8PBvU1XMD5Q=="], - "@astrojs/compiler-binding-linux-x64-musl": ["@astrojs/compiler-binding-linux-x64-musl@0.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-16q0fYf7kpbmdObZEeZJEup8hQv/whgNwVjrSvT8umrKwLDSnNIWiQpm09lQQu6bweZB0XyIvHwlPitvJhC+hg=="], + "@astrojs/compiler-binding-linux-x64-musl": ["@astrojs/compiler-binding-linux-x64-musl@0.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-/Kebk8sO6HnLeSd691JkaAPfN7CqR9/KEXmWvyNPkaKNGmj8rTZ/lf2uXtnPu92Lan84UrKdIKVPy1fSo2encQ=="], - "@astrojs/compiler-binding-wasm32-wasi": ["@astrojs/compiler-binding-wasm32-wasi@0.3.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-cB456shIwDv/PrVT+2QG7LFndpHkVge5HjqADKZgGaAc9JHVktCtjSrcdkRQ+3tbkPazNKaTLRjXLIiz2NIx9g=="], + "@astrojs/compiler-binding-wasm32-wasi": ["@astrojs/compiler-binding-wasm32-wasi@0.3.2", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.2.0" }, "cpu": "none" }, "sha512-pUA6xbcOSB7DhfzIArB8BCAkFfAIqriiR7zl5zOStd6oU2G0kIKj+GUdGnyXyhfiv881Hffyk5tC0mR18sDjDw=="], - "@astrojs/compiler-binding-win32-arm64-msvc": ["@astrojs/compiler-binding-win32-arm64-msvc@0.3.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-ur/9+If/yTE69mmeX5MqSZndL0HOyx67GeNZUy3N7wVdWpLz9UTJXwyWS4UR2PUQHitghjsM5xoX0Ge56WRVQQ=="], + "@astrojs/compiler-binding-win32-arm64-msvc": ["@astrojs/compiler-binding-win32-arm64-msvc@0.3.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-ESruf+6Qkl1trHUFxI6GSf6t52j8yN2kCNSzMWdzt7V/T09tFHrYzrVaJQohb2C9bJUH76pNvX6Zb51+xCQc9Q=="], - "@astrojs/compiler-binding-win32-x64-msvc": ["@astrojs/compiler-binding-win32-x64-msvc@0.3.1", "", { "os": "win32", "cpu": "x64" }, "sha512-k0W+kDBzDkNZOqu4kElDvCOIbKw5Ut9S1WZ1Krj3KTgNuBERNKXsMMsRLLcbgfdMdbe7bTekQLshZrrvmYpmwA=="], + "@astrojs/compiler-binding-win32-x64-msvc": ["@astrojs/compiler-binding-win32-x64-msvc@0.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-wzzVrEbOwbsLWOdEbocskjMRx2aZPxJ7ZbmL+jnpBamFwmigm+2M/wzuM6JWncocgYwLic1csSpalBh96kQKXA=="], - "@astrojs/compiler-rs": ["@astrojs/compiler-rs@0.3.1", "", { "dependencies": { "@astrojs/compiler-binding": "0.3.1" } }, "sha512-aT7xkgsbNoS6nriY5qKpbihK43slFHO41iqgHCTdOvn1ifaQxLCc5yXy+6GzAtiafoaC1zA7OwVXCXMsvUZOkg=="], + "@astrojs/compiler-rs": ["@astrojs/compiler-rs@0.3.2", "", { "dependencies": { "@astrojs/compiler-binding": "0.3.2" } }, "sha512-xlx/T7JovIKduu4ucbTQUxQ5+Q8wxkHxhLjnZk3VlJbhbQ9RLvvuDk1p2YYFYFQ5y14dVm3FGGO4isQXa4F+Tg=="], "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.1", "", {}, "sha512-7dwEVigz9vUWDw3nRwLQ/yH/xYovlUA0ZD86xoeKEBmkz9O6iELG1yri67PgAPW6VLL/xInA4t7H0CK6VmtkKQ=="], @@ -1279,11 +1349,11 @@ "@astrojs/mdx": ["@astrojs/mdx@4.3.14", "", { "dependencies": { "@astrojs/markdown-remark": "6.3.11", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA=="], - "@astrojs/node": ["@astrojs/node@11.0.2", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "send": "^1.2.1", "server-destroy": "^1.0.1" }, "peerDependencies": { "astro": "^7.0.0" } }, "sha512-/ijULxT+A5Cm8wSwWZ2vgqfim1b05D6B8n/a9l6MMA4FCotIH73g7fL7y76XojKXpTe75FVvQH92OxsMqea9kQ=="], + "@astrojs/node": ["@astrojs/node@11.1.0", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.2", "send": "^1.2.1", "server-destroy": "^1.0.1" }, "peerDependencies": { "astro": "^7.0.0" } }, "sha512-utAqBE1eIcAhyIkBUnNIWrzj4vyTiOlbbqcjUSE2Yz5XrMu+9sQdBwp/UmZXfJ9wjaEIHf26HInNLUUmTOFeEw=="], "@astrojs/prism": ["@astrojs/prism@3.2.0", "", { "dependencies": { "prismjs": "^1.29.0" } }, "sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw=="], - "@astrojs/react": ["@astrojs/react@6.0.1", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@vitejs/plugin-react": "^5.2.0", "devalue": "^5.8.1", "ultrahtml": "^1.6.0", "vite": "^8.0.13" }, "peerDependencies": { "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", "react": "^17.0.2 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" } }, "sha512-Afs1sEm72P2plDnrOGxmIteJ7bjx/VqxlcaQLNip5eHJ5tIvKUORQetC9UKcvgwKnj51t60HWl5mOANkOsWs4w=="], + "@astrojs/react": ["@astrojs/react@6.0.2", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.2", "@vitejs/plugin-react": "^5.2.0", "devalue": "^5.8.1", "ultrahtml": "^1.6.0", "vite": "^8.0.13" }, "peerDependencies": { "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", "react": "^17.0.2 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" } }, "sha512-Fvv2UqS7ajFL2Yjd5s4s5PcCBCSSfks4r04rbCHZO5z4pUPwCygV2ketI+iC+1P/sdHANLV3tgDL1wjzty4cJg=="], "@astrojs/sitemap": ["@astrojs/sitemap@3.7.3", "", { "dependencies": { "sitemap": "^9.0.0", "stream-replace-string": "^2.0.0", "zod": "^4.3.6" } }, "sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA=="], @@ -1295,7 +1365,7 @@ "@astrojs/underscore-redirects": ["@astrojs/underscore-redirects@1.0.0", "", {}, "sha512-qZxHwVnmb5FXuvRsaIGaqWgnftjCuMY+GSbaVZdBmE4j8AfgPqKPxYp8SUERyJcjpKCEmO4wD6ybuGH8A2kVRQ=="], - "@astrojs/vercel": ["@astrojs/vercel@11.0.3", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@vercel/analytics": "^1.6.1", "@vercel/functions": "^3.4.3", "@vercel/nft": "^1.3.2", "@vercel/routing-utils": "^5.3.3", "esbuild": "^0.28.0", "tinyglobby": "^0.2.15" }, "peerDependencies": { "astro": "^7.0.0" } }, "sha512-UMhcZ/lWB0/B2l1L8BJh6QxysjZt8SLS9e40xRfBdVhfi3Y6SIDw+99rY/+OGW/yem/S7sBRkvqvto8neevO2A=="], + "@astrojs/vercel": ["@astrojs/vercel@11.0.5", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.2", "@vercel/analytics": "^1.6.1", "@vercel/functions": "^3.4.3", "@vercel/nft": "^1.3.2", "@vercel/routing-utils": "^5.3.3", "esbuild": "^0.28.0", "tinyglobby": "^0.2.15" }, "peerDependencies": { "astro": "^7.0.0" } }, "sha512-cag6EfSclaXiya6R7TT52m+IechBXt+m57wtj1L0ijGJg8cToN3Tuhj9o+JBGk+IaH0wp1Eh/Qlc2NZKs/Q3HA=="], "@astrojs/yaml2ts": ["@astrojs/yaml2ts@0.2.4", "", { "dependencies": { "yaml": "^2.8.3" } }, "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A=="], @@ -1319,7 +1389,7 @@ "@aws-sdk/client-firehose": ["@aws-sdk/client-firehose@3.933.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/credential-provider-node": "3.933.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-tDrtgczN2lQsflLDPYu/wdOoyCZLVYtgzmWnYzSEOBWd/cp2AbuQ7D+FemSwUTzyoMTuhhIevyEJKzqsF+QYxA=="], - "@aws-sdk/client-lambda": ["@aws-sdk/client-lambda@3.1095.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/credential-provider-node": "^3.972.72", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/fetch-http-handler": "^5.6.10", "@smithy/node-http-handler": "^4.9.10", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-zWx4ugkVrm77xDgtUc1bnVoFjaq2r3b4bJuT8EtyD2y6/LAvrY+9q1FbUkXxhiAFsAjRV9+2sG/SUp+x1lsFNQ=="], + "@aws-sdk/client-lambda": ["@aws-sdk/client-lambda@3.1106.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/credential-provider-node": "^3.972.78", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/fetch-http-handler": "^5.6.13", "@smithy/node-http-handler": "^4.9.13", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-vxZtyCy6k9GaZ6j39zg1cNHDtAgwan/a2cQRtnaiQ4iUtX4MGxHdErKyhYAj59tkSqiKAMQpOFhIH7mb0u/9UQ=="], "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.933.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/credential-provider-node": "3.933.0", "@aws-sdk/middleware-bucket-endpoint": "3.930.0", "@aws-sdk/middleware-expect-continue": "3.930.0", "@aws-sdk/middleware-flexible-checksums": "3.932.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-location-constraint": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-sdk-s3": "3.932.0", "@aws-sdk/middleware-ssec": "3.930.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/signature-v4-multi-region": "3.932.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/eventstream-serde-browser": "^4.2.5", "@smithy/eventstream-serde-config-resolver": "^4.3.5", "@smithy/eventstream-serde-node": "^4.2.5", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-blob-browser": "^4.2.6", "@smithy/hash-node": "^4.2.5", "@smithy/hash-stream-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/md5-js": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.5", "tslib": "^2.6.2" } }, "sha512-KxwZvdxdCeWK6o8mpnb+kk7Kgb8V+8AjTwSXUWH1UAD85B0tjdo1cSfE5zoR5fWGol4Ml5RLez12a6LPhsoTqA=="], @@ -1329,23 +1399,23 @@ "@aws-sdk/core": ["@aws-sdk/core@3.932.0", "", { "dependencies": { "@aws-sdk/types": "3.930.0", "@aws-sdk/xml-builder": "3.930.0", "@smithy/core": "^3.18.2", "@smithy/node-config-provider": "^4.3.5", "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA=="], - "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.972.60", "", { "dependencies": { "@aws-sdk/nested-clients": "^3.997.35", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-16Fxa3veKIO6nHJr+vN76z3BkSU7725lzruc5S2SQSTUTbK4TXtmi8033WQljZj4k1+383UsMaNOHN6B76fK5A=="], + "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.972.66", "", { "dependencies": { "@aws-sdk/nested-clients": "^3.997.41", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-i4HTkP21eHaXA+XKoc6dYxlKPvYUqbusGGIsFRcSGTF8ln/q6RrWoRdVJ6UVODTCW59Ot1mVcbJXRAEf6kxa3w=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.61", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-qihs2ekMb89Nxd2JenCgVFhjbkb3EIo7HEBCBzyZACKVJdrLUZBLOmAE3xr0Sayml8n/jZSzwO/IufIiIzO7PQ=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.67", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-rcIpk5kxUqDaaNa6Xk23pQ6ViY7jlqzmfFWCahQcBT97ddXaXYYwzCen9Tz1Jvo6aJft6wDl5bN44/Jw5B4oLA=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.63", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/fetch-http-handler": "^5.6.10", "@smithy/node-http-handler": "^4.9.10", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-yfozsS8wkWZEi/n6IsrodcFKBWZ0iNAezhJbTReMNc0z1Px17qdeAeuL1/wziCAmCZyXiW7QzP75ggJkBQv8jQ=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.69", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/fetch-http-handler": "^5.6.13", "@smithy/node-http-handler": "^4.9.13", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-nggwJtZ4eeNsUw5IeWBMXsi1ryct5idi0K+/SCRF3kybLubOMaNTb3XCihXpWMiVpyzyPeIrl0zTkzhBH9porA=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.973.6", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/credential-provider-env": "^3.972.61", "@aws-sdk/credential-provider-http": "^3.972.63", "@aws-sdk/credential-provider-login": "^3.972.68", "@aws-sdk/credential-provider-process": "^3.972.61", "@aws-sdk/credential-provider-sso": "^3.973.5", "@aws-sdk/credential-provider-web-identity": "^3.972.67", "@aws-sdk/nested-clients": "^3.997.35", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/credential-provider-imds": "^4.4.13", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-jGLTW1bj148GL/6/IMlfY2fMYS9FtHOG+NahkFD4y0qkzYudNUahelxryY68/HGMslYuHClk1XaS/3b3eJzEkg=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.973.12", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/credential-provider-env": "^3.972.67", "@aws-sdk/credential-provider-http": "^3.972.69", "@aws-sdk/credential-provider-login": "^3.972.74", "@aws-sdk/credential-provider-process": "^3.972.67", "@aws-sdk/credential-provider-sso": "^3.973.11", "@aws-sdk/credential-provider-web-identity": "^3.972.73", "@aws-sdk/nested-clients": "^3.997.41", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-pNEf/OeyN5X3VmLKlgSO6TqaWmW10CvI3TfwL1XhsuhYjSLT2VDaxFnCPHnOeQXSaFisMX4jNhpETriqN8DOmg=="], - "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.68", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/nested-clients": "^3.997.35", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-w6tNci6g7RqFpLhj1f5xseBvaNojb4Pkgp5Jp5apl9hrJtaf2AA+rX9+qlhlWUK6kcyAFYPA7emO+55zj+S98Q=="], + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.74", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/nested-clients": "^3.997.41", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-0AQfDcf99TNmqVKv0owHrw/TQs6i4ZE5t9qmz6NvO53bE/sA/tpXhXL9AAcEP1qHc6Zzjd1UMb69+/9zdhvY3g=="], "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.933.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.932.0", "@aws-sdk/credential-provider-http": "3.932.0", "@aws-sdk/credential-provider-ini": "3.933.0", "@aws-sdk/credential-provider-process": "3.932.0", "@aws-sdk/credential-provider-sso": "3.933.0", "@aws-sdk/credential-provider-web-identity": "3.933.0", "@aws-sdk/types": "3.930.0", "@smithy/credential-provider-imds": "^4.2.5", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-L2dE0Y7iMLammQewPKNeEh1z/fdJyYEU+/QsLBD9VEh+SXcN/FIyTi21Isw8wPZN6lMB9PDVtISzBnF8HuSFrw=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.61", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-xzRuj+fUVO4nkafKQJVKAF97kGpeQbfjuwmRrtGZNf42/1dkmcz6o7dswBy7alY0htQn5sCL1GWQYEykviWZkA=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.67", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-IlUEejorGTWKb4/Dm7K5Yw4QxUmXLThLhrvBmzVBqZFTbW72cv9LTcITmo1dsnYriALE4h68mOq4LB99x6sQ7Q=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.973.5", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/nested-clients": "^3.997.35", "@aws-sdk/token-providers": "3.1095.0", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-fZRjjWhLFelsDoOYjqShQTrIGYC3Pf9Mx9Czf+1ikfQDgktxjze33dVo1q1/ZQ+T0qbtejVoHNHrfD5aJVpv/w=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.973.11", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/nested-clients": "^3.997.41", "@aws-sdk/token-providers": "3.1103.0", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-gAQBkBZxUB84d71+pPcI9L+jh2ujhuAVxc/4FgGiWFDjkPBlMKxzd5XDtkSXTFX8Ro7ansnT88+XadasxMeCRw=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.67", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/nested-clients": "^3.997.35", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-FTNZ05gkPBA6CKbU3N4zPgybV+stdazwMOya75CmGdcJL7p8Fw/BdHP8WVxJd0mvzyPK2cg/C3gli58Ir4HgCw=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.73", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/nested-clients": "^3.997.41", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-SnlEmQa6SjOgs6iOPLUQl1Eyq4AKiAdPQlkOhFhqNfDtDCwibMGvL6QlkSmf3o6vAUSImzdPCxowT5dfQUZP1A=="], "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.1057.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.1057.0", "@aws-sdk/core": "^3.974.15", "@aws-sdk/credential-provider-cognito-identity": "^3.972.38", "@aws-sdk/credential-provider-env": "^3.972.41", "@aws-sdk/credential-provider-http": "^3.972.43", "@aws-sdk/credential-provider-ini": "^3.972.46", "@aws-sdk/credential-provider-login": "^3.972.45", "@aws-sdk/credential-provider-node": "^3.972.47", "@aws-sdk/credential-provider-process": "^3.972.41", "@aws-sdk/credential-provider-sso": "^3.972.45", "@aws-sdk/credential-provider-web-identity": "^3.972.45", "@aws-sdk/nested-clients": "^3.997.13", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/credential-provider-imds": "^4.3.6", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-rbrEHtz11g0kxsSkYr3fx2HABNNblp4AhB2MgPvJHgYOWfJ2eBviU7Mvoaef0PW8QH6lbZDfJcnM7eKvtvz3sw=="], @@ -1369,13 +1439,13 @@ "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.932.0", "", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@smithy/core": "^3.18.2", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-9BGTbJyA/4PTdwQWE9hAFIJGpsYkyEW20WON3i15aDqo5oRZwZmqaVageOD57YYqG8JDJjvcwKyDdR4cc38dvg=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.35", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/signature-v4-multi-region": "^3.996.42", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/fetch-http-handler": "^5.6.10", "@smithy/node-http-handler": "^4.9.10", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-2MJfseVG/aXvIyOIBlYA/Oaf6qFDdsu4D8RKsEUdOQpVuLaor0BdxIBBtJLBNQQEe6Ku3YMvLljwb1MwVUpzRw=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.41", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/signature-v4-multi-region": "^3.996.43", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/fetch-http-handler": "^5.6.13", "@smithy/node-http-handler": "^4.9.13", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-RDHqPGQWlF6tatA/Tp3rg6oIwtgN9IVderxE+9av2Y93Dfyu+mO1hZ5Bu2jpfZg2rwdNbsssnwM+sLafIczMlQ=="], "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.930.0", "", { "dependencies": { "@aws-sdk/types": "3.930.0", "@smithy/config-resolver": "^4.4.3", "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-KL2JZqH6aYeQssu1g1KuWsReupdfOoxD6f1as2VC+rdwYFUu4LfzMsFfXnBvvQWWqQ7rZHWOw1T+o5gJmg7Dzw=="], "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.932.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.932.0", "@aws-sdk/types": "3.930.0", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-NCIRJvoRc9246RZHIusY1+n/neeG2yGhBGdKhghmrNdM+mLLN6Ii7CKFZjx3DhxtpHMpl1HWLTMhdVrGwP2upw=="], - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1095.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.0", "@aws-sdk/nested-clients": "^3.997.35", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-65SudS6y4nzaYHybtqcpm3sHe5jLhdMn68HRKS1nUx690BtQeaAQOoujQ+dpOjBATIVGVgKKjEP8tR+U06QJQA=="], + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1103.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.6", "@aws-sdk/nested-clients": "^3.997.41", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-N4wy26MNn31ItGVHYHPrEuCIFY4MBBjC+C5v1lJKqIUSA7OZBdhleCY53zCCrXn27hsk7YNOaTuhQu807S4AfQ=="], "@aws-sdk/types": ["@aws-sdk/types@3.930.0", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A=="], @@ -1421,7 +1491,7 @@ "@azure/storage-blob": ["@azure/storage-blob@12.33.0", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.3", "@azure/core-http-compat": "^2.2.0", "@azure/core-lro": "^2.2.0", "@azure/core-paging": "^1.6.2", "@azure/core-rest-pipeline": "^1.19.1", "@azure/core-tracing": "^1.2.0", "@azure/core-util": "^1.11.0", "@azure/core-xml": "^1.4.5", "@azure/logger": "^1.1.4", "@azure/storage-common": "^12.4.1", "events": "^3.0.0", "tslib": "^2.8.1" } }, "sha512-2SX8oP8PyblUcAFZSg39c8Ls+tFjavM6sBeV+qpw33mRzRhI/5hrFJmJ/x0H9xx5l6ECPvgSP8uPxqTeVbHNIA=="], - "@azure/storage-common": ["@azure/storage-common@12.4.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", "@azure/core-http-compat": "^2.2.0", "@azure/core-rest-pipeline": "^1.24.0", "@azure/core-tracing": "^1.2.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.1.4", "events": "^3.3.0", "tslib": "^2.8.1" } }, "sha512-t14unw/WofGDUi7TKJrsyXyPsN+NLgRm7hMaq0llxNmTIzt7f257+6LE6FKIJPh88zLj6M7LPvzve0fEYg/L3A=="], + "@azure/storage-common": ["@azure/storage-common@12.5.0", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", "@azure/core-http-compat": "^2.4.0", "@azure/core-rest-pipeline": "^1.24.0", "@azure/core-tracing": "^1.2.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.1.4", "events": "^3.3.0", "tslib": "^2.8.1" } }, "sha512-bttzuhQiCIwrkzjPDA+AtAR7dg19L/CC6ztcqJ5LfvWpXuys9mHp0UQ0udYnoUvv9SCT9KTR5kqFvFr0e6k0lQ=="], "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], @@ -1429,7 +1499,7 @@ "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], - "@babel/generator": ["@babel/generator@7.29.7", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="], + "@babel/generator": ["@babel/generator@7.29.8", "", { "dependencies": { "@babel/parser": "^7.29.8", "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg=="], "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" } }, "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw=="], @@ -1461,7 +1531,7 @@ "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="], - "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="], + "@babel/parser": ["@babel/parser@7.29.8", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="], "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A=="], @@ -1483,9 +1553,9 @@ "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], - "@babel/traverse": ["@babel/traverse@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/types": "^7.29.7", "debug": "^4.3.1" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="], + "@babel/traverse": ["@babel/traverse@7.29.8", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" } }, "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="], - "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], + "@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.2", "", {}, "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA=="], @@ -1513,18 +1583,6 @@ "@capsizecss/unpack": ["@capsizecss/unpack@2.4.0", "", { "dependencies": { "blob-to-buffer": "^1.2.8", "cross-fetch": "^3.0.4", "fontkit": "^2.0.2" } }, "sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q=="], - "@cbor-extract/cbor-extract-darwin-arm64": ["@cbor-extract/cbor-extract-darwin-arm64@2.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZKZ/F8US7JR92J4DMct6cLW/Y66o2K576+zjlEN/MevH70bFIsB10wkZEQPLzl2oNh2SMGy55xpJ9JoBRl5DOA=="], - - "@cbor-extract/cbor-extract-darwin-x64": ["@cbor-extract/cbor-extract-darwin-x64@2.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-32b1mgc+P61Js+KW9VZv/c+xRw5EfmOcPx990JbCBSkYJFY0l25VinvyyWfl+3KjibQmAcYwmyzKF9J4DyKP/Q=="], - - "@cbor-extract/cbor-extract-linux-arm": ["@cbor-extract/cbor-extract-linux-arm@2.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-tNg0za41TpQfkhWjptD+0gSD2fggMiDCSacuIeELyb2xZhr7PrhPe5h66Jc67B/5dmpIhI2QOUtv4SBsricyYQ=="], - - "@cbor-extract/cbor-extract-linux-arm64": ["@cbor-extract/cbor-extract-linux-arm64@2.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wfqgzqCAy/Vn8i6WVIh7qZd0DdBFaWBjPdB6ma+Wihcjv0gHqD/mw3ouVv7kbbUNrab6dKEx/w3xQZEdeXIlzg=="], - - "@cbor-extract/cbor-extract-linux-x64": ["@cbor-extract/cbor-extract-linux-x64@2.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rpiLnVEsqtPJ+mXTdx1rfz4RtUGYIUg2rUAZgd1KjiC1SehYUSkJN7Yh+aVfSjvCGtVP0/bfkQkXpPXKbmSUaA=="], - - "@cbor-extract/cbor-extract-win32-x64": ["@cbor-extract/cbor-extract-win32-x64@2.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-dI+9P7cfWxkTQ+oE+7Aa6onEn92PHgfWXZivjNheCRmTBDBf2fx6RyTi0cmgpYLnD1KLZK9ZYrMxaPZ4oiXhGA=="], - "@chevrotain/types": ["@chevrotain/types@11.1.2", "", {}, "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw=="], "@clack/core": ["@clack/core@1.0.0-alpha.1", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-rFbCU83JnN7l3W1nfgCqqme4ZZvTTgsiKQ6FM0l+r0P+o2eJpExcocBUWUIwnDzL76Aca9VhUdWmB2MbUv+Qyg=="], @@ -1537,6 +1595,8 @@ "@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.15.2", "", { "dependencies": { "@cloudflare/unenv-preset": "2.7.11", "@remix-run/node-fetch-server": "^0.8.0", "get-port": "^7.1.0", "miniflare": "4.20251118.1", "picocolors": "^1.1.1", "tinyglobby": "^0.2.12", "unenv": "2.0.0-rc.24", "wrangler": "4.50.0", "ws": "8.18.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0" } }, "sha512-SPMxsesbABOjzcAa4IzW+yM+fTIjx3GG1doh229Pg16FjSEZJhknyRpcld4gnaZioK3JKwG9FWdKsUhbplKY8w=="], + "@cloudflare/vitest-pool-workers": ["@cloudflare/vitest-pool-workers@0.12.6", "", { "dependencies": { "cjs-module-lexer": "^1.2.3", "esbuild": "0.27.0", "miniflare": "4.20260120.0", "wrangler": "4.60.0", "zod": "^3.25.76" }, "peerDependencies": { "@vitest/runner": "2.0.x - 3.2.x", "@vitest/snapshot": "2.0.x - 3.2.x", "vitest": "2.0.x - 3.2.x" } }, "sha512-smzhKzBdB4JYKo9bb8x3i70CtSj5GRhDfGvUhbLI7uPUv4QwMubddmZ+XYNekcy3C8/FG1fjLiwUqisITik8oQ=="], + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20251118.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-UmWmYEYS/LkK/4HFKN6xf3Hk8cw70PviR+ftr3hUvs9HYZS92IseZEp16pkL6ZBETrPRpZC7OrzoYF7ky6kHsg=="], "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20251118.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RockU7Qzf4rxNfY1lx3j4rvwutNLjTIX7rr2hogbQ4mzLo8Ea40/oZTzXVxl+on75joLBrt0YpenGW8o/r44QA=="], @@ -1585,11 +1645,13 @@ "@effect/sql-sqlite-bun": ["@effect/sql-sqlite-bun@4.0.0-beta.101", "", { "peerDependencies": { "effect": "^4.0.0-beta.101" } }, "sha512-s6AC7LXCEjCN+nKegKFY4MOi6bmT1+SLR9YHEYwhY3P5qyQQB4R5yYLgt+3J4EPp5fa3t4FIDdPEUwz9LdKm6g=="], + "@effect/vitest": ["@effect/vitest@4.0.0-beta.101", "", { "peerDependencies": { "effect": "^4.0.0-beta.101", "vitest": "^3.0.0 || ^4.0.0" } }, "sha512-F5Ur8pZYti0xkZFyb4hPZt8RrKQ1XBoC28ZkKxc7N1iPbhE9fWOvlWA1NC2XlN2wWG08yb5g5jR53LdOxjlhpQ=="], + "@electron/asar": ["@electron/asar@3.4.1", "", { "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" }, "bin": { "asar": "bin/asar.js" } }, "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA=="], "@electron/fuses": ["@electron/fuses@1.8.0", "", { "dependencies": { "chalk": "^4.1.1", "fs-extra": "^9.0.1", "minimist": "^1.2.5" }, "bin": { "electron-fuses": "dist/bin.js" } }, "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw=="], - "@electron/get": ["@electron/get@5.0.0", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^3.0.0", "graceful-fs": "^4.2.11", "progress": "^2.0.3", "semver": "^7.6.3", "sumchecker": "^3.0.1" }, "optionalDependencies": { "undici": "^7.24.4" } }, "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA=="], + "@electron/get": ["@electron/get@5.1.0", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^3.0.0", "graceful-fs": "^4.2.11", "progress": "^2.0.3", "semver": "^7.6.3", "sumchecker": "^3.0.1" }, "optionalDependencies": { "undici": "^7.24.4" } }, "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA=="], "@electron/notarize": ["@electron/notarize@2.5.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1", "promise-retry": "^2.0.1" } }, "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A=="], @@ -1615,11 +1677,11 @@ "@emmetio/stream-reader-utils": ["@emmetio/stream-reader-utils@0.1.0", "", {}, "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A=="], - "@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], + "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], - "@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], + "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], "@emotion/is-prop-valid": ["@emotion/is-prop-valid@0.8.8", "", { "dependencies": { "@emotion/memoize": "0.7.4" } }, "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA=="], @@ -1723,23 +1785,19 @@ "@fontsource/inter": ["@fontsource/inter@5.3.0", "", {}, "sha512-RofMylZmjlJEfELXeNHFWBRcSs75rGU/6bV2S2jfnvv/3rPXPGe0LgUJTklcHZ9lM4OZmAVFhcJPnACfb91A3g=="], - "@fontsource/noto-sans-math": ["@fontsource/noto-sans-math@5.2.5", "", {}, "sha512-1bxEvVlF51Vfgpju32mRZzI/CHvsfqjXjI2+sAuEyHYvXABUAIyj+93sCO3QZIoMG5drWyrzgoCqRQRaL6wQ8Q=="], + "@fontsource/noto-sans-math": ["@fontsource/noto-sans-math@5.2.8", "", {}, "sha512-LKP8MXf5if2NoQcpgkIWS3SKGk7b4IZCLKTTHEFmHuy1g/n5KKg21+wk4cTKEoJZtHaMo13jwd4Hw8TWxaz8gQ=="], - "@fontsource/noto-sans-symbols": ["@fontsource/noto-sans-symbols@5.2.5", "", {}, "sha512-mxoIRstsmZpZFzd/SRWiD+l6T7TGhpgCrGs7TEnnuGSQIfjVMrQT9Zej2enh9pkfmPNAFyeaGJkHkszJ1hH++w=="], + "@fontsource/noto-sans-symbols": ["@fontsource/noto-sans-symbols@5.2.8", "", {}, "sha512-x5U4btr3+aveZWNXK24tG3jvds7RRTg4diQ0D9nvZQxxtskbXVFEBP7Iok8TS86R9XHyg1TBS5GoR+ZLZSF5fw=="], - "@fontsource/noto-sans-symbols-2": ["@fontsource/noto-sans-symbols-2@5.2.5", "", {}, "sha512-F4O9WLifwoZS1quNzY1ebjMNo2cQPe/UP68Dmud0ONi2lOxaR6xp6fFPO2gG17MI7DwAnfMyQFl64A2tAd28hg=="], + "@fontsource/noto-sans-symbols-2": ["@fontsource/noto-sans-symbols-2@5.2.8", "", {}, "sha512-OGKq1CaSIszlSBc4Ie2XPBS8yFfF1fMfzjjoRRfpijjgjk1Xg/WSo/3Bg0cJdoxxIdQ0a2XENzJHhfpWLNv5Lw=="], "@gar/promise-retry": ["@gar/promise-retry@1.0.3", "", {}, "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA=="], "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], - "@grpc/grpc-js": ["@grpc/grpc-js@1.14.4", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ=="], - - "@grpc/proto-loader": ["@grpc/proto-loader@0.8.1", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg=="], - "@happy-dom/global-registrator": ["@happy-dom/global-registrator@20.0.11", "", { "dependencies": { "@types/node": "^20.0.0", "happy-dom": "^20.0.11" } }, "sha512-GqNqiShBT/lzkHTMC/slKBrvN0DsD4Di8ssBk4aDaVgEn+2WMzE6DXxq701ndSXj7/0cJ8mNT71pM7Bnrr6JRw=="], - "@hono/node-server": ["@hono/node-server@1.19.15", "", { "peerDependencies": { "hono": "^4" } }, "sha512-Za2ai6TLdKjUvnur+eenO6nuYYipVAEhyCAdaV8IRvmU9kK8crOZUSYvIXn72E4f8fJqyAbpcJuTsYYmZp9Deg=="], + "@hono/node-server": ["@hono/node-server@1.19.17", "", { "peerDependencies": { "hono": "^4" } }, "sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ=="], "@hono/standard-validator": ["@hono/standard-validator@0.2.0", "", { "peerDependencies": { "@standard-schema/spec": "1.0.0", "hono": ">=3.9.0" } }, "sha512-pFq0UVAnjzXcDAgqFpDeVL3MOUPrlIh/kPqBDvbCYoThVhhS+Vf37VcdsakdOFFGiqoiYVxp3LifXFhGhp/rgQ=="], @@ -1747,7 +1805,7 @@ "@ibm/telemetry-js": ["@ibm/telemetry-js@1.11.0", "", { "bin": { "ibmtelemetry": "dist/collect.js" } }, "sha512-RO/9j+URJnSfseWg9ZkEX9p+a3Ousd33DBU7rOafoZB08RqdzxFVYJ2/iM50dkBuD0o7WX7GYt1sLbNgCoE+pA=="], - "@iconify-json/lucide": ["@iconify-json/lucide@1.2.119", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-KbrC7fT5wPshV1KLRM0k91poP0OH4eKEVywEOH0FCczKb+qth8Pcq1Hy9kS2tXeF52s23qzLnG8AJsExPSupeA=="], + "@iconify-json/lucide": ["@iconify-json/lucide@1.2.122", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-Dpt+ZbYTyKZqyRkEHmxEcsSsRW9yRTmkaweT2A1hfH7zKHZZ7FKmcn5evTh93ZlkYq2Vpb1YZUBsjc9AxZlcUg=="], "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], @@ -1807,7 +1865,7 @@ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], - "@internationalized/date": ["@internationalized/date@3.12.2", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw=="], + "@internationalized/date": ["@internationalized/date@3.12.3", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-fuLX+3ZKLsxI73y8b01EG/WjHb6gE6weCqlfawPO27kBWGMh9G1yH6Csv1uU7/cac9H2GHmOMt6CjmuQ1aia4Q=="], "@internationalized/number": ["@internationalized/number@3.6.7", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg=="], @@ -1831,8 +1889,6 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], - "@js-temporal/polyfill": ["@js-temporal/polyfill@0.5.1", "", { "dependencies": { "jsbi": "^4.3.0" } }, "sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ=="], "@jsx-email/all": ["@jsx-email/all@2.2.3", "", { "dependencies": { "@jsx-email/body": "1.0.2", "@jsx-email/button": "1.0.4", "@jsx-email/column": "1.0.3", "@jsx-email/container": "1.0.2", "@jsx-email/font": "1.0.3", "@jsx-email/head": "1.0.2", "@jsx-email/heading": "1.0.2", "@jsx-email/hr": "1.0.2", "@jsx-email/html": "1.0.2", "@jsx-email/img": "1.0.2", "@jsx-email/link": "1.0.2", "@jsx-email/markdown": "2.0.4", "@jsx-email/preview": "1.0.2", "@jsx-email/render": "1.1.1", "@jsx-email/row": "1.0.2", "@jsx-email/section": "1.0.2", "@jsx-email/tailwind": "2.4.4", "@jsx-email/text": "1.0.2" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-OBvLe/hVSQc0LlMSTJnkjFoqs3bmxcC4zpy/5pT5agPCSKMvAKQjzmsc2xJ2wO73jSpRV1K/g38GmvdCfrhSoQ=="], @@ -1961,9 +2017,11 @@ "@napi-rs/canvas-win32-x64-msvc": ["@napi-rs/canvas-win32-x64-msvc@1.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-okU8/t2foV6C31n0GtvEMbfD5rOFc70+/6xUNME9Guld29sgSOIGUEDScAWFlcP3k5TYQRl9TNkwJEEjh15w8A=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], + "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="], - "@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.2", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" } }, "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw=="], + + "@noble/hashes": ["@noble/hashes@2.3.0", "", {}, "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ=="], "@nodable/entities": ["@nodable/entities@3.0.0", "", {}, "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw=="], @@ -2007,11 +2065,11 @@ "@octokit/auth-app": ["@octokit/auth-app@8.0.1", "", { "dependencies": { "@octokit/auth-oauth-app": "^9.0.1", "@octokit/auth-oauth-user": "^6.0.0", "@octokit/request": "^10.0.2", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "toad-cache": "^3.7.0", "universal-github-app-jwt": "^2.2.0", "universal-user-agent": "^7.0.0" } }, "sha512-P2J5pB3pjiGwtJX4WqJVYCtNkcZ+j5T2Wm14aJAEIC3WJOrv12jvBley3G1U/XI8q9o1A7QMG54LiFED2BiFlg=="], - "@octokit/auth-oauth-app": ["@octokit/auth-oauth-app@9.0.3", "", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.3", "@octokit/auth-oauth-user": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg=="], + "@octokit/auth-oauth-app": ["@octokit/auth-oauth-app@9.0.4", "", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.4", "@octokit/auth-oauth-user": "^6.0.3", "@octokit/request": "^10.0.13", "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-Pe3du5LrC6dlv10b0RbarBlJtIT1Urq8BFoQklK8WmBw8YKnGgrANn7cQmHiA1v8AVihgi7YutV8MncP57I4og=="], - "@octokit/auth-oauth-device": ["@octokit/auth-oauth-device@8.0.3", "", { "dependencies": { "@octokit/oauth-methods": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw=="], + "@octokit/auth-oauth-device": ["@octokit/auth-oauth-device@8.0.4", "", { "dependencies": { "@octokit/oauth-methods": "^6.0.3", "@octokit/request": "^10.0.13", "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-M/+34rmkxMvUnnTo/uqNeVRCXJoJ+5N34eNTbL1KMtIyJpedCTsu/iFL1cWdL+w5hQMlYt6xzXoyux2gn0OVnw=="], - "@octokit/auth-oauth-user": ["@octokit/auth-oauth-user@6.0.2", "", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.3", "@octokit/oauth-methods": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A=="], + "@octokit/auth-oauth-user": ["@octokit/auth-oauth-user@6.0.3", "", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.4", "@octokit/oauth-methods": "^6.0.3", "@octokit/request": "^10.0.13", "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-t4OKUhrI5britmpRiSzPAz1TJPyUN/Hw1HEE3Hz/uElxcmnf/YCRSKtFRNc5gy4yJFTlXgk34H1lvxiotQJQvQ=="], "@octokit/auth-token": ["@octokit/auth-token@4.0.0", "", {}, "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA=="], @@ -2023,7 +2081,7 @@ "@octokit/oauth-authorization-url": ["@octokit/oauth-authorization-url@8.0.0", "", {}, "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ=="], - "@octokit/oauth-methods": ["@octokit/oauth-methods@6.0.2", "", { "dependencies": { "@octokit/oauth-authorization-url": "^8.0.0", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0" } }, "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng=="], + "@octokit/oauth-methods": ["@octokit/oauth-methods@6.0.4", "", { "dependencies": { "@octokit/oauth-authorization-url": "^8.0.0", "@octokit/request": "^10.0.13", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0" } }, "sha512-96RsnxS7Hk/BQhUA1Qo2pmcYP6LWQRWMdo7bVbNE7ZCkFLhSUYBXVUj9tVnvhl4jzbwHYt/dcIG+ioY427b2sg=="], "@octokit/openapi-types": ["@octokit/openapi-types@25.1.0", "", {}, "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA=="], @@ -2081,6 +2139,8 @@ "@opencode-ai/httpapi-codegen": ["@opencode-ai/httpapi-codegen@workspace:packages/httpapi-codegen"], + "@opencode-ai/lab-catalog": ["@opencode-ai/lab-catalog@workspace:packages/lab/catalog"], + "@opencode-ai/merman": ["@opencode-ai/merman@workspace:packages/merman"], "@opencode-ai/plugin": ["@opencode-ai/plugin@workspace:packages/plugin"], @@ -2123,9 +2183,11 @@ "@opencode-ai/web": ["@opencode-ai/web@workspace:packages/web"], + "@opencode-ai/workerd-spike": ["@opencode-ai/workerd-spike@workspace:packages/workerd-spike"], + "@opencode-ai/www": ["@opencode-ai/www@workspace:packages/www"], - "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@2.9.0", "", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Seva+NCa0WUQnJIUE5GzHsUv1WTIeyqwz0ELl2VtS6NP+eF+77yCXGFVOMbvoCM7QMjlnhv7931e89R+8pJdcQ=="], + "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@2.10.0", "", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-FMsAEjLUt5pWuRE2LDC/LCvVrFjLlrEzUITH5+5SZtfq7KZ2wrOHjQVxzz92sju8S9ltpzW87CLW8/b0oBXVCw=="], "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], @@ -2153,27 +2215,27 @@ "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.43.0", "", {}, "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg=="], - "@opentui/core": ["@opentui/core@0.0.0-20260808-9ecf7c0a", "", { "dependencies": { "bun-ffi-structs": "0.3.1", "diff": "9.0.0", "marked": "17.0.1", "string-width": "7.2.0", "strip-ansi": "7.1.2" }, "optionalDependencies": { "@opentui/core-darwin-arm64": "0.0.0-20260808-9ecf7c0a", "@opentui/core-darwin-x64": "0.0.0-20260808-9ecf7c0a", "@opentui/core-linux-arm64": "0.0.0-20260808-9ecf7c0a", "@opentui/core-linux-arm64-musl": "0.0.0-20260808-9ecf7c0a", "@opentui/core-linux-x64": "0.0.0-20260808-9ecf7c0a", "@opentui/core-linux-x64-musl": "0.0.0-20260808-9ecf7c0a", "@opentui/core-win32-arm64": "0.0.0-20260808-9ecf7c0a", "@opentui/core-win32-x64": "0.0.0-20260808-9ecf7c0a" }, "peerDependencies": { "web-tree-sitter": "0.25.10" } }, "sha512-y9MKL8LMup4ebW3uZ57RSsPyOv37sIZxuWiHq4XJK9wrzpzTMnVomzxpWOI0S/QtLH2QzZ7znnbF+IuvIQ1hLQ=="], + "@opentui/core": ["@opentui/core@0.5.2", "", { "dependencies": { "bun-ffi-structs": "0.3.1", "diff": "9.0.0", "marked": "17.0.1", "string-width": "7.2.0", "strip-ansi": "7.1.2" }, "optionalDependencies": { "@opentui/core-darwin-arm64": "0.5.2", "@opentui/core-darwin-x64": "0.5.2", "@opentui/core-linux-arm64": "0.5.2", "@opentui/core-linux-arm64-musl": "0.5.2", "@opentui/core-linux-x64": "0.5.2", "@opentui/core-linux-x64-musl": "0.5.2", "@opentui/core-win32-arm64": "0.5.2", "@opentui/core-win32-x64": "0.5.2" }, "peerDependencies": { "web-tree-sitter": "0.25.10" } }, "sha512-GOuD0Mq1ylybq9eEX6L0TdYlfJ2zJVLGecuh6yEM8RpT9oMtR0f+gEWqGJsBN/ay+Y5TOCH9b3vePEcwOW01fg=="], - "@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.0.0-20260808-9ecf7c0a", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Bn6fUZrwbUojkJG4YHowg/h/u3SPANmEivrl8YVbxBPCYOhZzQWxAVf7Fwg6PD0BpWk5gt9inQrir2DzWh5UpA=="], + "@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-fGi/RubZIhxcU8+M3GXNaBmEHqf127ZOnKmUTSp4ty2QdQ0kT4RTd+t91a/oyxrLZjjCmry0jXyquT0CZR1Byw=="], - "@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.0.0-20260808-9ecf7c0a", "", { "os": "darwin", "cpu": "x64" }, "sha512-lrVskzbjcT9yJCUgjOpvPpEq2ipmuDyHTMJ+OebsJFdATdryJLzRAr5BZiFGXEo4CJ2CS/+6vT+ki7dmhpM+0g=="], + "@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.5.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ezFpB+5mQTd9BS4VvHOYEgQK6YxiYwVUmFb2sfTbJBnTqbOFP3Z/cdE5qNUHoeLQ01/nOs2dmUPcGyWxtMZIzw=="], - "@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.0.0-20260808-9ecf7c0a", "", { "os": "linux", "cpu": "arm64" }, "sha512-czqIqdnBvyFRSJ0BEdNn7moRN0KQo5gvhSsOSfrzueHxsktgWcmk1cMeCvTkzC3JCBvCwlB1KnSdt4jlwNO1EQ=="], + "@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-9S53zkIkbwRb0iIv2thibK+IofpTCEz/c48rJNaBx3qDylaDcTA11k5oqt1gkFcOLernlqIcow8aMCNDnRYMAA=="], - "@opentui/core-linux-arm64-musl": ["@opentui/core-linux-arm64-musl@0.0.0-20260808-9ecf7c0a", "", { "os": "linux", "cpu": "arm64" }, "sha512-6nixv6wlgjelUVJVHkJsCpuARb1rE/oxhIIthyLd062u5veoBt83cRGH9KmcZiwowKvso58hXn2KC21qAfylhQ=="], + "@opentui/core-linux-arm64-musl": ["@opentui/core-linux-arm64-musl@0.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-s2DB6he7jgbBqWOHBAIV/p4X12mj+Hlk1pAEcwK36j2wg+L4nVVdWecUJm1xeJn6LJSRcaJYE29sA45w5b7B2g=="], - "@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.0.0-20260808-9ecf7c0a", "", { "os": "linux", "cpu": "x64" }, "sha512-cxJMfrSsMsrZdU1Ke6awrxz0rdIJuI34l8Le3QlUbM5yLpp09ygJ7CElILMT50g3F+EnRf6BKvVmkbRrDzFQ6g=="], + "@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-HO0TWovqxo95hxFoTBx47MTP6pzzTW/QMoOIiD8jw0hkrn1DF8rSVPva0vLQMRer/drO9RpjyroFRNra7710og=="], - "@opentui/core-linux-x64-musl": ["@opentui/core-linux-x64-musl@0.0.0-20260808-9ecf7c0a", "", { "os": "linux", "cpu": "x64" }, "sha512-7zVbZ0XgCDi3yImmd9Cj+e0WhSuQzWo1ziSQiFgPCR8cs/dfrpYLgBlX9PP0gFOcJKeRccJJv7rnBetl3CB7tg=="], + "@opentui/core-linux-x64-musl": ["@opentui/core-linux-x64-musl@0.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-zyuJaRGBRbUOABgf3nJ2Jk/NmD+gS2dQpJzC2ikr2OMqclPVk7gFbPTHW2s/A3SJH7D8d0PJ6wL2wzXWMUdrWQ=="], - "@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.0.0-20260808-9ecf7c0a", "", { "os": "win32", "cpu": "arm64" }, "sha512-K3SNYJDvB7XD5nxi8jt4jWtgmqPG0Qbob0Px9afqMH3g/R5hIoi2P3GDbqn8JNv82c4dPIGJjXXuNhHa0tZQbw=="], + "@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.5.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-J1QxYJqxyAO49RyocqZSoGWs5uszlYot8sInLasi6nUbjCFg4h7Kvh+64+gxE2i4LASeyvMRpAIYwblI6eMbtg=="], - "@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.0.0-20260808-9ecf7c0a", "", { "os": "win32", "cpu": "x64" }, "sha512-3JCpPS8+Gz3PWlQHiFwqYuJ0AM0vKlfbe4+O+0m2EYej/QjN5KjL1nBfVLq5XDj4dVPEIktQKN6e//YzSzdaqA=="], + "@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.5.2", "", { "os": "win32", "cpu": "x64" }, "sha512-9/F1Q19GdtkZ1jypa0dRP6v9SJHHc91XHs4ZSroamDeqSDyTaGu1bbWnKiC503gpNpQMY0mjOVg4g+WVJLdDig=="], - "@opentui/keymap": ["@opentui/keymap@0.0.0-20260808-9ecf7c0a", "", { "dependencies": { "@opentui/core": "0.0.0-20260808-9ecf7c0a" }, "peerDependencies": { "@opentui/react": "0.0.0-20260808-9ecf7c0a", "@opentui/solid": "0.0.0-20260808-9ecf7c0a", "react": ">=19.2.0", "solid-js": "1.9.12" }, "optionalPeers": ["@opentui/react", "@opentui/solid", "react", "solid-js"] }, "sha512-aGxw6P0RJSuUU3y3QtAnKa1B6tQShxR0mjmnN3Cadr4LoduSuWn/l1kE+27KwH0ap9WTAeGVsN7u2oawB9eWKw=="], + "@opentui/keymap": ["@opentui/keymap@0.5.2", "", { "dependencies": { "@opentui/core": "0.5.2" }, "peerDependencies": { "@opentui/react": "0.5.2", "@opentui/solid": "0.5.2", "react": ">=19.2.0", "solid-js": "1.9.12" }, "optionalPeers": ["@opentui/react", "@opentui/solid", "react", "solid-js"] }, "sha512-MKESKHGeGit/i416E4zOujJIn17ladl6w9oOACmrjgff3a1naLFF3salrkUjD0C+uTUvh+nNTah795RORTTMyQ=="], - "@opentui/solid": ["@opentui/solid@0.0.0-20260808-9ecf7c0a", "", { "dependencies": { "@babel/core": "7.28.0", "@babel/preset-typescript": "7.27.1", "@opentui/core": "0.0.0-20260808-9ecf7c0a", "babel-plugin-module-resolver": "5.0.2", "babel-preset-solid": "1.9.12", "entities": "7.0.1", "s-js": "^0.4.9" }, "peerDependencies": { "solid-js": "1.9.12" } }, "sha512-Q7ouv2KxZKO0/Sh0RbhNd7kEw6E7tlrU+yw36xxlnyXOqlK3TkQ+u1RMSZulYAn8mP20pnYLM9OxY4pOC/wK8Q=="], + "@opentui/solid": ["@opentui/solid@0.5.2", "", { "dependencies": { "@babel/core": "7.28.0", "@babel/preset-typescript": "7.27.1", "@opentui/core": "0.5.2", "babel-plugin-module-resolver": "5.0.2", "babel-preset-solid": "1.9.12", "entities": "7.0.1", "s-js": "^0.4.9" }, "peerDependencies": { "solid-js": "1.9.12" } }, "sha512-mPB6xhG0bufjhUpWj5e8g/1M3LYZUKPM0mPPz6O6KIXFtakHVCJZuff2l1vvDpKuuLOAjivL8jLU7OJ3ZSCRuw=="], "@orama/orama": ["@orama/orama@3.1.18", "", {}, "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA=="], @@ -2257,7 +2319,7 @@ "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.127.0", "", { "os": "win32", "cpu": "x64" }, "sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w=="], - "@oxc-project/types": ["@oxc-project/types@0.139.0", "", {}, "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw=="], + "@oxc-project/types": ["@oxc-project/types@0.143.0", "", {}, "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA=="], "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA=="], @@ -2541,107 +2603,105 @@ "@remix-run/router": ["@remix-run/router@1.9.0", "", {}, "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.1.5", "", { "os": "android", "cpu": "arm64" }, "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.3", "", { "os": "android", "cpu": "arm64" }, "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.1.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw=="], + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.1.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.1.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.1.5", "", { "os": "linux", "cpu": "arm" }, "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.3", "", { "os": "linux", "cpu": "arm" }, "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.1.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.1.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q=="], - "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.1.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg=="], + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w=="], - "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.1.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA=="], + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.1.5", "", { "os": "linux", "cpu": "x64" }, "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.3", "", { "os": "linux", "cpu": "x64" }, "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.1.5", "", { "os": "linux", "cpu": "x64" }, "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.3", "", { "os": "linux", "cpu": "x64" }, "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.1.5", "", { "os": "none", "cpu": "arm64" }, "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.3", "", { "os": "none", "cpu": "arm64" }, "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug=="], - "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.1.5", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.1.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw=="], - - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.1.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.3", "", { "os": "win32", "cpu": "x64" }, "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg=="], "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.2", "", { "os": "android", "cpu": "arm" }, "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.4", "", { "os": "android", "cpu": "arm" }, "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.4", "", { "os": "android", "cpu": "arm64" }, "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.4", "", { "os": "linux", "cpu": "arm" }, "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.4", "", { "os": "linux", "cpu": "arm" }, "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.4", "", { "os": "linux", "cpu": "none" }, "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA=="], - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.4", "", { "os": "linux", "cpu": "none" }, "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w=="], - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.4", "", { "os": "linux", "cpu": "none" }, "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.4", "", { "os": "linux", "cpu": "none" }, "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.4", "", { "os": "linux", "cpu": "x64" }, "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.4", "", { "os": "linux", "cpu": "x64" }, "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA=="], - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg=="], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.2", "", { "os": "none", "cpu": "arm64" }, "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.4", "", { "os": "none", "cpu": "arm64" }, "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg=="], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.4", "", { "os": "win32", "cpu": "x64" }, "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.4", "", { "os": "win32", "cpu": "x64" }, "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q=="], - "@scalar/astro": ["@scalar/astro@0.4.11", "", { "dependencies": { "@scalar/client-side-rendering": "0.3.4" }, "peerDependencies": { "astro": "^4.0.0 || ^5.0.0" } }, "sha512-iZHZrLb0bx/s9efUkn5JKdZeyawODmfnoJl5hTu1uJxUwjKtAVtx8MFVXo8JkyC3/s8XFXGGs66d+S/Ji8eYJg=="], + "@scalar/astro": ["@scalar/astro@0.4.13", "", { "dependencies": { "@scalar/client-side-rendering": "0.3.6" }, "peerDependencies": { "astro": "^4.0.0 || ^5.0.0" } }, "sha512-qrWFDu7q/fx4k9vde/Lxl6k9ZKzU2SP0XQ1HeSRqnpBbe8wsn0bmGzXz4p/vNcjodHFqieJlF96NyK3jcxdvkw=="], - "@scalar/client-side-rendering": ["@scalar/client-side-rendering@0.3.4", "", { "dependencies": { "@scalar/schemas": "0.7.4", "@scalar/types": "0.16.4", "@scalar/validation": "0.6.2" } }, "sha512-kb3B+FGjvAUr2DU0fe9dVKBLwot1TjOO+iHCTmY8r8FUJySmYKGQYCicRzzilOyTjvKspiZBCEr03PWaWW+1gw=="], + "@scalar/client-side-rendering": ["@scalar/client-side-rendering@0.3.6", "", { "dependencies": { "@scalar/schemas": "0.8.1", "@scalar/types": "0.17.1", "@scalar/validation": "0.6.2" } }, "sha512-CshKXof+tyu0tpgMhRSoNw6Fnn1ywVveJnb5iIJ8ue/FIVn6rP+BEQcgdIiNUPBEXHaAnz+HCGGiScKRzXRB7Q=="], - "@scalar/helpers": ["@scalar/helpers@0.9.2", "", {}, "sha512-hjyMpMZjTBZQhyByZmz5oUgRKUQJO5V5AOiJxsVEGbUmgA7sJRQeTrXLB+BEwzaKS5nm2opJeNyMBYLFNK4hiQ=="], + "@scalar/helpers": ["@scalar/helpers@0.10.0", "", {}, "sha512-IAfnpIZnXY6ni+zyFMwWHBa5b/7yr4mCSvoTGR84oS9q4Quy2wjgafnr7CyfL65ney3iilBZHigZYLYqdqCu3Q=="], - "@scalar/json-magic": ["@scalar/json-magic@0.12.19", "", { "dependencies": { "@scalar/helpers": "0.9.2", "pathe": "^2.0.3", "yaml": "^2.8.3" } }, "sha512-1T4QoFYZ1nKt25xFeHtghAuZzaLq2X4CpCSLFXG0Fjcz6K2HIZqo+RtywfI0WD8RRRRgS34keo7X4Gv1BQUNoQ=="], + "@scalar/json-magic": ["@scalar/json-magic@0.12.20", "", { "dependencies": { "@scalar/helpers": "0.10.0", "pathe": "^2.0.3", "yaml": "^2.9.0" } }, "sha512-5JawJ1L3+ddDoKefkXsklKs6CmmTIcPDmkJPpAkbRi9QQiU9MUONQ4VSi2z3ij+8Ka4neNhsXBNG4itPjurBLg=="], - "@scalar/openapi-parser": ["@scalar/openapi-parser@0.28.10", "", { "dependencies": { "@scalar/helpers": "0.9.2", "@scalar/json-magic": "0.12.19", "@scalar/openapi-types": "0.9.3", "@scalar/openapi-upgrader": "0.2.11", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.8.3" } }, "sha512-jn3ftvtNTcWOgxf7XVn9CvJGMjFS7QU1b6FiGmibzAlR/6pOP3Ei7sBBnfIY4PBwHjHgMAGBoGApfOV8h75gPQ=="], + "@scalar/openapi-parser": ["@scalar/openapi-parser@0.28.12", "", { "dependencies": { "@scalar/helpers": "0.10.0", "@scalar/json-magic": "0.12.20", "@scalar/openapi-types": "0.9.4", "@scalar/openapi-upgrader": "0.2.13", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.9.0" } }, "sha512-s9XgyuWOJ2hQuojulgVm86upBF6vG8IQ8XSCpZxemm6Z2qVncNw2qsZKZ3+6eJOqCQEgJLmvgHSlXpRKq1si9Q=="], - "@scalar/openapi-types": ["@scalar/openapi-types@0.9.3", "", {}, "sha512-34qglt5jSo55iZfH9i7EhjQCdE0Po2xZeh8wytQKolSnXrxsYMSyFDJEBxz1Gaew4on9N3XIWsd0QpwKVA5CSA=="], + "@scalar/openapi-types": ["@scalar/openapi-types@0.9.4", "", {}, "sha512-eUSIjZEBLEF2i2pvcNdzXhzlKx6qt+hZsNklLmCyzPBoXWxHcQaEClgMFavXDRRvJDdi6LkyjqGUqqf0XgRgFg=="], - "@scalar/openapi-upgrader": ["@scalar/openapi-upgrader@0.2.11", "", { "dependencies": { "@scalar/openapi-types": "0.9.3" } }, "sha512-eYEFBO8mZfgXEO/hv8rdL5OA4oOB8orFT5kXNK4I/x9xca2D7A4BteuFXqRaw9lE1CIjtG+StlAUYVz5omTXew=="], + "@scalar/openapi-upgrader": ["@scalar/openapi-upgrader@0.2.13", "", { "dependencies": { "@scalar/openapi-types": "0.9.4" } }, "sha512-bPTkDsthDXj/3bgO7RDmRra1OfwxG/uQio6LP0h9Z8NCCgoZQ4E+V7S6bwF/9TWxbMRlb9djRNpbXCTh/L3C5g=="], - "@scalar/schemas": ["@scalar/schemas@0.7.4", "", { "dependencies": { "@scalar/helpers": "0.9.2", "@scalar/validation": "0.6.2" } }, "sha512-Or31zxR+ceGGhkVU5XBO2Zv7oyGDtjsJOjM2Rr0WRZ1/tRsQc2/FsVv+9kPmCA7sqFL8BKWlNfTXcPITI7WRHw=="], + "@scalar/schemas": ["@scalar/schemas@0.8.1", "", { "dependencies": { "@scalar/helpers": "0.10.0", "@scalar/validation": "0.6.2" } }, "sha512-SGB/Verzjf6wpULdOIQfCCPvG46GTVYawirjQ8AVSFSIMduS6zz1MpL+I90Z8/zjeSbjtwRoLtjjWb2yByEjfQ=="], - "@scalar/types": ["@scalar/types@0.16.4", "", { "dependencies": { "@scalar/helpers": "0.9.2", "nanoid": "^5.1.6", "type-fest": "^5.3.1", "zod": "^4.3.5" } }, "sha512-fLf0ANAC3iQq0sIVdmH6aGM+pFSLyD8GfGBxSWcLpI0jE0iFAzX2A3p0qVZm7vqBT4TQnn0fSwg5U+h+FZ52BA=="], + "@scalar/types": ["@scalar/types@0.17.1", "", { "dependencies": { "@scalar/helpers": "0.10.0", "nanoid": "^5.1.6", "type-fest": "^5.3.1", "zod": "^4.3.5" } }, "sha512-jqudbDtdvP/SiOTuj7Gg3dBY8IMb7oeJI/7K4QF2cOiWgnbYUQFeaYzktpNZwcCQkIJwlxYfd0i97KwlyD9GMQ=="], "@scalar/validation": ["@scalar/validation@0.6.2", "", {}, "sha512-Sc1TkcwGV6aVCO51AyKeaGiP8gpwAHxEtO5d3tZzPV+KsnlC/YokQxFxwBrbIXw73k9hmcExnJyGu3k5i6n6VA=="], @@ -2701,7 +2761,7 @@ "@shikijs/transformers": ["@shikijs/transformers@3.9.2", "", { "dependencies": { "@shikijs/core": "3.9.2", "@shikijs/types": "3.9.2" } }, "sha512-MW5hT4TyUp6bNAgTExRYLk1NNasVQMTCw1kgbxHcEC0O5cbepPWaB+1k+JzW9r3SP2/R8kiens8/3E6hGKfgsA=="], - "@shikijs/twoslash": ["@shikijs/twoslash@4.3.1", "", { "dependencies": { "@shikijs/core": "4.3.1", "@shikijs/types": "4.3.1", "twoslash": "^0.3.9" }, "peerDependencies": { "typescript": ">=5.5.0" } }, "sha512-xK8inH/gK++1V4rTxrwCwjvaNwkkJ7oDjOIpdqONVxIpAFnVC3gzqjH5KiXGTelUcxpUJ3PtOKWct1YQ0kAloA=="], + "@shikijs/twoslash": ["@shikijs/twoslash@4.4.2", "", { "dependencies": { "@shikijs/core": "4.4.2", "@shikijs/types": "4.4.2", "twoslash": "^0.3.9" }, "peerDependencies": { "typescript": ">=5.5.0" } }, "sha512-JjPKNbYCZn5+DVOxDZJ0ZruFPBM7m2JQBp4WbLh4tU2y3ed93wBCaQhKwMyfTFIsDzHks22szAkUUd2+jIPo/w=="], "@shikijs/types": ["@shikijs/types@3.9.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-/M5L0Uc2ljyn2jKvj4Yiah7ow/W+DJSglVafvWAJ/b8AZDeeRAdMu3c2riDzB7N42VD+jSnWxeP9AKtd4TfYVw=="], @@ -2735,89 +2795,89 @@ "@slack/web-api": ["@slack/web-api@6.13.0", "", { "dependencies": { "@slack/logger": "^3.0.0", "@slack/types": "^2.11.0", "@types/is-stream": "^1.1.0", "@types/node": ">=12.0.0", "axios": "^1.7.4", "eventemitter3": "^3.1.0", "form-data": "^2.5.0", "is-electron": "2.2.2", "is-stream": "^1.1.0", "p-queue": "^6.6.1", "p-retry": "^4.0.0" } }, "sha512-dv65crIgdh9ZYHrevLU6XFHTQwTyDmNqEqzuIrV+Vqe/vgiG6w37oex5ePDU1RGm2IJ90H8iOvHFvzdEO/vB+g=="], - "@smithy/config-resolver": ["@smithy/config-resolver@4.6.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-7qUsqGDU7yup+ARqI6CO1KOz8rjVPpyzbdQX4dab+3GEl4YnmpnhUnwZb5BLtZC0TqOAwyv1UJiocgRhLHVNWA=="], + "@smithy/config-resolver": ["@smithy/config-resolver@4.6.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-XMDfb7LTrlUeI9PpfMa6xzRv+yMtYFsr1LqTsR3CGpSSaaPIR5ldlAiXyLjFYmbh1/DD5NxHmDybdh6lJjJM+Q=="], - "@smithy/core": ["@smithy/core@3.30.0", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-dl2yRglDxfzH9uJ4fSo4zTaAHa0zH7+V7BZMRWy8hEYIKT1BiqMUK/CN6T3ADQ3kbA5N1tmUulroJ2UtONS7Kw=="], + "@smithy/core": ["@smithy/core@3.31.1", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-CyogUINxvi7C7LDsh8Syo6hVJOT9ckz4rG8dRZfTJ8r91HkMY59PnNooaj7WcHyxEkxPfBAmbgztZU+xTo76lg=="], - "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-QgbuahIb2qxQeZQvNK0sw3aF3JH5zwH8j2lLp5DUasVXexGGMWULAR+7z0omPXFolCP/m5wN9M5lm9EGdSviTQ=="], + "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-QfuLWAkLzptffFW980AFeHZFdqds2B64rpEd3uJ6lgs3xVn9QegGMUgUcj+4d7dRrAsya3r58ZKpku97WcFb4w=="], "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.14", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw=="], - "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-nNy0T3FoMk4U8JS+MsA2hIRclzoBogYg50SDItWii2KM5dsSZIcXcMLkBaJMDkTT/hjrm0CBDJd8KNIeUuSWAw=="], + "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-t+RmwgPwqlhzHxH9EHubIkyN2eSAuy5d4LR7gz/HsUZRHkXpHRuzjiPvD7fLIVefhgSakGoiiiJ1jUursfFkMQ=="], - "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.5.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-EoCNcYtHfa+78QmRY5uwQBtmYwY1aiaRG3m5TokDjr4qGOcnCnS3/BCeQZ7KbxmjBZBe4uuNl3CicUZ2qy2PcQ=="], + "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.5.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-XSqzMmc3iUO+jC50lQET3l8fX8qvt9apyQMobmHy8o9Ax4eDcIqWvXKdzGJJanJZNeqfH+Itwo6l4tspmKQekA=="], - "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-qrwFz7xMIEhQDhRJ2IS+SvhnCuLMB6rCaGXT41XMJyviGC/+uTxOUTk/pDArsQ68RyjIcwQH5+UD9VJjnMHGRQ=="], + "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-xIWOCcsrQPlWzxXfdPer0cHzvEDycVKk76F1Oxl73qXq8lZuGd+lzJYWo3vkrXnrwqFya95urMmYMjDIY7hG8g=="], - "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.6.11", "", { "dependencies": { "@smithy/core": "^3.30.0", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-o0Zkj1nKqJAoq+a+BrkhU39tRftMNjLwpc/z06Frfl43wpbHrJMaSAVZE4vTqlxtVkNaGaT0bIDxOp7tkFTuQQ=="], + "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.6.13", "", { "dependencies": { "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-4fW86pEUOMbrD5nkbyl/tTvPHHWJFbuB2odl6ps9lWfHoXf9HWh3Q/Smh59qH1g7+c/BSZghX6bbUk4gsiMs8A=="], - "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-2oFwcnYUChslJY1xFlqigC4y7EIBemPiAtZP65Ec8o/IVxEkv/sHOhAtcYiFlygNVBKGxmMud9mKP4aUEn348w=="], + "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-B3yUUqflj/L1HY1QvSLSmU+NOtG5mroO4+dXj3sjqWKxdO//wrlSpkymV+dkVpwUJvwCXtSAybdzs2WIiCArjQ=="], - "@smithy/hash-node": ["@smithy/hash-node@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-kd+H/Vmy6RHGU1m4SSyZ2BaMbPwPcAAX1zmQ5sI1Ljug4oGKYCVjbkPo3yqbUlzvGhogF/TtwSnwCDwlflYUlg=="], + "@smithy/hash-node": ["@smithy/hash-node@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-9NJHd8scrdVORvnaMHIHgPipGxLiTK3FMNUfWl0tHn2fwJIEk4rZ3OM793yIWV8L+WKu+AWQZBcVyd5qrVXy+A=="], - "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-z/djW+1jpBys4eFEVvYXBfMQ1SIM6VcLpwzo5naMec7AIgIx9ekm6GYtZIcMPpeyQWNp/mNl44xLtHLD4qKJPA=="], + "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-ZhloOl0+kyQHlmaEhYvsPbNs9ekLHsbMt82W70v0ChIQKbm1HaUAozWDph2QmA8L/PtiP6cwy+6nPTffVNjBMg=="], - "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-AN3I5u5YQAmrQNXR4F6cA6UnWuN78jOFn+vdk6Fj20OO8GFbLCPDun1Cdwk0ogv6EISyG14s9mJ4YAR2b3ldgw=="], + "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-fEXR2jKLnu1U9sL/Obdkxs8f3M1pLSDjM30cMmpz2L61oGnlUdx1Z9Wj+9+mID7kKldEVOUQfuXqHrK4RP90FA=="], - "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-rwpQTYuDHVSzVyAVHKvf3Bfz4jFQ4u+ycqI+osucN1dR+2UIJJwLvPM/aWwf5ErkCnQt6J2yje4qH0TWIwVMkA=="], + "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-Uu5RVG+BjnS74dzSlQbK50ONlE3DD9YXdZwlBbZRCjvEp5KrBu/FPwO3SyDBYf6l12Q0DxSFdjeBiIh+7gNcmg=="], - "@smithy/md5-js": ["@smithy/md5-js@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-qaAvszTVZTo+f4aGMGKZII9BhHi1ZAEAJw/uDO629RVJr0RbdnMZySYNOi1louQE2WvpcRYw3Sv44mhuIMMboA=="], + "@smithy/md5-js": ["@smithy/md5-js@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-XdPyIiKajNJ5HoLkBYe3EP+Tc9LmyIz/o7bfcCvr7TR7wmtJqAezvyMSV7X+vjTh6l/y3dC81tIc2PirpMpbZw=="], - "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-PAyVvMxXkPDVamjg1gcgciXimhHtqqanpNRWAWyMH7UDLnXld/xGRNPRyHfPZUjfx7hulB/5lh2FMZ/v3deDiA=="], + "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-Q+J8iTUHr5qtoejFJCb9TTavDh7xQFVFRjy1n1edq5BFJq5b4mfziqrEqJlAscHHVdsqyFTNJXcV+b9i3oad9w=="], - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.6.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-QEeW1R9y4ShiTEqCRibijbUtdT435QneaLZnVvII+wCh+WZk9JIE2wA5k8z3/eqfxfqfSb8NdonIh/zP0+akRg=="], + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.6.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-nU2N3LY6Vn46rwga1+gZQJ1Zsu+3/Qj2X+d5gKb8gSvLmojZd0sg9XWYqMDH59VeadVKOGOhMrhyzUo7ln4lGw=="], - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.7.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-F+3QRXX82VuvpiKP8smehWzk4pLNfpvLMuc0R9/lcp4baYlTvWWd5Vju7rnquY4wbefYBMmkitceC0LBNSX0rA=="], + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.7.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-JOVvyFbNiXUuT8Id+uNIEzbkqi8IOa6zqEQgzpoQ1xYIQQFTFL/mXIiBRLlA129aoBB1EeiElkhmLZyok5axYA=="], - "@smithy/middleware-serde": ["@smithy/middleware-serde@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-GWtPvvzdjx+xQwQF6YiHUazPDg20ZKAIxsUa/7rGSE6oNnO3OyGpKZtg43uYb8sgq1HiNOcS0mXmkusFqstRnw=="], + "@smithy/middleware-serde": ["@smithy/middleware-serde@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-nwYV4tBUU5kBOYec2p8vKz5pzMVWVEcalVY4ZXguUdZZEOm9LQZhT0pKsnYSQhldvWegaFKWAR45Mi4XUfv5cQ=="], - "@smithy/middleware-stack": ["@smithy/middleware-stack@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-ttGanHVaD2pdeVawKNRnKy+oZYrAeS7jjWoFS2oQzJJksvZ6yKaWxjbi3sr7Qiiv0qhEyU3bE8v4Fqz+maijHg=="], + "@smithy/middleware-stack": ["@smithy/middleware-stack@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-IivXdOXykxp8Eq+qDL91mxEVd9CoR7wEIJqhJiwbHnmJVX6SZm2hxZt6uSDQOEh5tYHQdj6WuqmpNhV7P8C1Ww=="], - "@smithy/node-config-provider": ["@smithy/node-config-provider@4.5.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-6iv9dLiDX4he0KLFr2vw2u98Q+lIEsF0G+1MZVy5kWjZRLYXvY6S4uJ+R3aC4xYBkjljAtCB3uG9Y8pBL3O3Ug=="], + "@smithy/node-config-provider": ["@smithy/node-config-provider@4.5.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-N4XTMCO77u8jXq9Ms1pbFM3M9zD+ScKnvB+M7//VyawM8L6xW3/mqAPp/uMOYprW+q/b1Qen6qUKVwxTb2ymiQ=="], - "@smithy/node-http-handler": ["@smithy/node-http-handler@4.9.11", "", { "dependencies": { "@smithy/core": "^3.30.0", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-slbzbz8taEOzoXv/9y34YNBoE+ZHmddLykCgjDAjvMAsu2nM5s2Gzwa5OGF721tD8s+CKeFUBds5lSj9lcbuDg=="], + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.9.13", "", { "dependencies": { "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-Nmd/Nl35zfYrd+a6OO2cDJb3GPh9bgTjIUhcM+JFfjpp8/osCgboDV5nCT1I01Pv6R13eSKDKLSoVa5ZB6Zsfw=="], - "@smithy/property-provider": ["@smithy/property-provider@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-zF/MIfH99pVoYWZedI87udXf3NpSf8xvwIWD77rQ3qcD7rpCxyabweinDJw1DRGN+vdQ/LcolY87L4rsJ/gPdA=="], + "@smithy/property-provider": ["@smithy/property-provider@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-xsj0qoE3ya7Fu3YoyKPINtGWsY33IO2ypcOJpLAGMbzGYTNr0wqK0HnCroHRIoJTsHapnsFABUhzlNfHo/diwg=="], - "@smithy/protocol-http": ["@smithy/protocol-http@5.5.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-R+aYfS8kDXMwO+LfpiWTJjjUsR+se4cd2ZBjMU3fqJmoSZ1jenTpgb4/k1SvvXcM9f0232KvufZoO5XRWoiPBw=="], + "@smithy/protocol-http": ["@smithy/protocol-http@5.5.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-iPaxIe9mTyidyhM6WF2/gSLPezyCwSlZcqlDBj2KCoSS994iw4yf1se1xmZkWsY98ZpwjDR/ZMubOSVx+Nrokw=="], - "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.6.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-/rg/ksfMpLzG9fK67n+98OsyFHME7j6jW/3NwIRVTv2C5YAbHQUFxutBnmq7rWFoB2qojDShgTv+i1JeGXJS6A=="], + "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.6.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-apuIuit7x6ZM0nJxuKf24MCkflwnSyD6wePOPGkhntEl0gLaIYLlZTQtzCB+j3kWOTpqx0D1o6JZ15NTk4f8xQ=="], - "@smithy/signature-v4": ["@smithy/signature-v4@5.6.10", "", { "dependencies": { "@smithy/core": "^3.30.0", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-EXhWePm3SXJAX38npIy4TXL2Aex/OVgCClTjelN2QHw/U+8CQUH8C7AaxsVzQcYieYPseywn48s89DmvuGjiAg=="], + "@smithy/signature-v4": ["@smithy/signature-v4@5.6.12", "", { "dependencies": { "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-I6KLtq3H0qqSuV9vLglfi8puHqzygzWHOnI4z/Rdoo+q50vvo18vBRdPAvvEtcaKROz7Zn6qnPa14kRfPH6PcQ=="], - "@smithy/smithy-client": ["@smithy/smithy-client@4.14.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-epzar5Uc3+YZ8jNybEzz4R4cZva2bJqg2QyHRt+kR2oMK9EWJFW1MsuBszU0exjfR6ziYfapxJGRlFdnSMA91Q=="], + "@smithy/smithy-client": ["@smithy/smithy-client@4.14.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-UzWzH88hntrIn1wMPlmt/6vmQL+FS+pYgqvBsp4QQdgt/DUFZZD0S0xRO7kCfAfz9fqn9boVb+buFWU4LD9PJg=="], "@smithy/types": ["@smithy/types@4.16.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg=="], - "@smithy/url-parser": ["@smithy/url-parser@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-D0wtx8S7bBqvpkASXWQ7tIqGyRuxntqKvcTcqiZzhF67pvAhn9ETyptTnA7AGQdoXO3c3pEaRGNiUkMfV4QLFA=="], + "@smithy/url-parser": ["@smithy/url-parser@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-0VynNn3o4qSpRbgtG6RbT09wsN2HjsIkBvxHUX99p0t3sFj7hvqsOtPQBubawSNH4PWfwXgkD82vG166ROta7w=="], - "@smithy/util-base64": ["@smithy/util-base64@4.5.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-intksPGZMv2v+neBuH90UQH6b1th+YBiUG9wNXZMwnQZJRiInU5QnY8DAWbvlqP1H+f/08j8vRXcoU1ZHOOKtg=="], + "@smithy/util-base64": ["@smithy/util-base64@4.5.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-80e25qWKD6hJh5BenAutni2Z6dj2AiZKmht21pcROmzWzQja8yl+KqsuDSia++hwk1Ne6RrDEBwP6I+A4R0XAg=="], - "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-uKX3MPwdx7+REHZQsZ9EVc650vKqz58zEMD0PCnRW7kUCxcaJjLE31upDU1uI8g6ewrxbvDV5+720Ny6l+i8SA=="], + "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-gTqO1MkKFsaKgJoGelxgWBdUlHqc9g1z6ItBVFsQU1yTO4W6BEIq/NZIDf/UTi6ueojTr2fJRetusBIbctA6KQ=="], - "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-BC5ucI2L2VJ+Q+YMbMszMYKouezi//TzIkwR5pXT3Bkd1dQdFcLbukR1y6/QlffS8AmS/6I4IO4A148fCpwqxA=="], + "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-BTwIXGhunFzjNYpKrRJJjgfEONT8m/wyBB0IL4BWB9WqJSQa/CEMh2cPHqbqMpKwnAljPuhhbGwF2Z0qm2C04A=="], - "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-hVXqEqAAeRh2Xxx3TpC2U7LwUneu7qkkDWsgYNkRDszhHUdkQtYA9fPfeKoc4z7FWHIYrwElF3z7Vp3t9eGE8g=="], + "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-HxG8CH8HXUO6JqH+ftXCJm1XrISkcZNrOLGkMYiz90wT3FPBZZE/syDNYJ/iKQEi91gN2J/SnyEhHjcJPEVSFw=="], - "@smithy/util-config-provider": ["@smithy/util-config-provider@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-Vyjv65ZzYGl5hCUtKAyGFDAy2UMdMDzXRQsNFR58PTEu/dIEIaSSHkvWp6pfbDmVJ3OXRrNQaIh2zlxiGKRc9w=="], + "@smithy/util-config-provider": ["@smithy/util-config-provider@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-GB3CQ1o09Dc3aUOswcy3q3xbe5ib5tNyIDmvn8i8Nno01gogbqn1BNIHGawSHApEFVtL1OqjkoiQ9lMXpgY5ig=="], - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.5.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-jyKoAr0qlTpext3lrDsv0K8NzAbvOVOk4K2I7TaYGN6NTw75B4gVLXu5gh0gzYzuzIDi/JgEcprROp+1fnA2dg=="], + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.5.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-en8XtoFeELWwI0pwpmUbf63bJ9WRusVozGQ59mE9YuUuW+Q/FFRfdbd/EZIf/p1oZXHerbj30ITuer7vE47TbQ=="], - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-FsIY7VdbDZ1wdzmYwd6muxoe0dh25ksr5h4aNo82yl7CoWIEDSGJayc9v9woI5CPz0wg4VREnxT4rvSHhUnCfw=="], + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-MAN0jEah3skK3+94QiikeLbuhnZ9GuW+JCjuIUpXGUvJG2U4N8sscypWDMUJUkKc6DYJ0UaGI5Xvb17crXwyiw=="], - "@smithy/util-endpoints": ["@smithy/util-endpoints@3.6.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-7DJIwcS1yS9+S1s+2fy3yRbDrmNB3pyuyd06N0uvARuPVKaq/g5GDreJy9q2glJ50lw2WZ6s+n9UTXV9s7Nfrw=="], + "@smithy/util-endpoints": ["@smithy/util-endpoints@3.6.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-7dFFv+DA2Ln8s60s+JIRHHfl/Fch8HZ3FY9VjnM6I3EtigDP+bUUexNQZuexVYJXUejpQ48/JIHSiSmugFDD/A=="], - "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-0xgdWBWLSHjMoxtfU/+zgBELB2HDUsr5h4JrE5n0ugQLdibqTLijfRbU6gZi3SwR/phU7H1He20uS9S7H7sh/Q=="], + "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-x9/taZ/r/nEL6SBfdV+M18VpJU16yzehn2q1XHNmXWEp3g5U4NBl2oMBVw7YKdmH2HiKQ/ZqDW5JjBDNzgLKrg=="], - "@smithy/util-middleware": ["@smithy/util-middleware@4.4.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-KBcBQhuWujUMyU/lqCDlQHSfComVk2DJeK4dJGeoJm+aQlo6CbnIZw3G6THPdZwGyVhDJd5yzx8pqMTo5kcSZg=="], + "@smithy/util-middleware": ["@smithy/util-middleware@4.4.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-VuChjNaV9VteddlugHsGqFXgjQK8WIt9JxYAtdsi1i8A1PwrVAVC6DVVRqr9XbGeWnHvvWb0ywWLMjYUZwiHYg=="], - "@smithy/util-retry": ["@smithy/util-retry@4.5.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-obEfPrwJlOX0iz1Gz8Wqkt42OlYJAn7aK+zJJz4aGX6Mw62c3q9en/tkq3gfYL42pVKJFaB7+cQKW1ZHSXx62w=="], + "@smithy/util-retry": ["@smithy/util-retry@4.5.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-oM/8/5H9aG1omF2CzDxE7oxiJQhkonS2Vz1Kd6/76IhvPzCoroA3RVhr0EhAhZmyY6th3WfLK0OpRrphJ3YbgQ=="], - "@smithy/util-stream": ["@smithy/util-stream@4.7.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-92Y8IdPUdtpdjt2OUxdLCJhHO05RfulfOLQG1A29x8nI4SZ0U3WpkdZWRkI8oCkU11E1qmjzJ/OszpDjtMNWPA=="], + "@smithy/util-stream": ["@smithy/util-stream@4.7.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-r/r4fqkU5fkJQaGpTrVssAHuPIwDSHrwz1KQ3rb1riYkL71OsYciHun1i0PWrJLLt+nPvroHXcaz39RdNW3XBw=="], "@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="], - "@smithy/util-waiter": ["@smithy/util-waiter@4.5.14", "", { "dependencies": { "@smithy/core": "^3.30.0", "tslib": "^2.6.2" } }, "sha512-vPp2h5zeOS2tZeuuu/LHQhN9Gae5okvSpSk5/6FipxmiLrab+Ua0iAuLUmEjBu/JxcoI0/oqgDgckvORncFCRA=="], + "@smithy/util-waiter": ["@smithy/util-waiter@4.5.16", "", { "dependencies": { "@smithy/core": "^3.31.1", "tslib": "^2.6.2" } }, "sha512-fbrKxazlmJDe70WVjM6LOiNA2IKiz8lzsF1rHoIiEj9ONf5uQTgN1srg8X+AveJHGYavqEhsDEGZP7gM1k43Rg=="], "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], @@ -2871,7 +2931,7 @@ "@solidjs/start": ["@solidjs/start@https://pkg.pr.new/@solidjs/start@dfb2020", { "dependencies": { "@babel/core": "^7.28.3", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.5", "@solidjs/meta": "^0.29.4", "@tanstack/server-functions-plugin": "1.134.5", "@types/babel__traverse": "^7.28.0", "@types/micromatch": "^4.0.9", "cookie-es": "^2.0.0", "defu": "^6.1.4", "error-stack-parser": "^2.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.3", "fast-glob": "^3.3.3", "h3": "npm:h3@2.0.1-rc.4", "html-to-image": "^1.11.13", "micromatch": "^4.0.8", "path-to-regexp": "^8.2.0", "pathe": "^2.0.3", "radix3": "^1.1.2", "seroval": "^1.3.2", "seroval-plugins": "^1.2.1", "shiki": "^1.26.1", "solid-js": "^1.9.9", "source-map-js": "^1.2.1", "srvx": "^0.9.1", "terracotta": "^1.0.6", "vite": "7.1.10", "vite-plugin-solid": "^2.11.9", "vitest": "^4.0.10" } }, "sha512-7JjjA49VGNOsMRI8QRUhVudZmv0CnJ18SliSgK1ojszs/c3ijftgVkzvXdkSLN4miDTzbkXewf65D6ZBo6W+GQ=="], - "@speed-highlight/core": ["@speed-highlight/core@1.2.17", "", {}, "sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg=="], + "@speed-highlight/core": ["@speed-highlight/core@1.2.24", "", {}, "sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw=="], "@standard-community/standard-json": ["@standard-community/standard-json@0.3.5", "", { "peerDependencies": { "@standard-schema/spec": "^1.0.0", "@types/json-schema": "^7.0.15", "@valibot/to-json-schema": "^1.3.0", "arktype": "^2.1.20", "effect": "^3.16.8", "quansync": "^0.2.11", "sury": "^10.0.0", "typebox": "^1.0.17", "valibot": "^1.1.0", "zod": "^3.25.0 || ^4.0.0", "zod-to-json-schema": "^3.24.5" }, "optionalPeers": ["@valibot/to-json-schema", "arktype", "effect", "sury", "typebox", "valibot", "zod", "zod-to-json-schema"] }, "sha512-4+ZPorwDRt47i+O7RjyuaxHRK/37QY/LmgxlGrRrSTLYoFatEOzvqIc85GTlM18SFZ5E91C+v0o/M37wZPpUHA=="], @@ -2879,25 +2939,25 @@ "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@storybook/addon-a11y": ["@storybook/addon-a11y@10.5.4", "", { "dependencies": { "@storybook/global": "^5.0.0", "axe-core": "^4.2.0" }, "peerDependencies": { "storybook": "^10.5.4" } }, "sha512-UWdZtB7Dh1GjqxTPOrisUNDhDGF5pKGzZdzW9DSSHMBcAOx2dsTmXGzLSFprAz4LTT0OHCtKhxNqKK0JZJ0Y8g=="], + "@storybook/addon-a11y": ["@storybook/addon-a11y@10.5.7", "", { "dependencies": { "@storybook/global": "^5.0.0", "axe-core": "^4.2.0" }, "peerDependencies": { "storybook": "^10.5.7" } }, "sha512-I30rsNz6aA3xg3811MEry40uJDHP3l5SOkfqtmNkp7y4NdqTDdKhmbhhDAZQX1WWEk6GeMBGr3AJ3TCz7r7JmQ=="], - "@storybook/addon-docs": ["@storybook/addon-docs@10.5.4", "", { "dependencies": { "@mdx-js/react": "^3.0.0", "@storybook/csf-plugin": "10.5.4", "@storybook/icons": "^2.0.2", "@storybook/react-dom-shim": "10.5.4", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.5.4" }, "optionalPeers": ["@types/react"] }, "sha512-2Z/x2pKEmXOCQjmttYzPuQBu9aWeMly8uEs3msrCTBLiHs/F7IlBFnMu0Z+T2Qvk0LEy8O93AlcPSP76aCcKjw=="], + "@storybook/addon-docs": ["@storybook/addon-docs@10.5.7", "", { "dependencies": { "@mdx-js/react": "^3.0.0", "@storybook/csf-plugin": "10.5.7", "@storybook/icons": "^2.0.2", "@storybook/react-dom-shim": "10.5.7", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.5.7" }, "optionalPeers": ["@types/react"] }, "sha512-KNARJfjICaizinsR3INMEiipZm1ObYo+xw+E26gteu50Bcy2dIZUtk5uHY5XdtardU3AXX6yRXoBZ2HCY3lbHA=="], - "@storybook/addon-links": ["@storybook/addon-links@10.5.4", "", { "dependencies": { "@storybook/global": "^5.0.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.5.4" }, "optionalPeers": ["@types/react", "react"] }, "sha512-XH/DiL2XjZ8uR30gYGumNGrFCHWOOHXQQiWMTGf0JFrB7XhyNsN5zfRHN/nST9GMxXvwbZvFOdbty1SMx3jafA=="], + "@storybook/addon-links": ["@storybook/addon-links@10.5.7", "", { "dependencies": { "@storybook/global": "^5.0.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.5.7" }, "optionalPeers": ["@types/react", "react"] }, "sha512-17PxEOocLhAEaPeQ4q+8yul/LF9YEIePS1arknCAS7U1pQXTe0uj+R0pB6uPLVflM5gECQMiP4WzIj4tEiL6+A=="], - "@storybook/addon-onboarding": ["@storybook/addon-onboarding@10.5.4", "", { "peerDependencies": { "storybook": "^10.5.4" } }, "sha512-W6VPRkIWPfPPkdD/KHaITxbhlDnEkcYIQRWzD6cy1y3ArWO6SSbXe3+GAVaso/5FhMXLjTbo7WC+AuVe1qb0xw=="], + "@storybook/addon-onboarding": ["@storybook/addon-onboarding@10.5.7", "", { "peerDependencies": { "storybook": "^10.5.7" } }, "sha512-GDssSoWmmGnz6OnUvAofMcrUuTMD53Y2rnbshjXvhtPnjKw4dufXFjo6C7yZQ6vyoNzTS9HyQwCHlxlhyCKJjQ=="], - "@storybook/addon-vitest": ["@storybook/addon-vitest@10.5.4", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2" }, "peerDependencies": { "@vitest/browser": "^3.0.0 || ^4.0.0", "@vitest/browser-playwright": "^4.0.0", "@vitest/runner": "^3.0.0 || ^4.0.0", "storybook": "^10.5.4", "vitest": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["@vitest/browser", "@vitest/browser-playwright", "@vitest/runner", "vitest"] }, "sha512-5lr81sgrbK3Tjjbstieg/yYj3jdtQYP70ihpOiN1TwogvFATY2/9eMT46FE5ioKtEFcfJRDcgJ2wSlmJKE+kZw=="], + "@storybook/addon-vitest": ["@storybook/addon-vitest@10.5.7", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2" }, "peerDependencies": { "@vitest/browser": "^3.0.0 || ^4.0.0", "@vitest/browser-playwright": "^4.0.0", "@vitest/runner": "^3.0.0 || ^4.0.0", "storybook": "^10.5.7", "vitest": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["@vitest/browser", "@vitest/browser-playwright", "@vitest/runner", "vitest"] }, "sha512-7NK7Kzazc2vb2h8nGlH15QlUn5J6/LV0xF70VziAK0bxu3r1JupLCoBvckX39vHzFXiAZljXZtt1Wq/OidBxow=="], - "@storybook/builder-vite": ["@storybook/builder-vite@10.5.4", "", { "dependencies": { "@storybook/csf-plugin": "10.5.4", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^10.5.4", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-eXdgow+brSzZrG3CnG18YwxZwEYNAZIh2G5qKwNoZf0uk2ZCPgLRQwtVAcd7BiiEDGnXUHm9pycAS+UiF4F4Mg=="], + "@storybook/builder-vite": ["@storybook/builder-vite@10.5.7", "", { "dependencies": { "@storybook/csf-plugin": "10.5.7", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^10.5.7", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-fShF/aQaITqcJuMCLr42BGNUAbhDi4IboqvlbZqXAwgrrTslnZEUnY8GcEcvpZmjl11VwlmazhMJdH50fIgBPg=="], - "@storybook/csf-plugin": ["@storybook/csf-plugin@10.5.4", "", { "dependencies": { "unplugin": "^2.3.5" }, "peerDependencies": { "esbuild": "*", "rollup": "*", "storybook": "^10.5.4", "vite": "*", "webpack": "*" }, "optionalPeers": ["esbuild", "rollup", "vite", "webpack"] }, "sha512-DSp5Z/eZlRnKq0KrKLJE6uoYf/Ysc+FP0Z5DVTGnOrie+z3tC0lNi9I4RB++EXkJeUDS9/4dxvJZVSWjhLlXxw=="], + "@storybook/csf-plugin": ["@storybook/csf-plugin@10.5.7", "", { "dependencies": { "unplugin": "^2.3.5" }, "peerDependencies": { "esbuild": "*", "rollup": "*", "storybook": "^10.5.7", "vite": "*", "webpack": "*" }, "optionalPeers": ["esbuild", "rollup", "vite", "webpack"] }, "sha512-IaX8FlM0H36HNFhJ2+4L9bCldqfvHGqcLg841SJNyK/DhfMlM7JsvY/GDH2ZFuWrUf8FSOx96GRRnHq6XfRKag=="], "@storybook/global": ["@storybook/global@5.0.0", "", {}, "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ=="], "@storybook/icons": ["@storybook/icons@2.1.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg=="], - "@storybook/react-dom-shim": ["@storybook/react-dom-shim@10.5.4", "", { "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.5.4" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YdlppEOReg8MvTECRNuf79gu2zL83JqKDHIR/65eS0M6y+ue9pkpfjYo7hZVIcyOcRd9npBDXMdt2kC92bCuaA=="], + "@storybook/react-dom-shim": ["@storybook/react-dom-shim@10.5.7", "", { "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.5.7" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lxOkyh+wu/MiBXvYQHjZfD+DRKOa4bHBzbuGuiHXnHXmdOcTRdcrQTsoeN2FPtfugmmOG66cZUEgDwNX+k5eRA=="], "@stripe/stripe-js": ["@stripe/stripe-js@8.6.1", "", {}, "sha512-UJ05U2062XDgydbUcETH1AoRQLNhigQ2KmDn1BG8sC3xfzu6JKg95Qt6YozdzFpxl1Npii/02m2LEWFt1RYjVA=="], @@ -2937,27 +2997,27 @@ "@tailwindcss/vite": ["@tailwindcss/vite@4.1.11", "", { "dependencies": { "@tailwindcss/node": "4.1.11", "@tailwindcss/oxide": "4.1.11", "tailwindcss": "4.1.11" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw=="], - "@takumi-rs/core": ["@takumi-rs/core@2.4.2", "", { "dependencies": { "@takumi-rs/helpers": "2.4.2" }, "optionalDependencies": { "@takumi-rs/core-darwin-arm64": "2.4.2", "@takumi-rs/core-darwin-x64": "2.4.2", "@takumi-rs/core-linux-arm64-gnu": "2.4.2", "@takumi-rs/core-linux-arm64-musl": "2.4.2", "@takumi-rs/core-linux-x64-gnu": "2.4.2", "@takumi-rs/core-linux-x64-musl": "2.4.2", "@takumi-rs/core-win32-arm64-msvc": "2.4.2", "@takumi-rs/core-win32-x64-msvc": "2.4.2" }, "peerDependencies": { "csstype": "*" }, "optionalPeers": ["csstype"] }, "sha512-iAM6O4hzqVqqycKxc933AOExylzXGvzDl/CUq2V7HU3TAIFdo84AcUKDZT52wxbqRNKEEeHX0UW2SYbOhyXqLA=="], + "@takumi-rs/core": ["@takumi-rs/core@2.6.0", "", { "dependencies": { "@takumi-rs/helpers": "2.6.0" }, "optionalDependencies": { "@takumi-rs/core-darwin-arm64": "2.6.0", "@takumi-rs/core-darwin-x64": "2.6.0", "@takumi-rs/core-linux-arm64-gnu": "2.6.0", "@takumi-rs/core-linux-arm64-musl": "2.6.0", "@takumi-rs/core-linux-x64-gnu": "2.6.0", "@takumi-rs/core-linux-x64-musl": "2.6.0", "@takumi-rs/core-win32-arm64-msvc": "2.6.0", "@takumi-rs/core-win32-x64-msvc": "2.6.0" }, "peerDependencies": { "csstype": "*" }, "optionalPeers": ["csstype"] }, "sha512-UkTLbGglBCvBt3Jf0576KzoxIiMfRrRPeiUFoA/sAsNLp4ItxI2sB/Q0R39gi/BqBbUFbJ/qfU/Am5f1/I5o1A=="], - "@takumi-rs/core-darwin-arm64": ["@takumi-rs/core-darwin-arm64@2.4.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-M4An7zjTH/yNlAPZh5dcHVLOJMzxp0n8QuH2LwHDl87l3YL42HYlGztzkI15hQLb5Nr3P0JFYHX3TR6tO+Fsgw=="], + "@takumi-rs/core-darwin-arm64": ["@takumi-rs/core-darwin-arm64@2.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lge/JPYUPvE8wzr31sWzHhh0/HThQ9eBgZo8xDO6qOl14cgXpRFyyd2lMiqXlECVPkfTiW5rPB89CeDvw9cFJw=="], - "@takumi-rs/core-darwin-x64": ["@takumi-rs/core-darwin-x64@2.4.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-OZ2SI27EUS1kdFzPNPQMIxtURWWLeTsWWjWUxq2RPPAPg3unce+PamgCodhlA+GWFxEWs7MbmaCADBa+/2YJ+w=="], + "@takumi-rs/core-darwin-x64": ["@takumi-rs/core-darwin-x64@2.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-04lHzIqJomOq2Rci2KUzRd03THwo/X4BiPMA/T082Dt2s5Dupi47ck/RJUuJRKEytXPlY3vsIlojdiEFfuQyjw=="], - "@takumi-rs/core-linux-arm64-gnu": ["@takumi-rs/core-linux-arm64-gnu@2.4.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-2Qp1ddv12zE54bgGEWccsytvgUo4BAs0KEXl/5K5URbYxvCIPATmwsdC4EPw7VL9IT7sOJSoCwkXN4JyWWLrpQ=="], + "@takumi-rs/core-linux-arm64-gnu": ["@takumi-rs/core-linux-arm64-gnu@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-DAuv4+ZdC1kZopDIOTUcfEk+io4BusRU+rnCXLi8b51sydTzS+u8oSdceklgeKIrsRlA7io1iHRQKrb/0+bARA=="], - "@takumi-rs/core-linux-arm64-musl": ["@takumi-rs/core-linux-arm64-musl@2.4.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cvq2gA0UHbJWmCHxnlWE1npKGr4tx8utW+28vQd6Zkm3j1uUmz5mofI69eeFcL84KMXlDo8XIF8AcFs9EGn3Tw=="], + "@takumi-rs/core-linux-arm64-musl": ["@takumi-rs/core-linux-arm64-musl@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Fy7QDbGfl10fOVWr2fVuxhYDm0/SvvLStohTgwO2Byd3XTbQ5OnzMEZ/SCt8lz6XbxnYGlKoGtKMqbdUWhORHQ=="], - "@takumi-rs/core-linux-x64-gnu": ["@takumi-rs/core-linux-x64-gnu@2.4.2", "", { "os": "linux", "cpu": "x64" }, "sha512-oym4VzPKsnbJOyPaR4a5KISYnKJofjSDEPssfqtz56vI2cEIUNBTO8a/c+WwVtkI8kAk/NfQ8/Ssv75hDICSQg=="], + "@takumi-rs/core-linux-x64-gnu": ["@takumi-rs/core-linux-x64-gnu@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-hoW6/COhakjBVyNcGt2qmxWZYP48nS+xoUAczae+Nb1GuwN5LYkWmq6HnILniKNAONwqIaxdSEA0P4aKk24b6Q=="], - "@takumi-rs/core-linux-x64-musl": ["@takumi-rs/core-linux-x64-musl@2.4.2", "", { "os": "linux", "cpu": "x64" }, "sha512-85+TN8U4N0+rP3lebDp3FZ0VDd5DQzNravKKwlmctLhgsH9D6vo8zeDKLzMU5DiJgTdTQa0S2MZDj7LDazUHOw=="], + "@takumi-rs/core-linux-x64-musl": ["@takumi-rs/core-linux-x64-musl@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-N7r+2zcnh6mxD9OXv7kJC/VaKQ5sV+9XlinMK//PbpyR+FSrQiTgN61GofuWwnUSQa7xtue9rIoetE6Cpkevcg=="], - "@takumi-rs/core-win32-arm64-msvc": ["@takumi-rs/core-win32-arm64-msvc@2.4.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-3KUdiU56UpR/6yOHjxPrwSNeiq7KyrpUuwu3QUpjHf5vtOcCTMVZvyXXo7Zss1JX+8+9Qgh7hnxqAnnBfy67hg=="], + "@takumi-rs/core-win32-arm64-msvc": ["@takumi-rs/core-win32-arm64-msvc@2.6.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-MwjehFLK3QlD2uf3jTe1Jau6Dogre8wJTzn3ILFhON3W3e0l0w3qO5ICWl+teqd1v9dW6m1EcTaitwkjMskLwg=="], - "@takumi-rs/core-win32-x64-msvc": ["@takumi-rs/core-win32-x64-msvc@2.4.2", "", { "os": "win32", "cpu": "x64" }, "sha512-p7l6uvV3ofmkhn+kK6qKhyYlmnX/dprOC5xyGkTfp/ao+kfsFOGOTuPfxUba9plBiVjuLDgwzFzockycjv2G6g=="], + "@takumi-rs/core-win32-x64-msvc": ["@takumi-rs/core-win32-x64-msvc@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-xOfGHUKWwYlBe/OOAwmMISRovBuPy3K2puBwAnD/5q9sVJ+JMQDRnmTplzsj4CByqL10Nlw6M/A5H4IMqzN16w=="], - "@takumi-rs/helpers": ["@takumi-rs/helpers@2.4.2", "", { "peerDependencies": { "preact": "^10.0.0", "react": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["preact", "react"] }, "sha512-ScoYBNY7n9z5RdjW2PvpA+6zyihmvliJbGARnA3Nc7wTcYGLvqM8KrJwiJQciF8fpDwJoev6yqmalr+oWC0nqQ=="], + "@takumi-rs/helpers": ["@takumi-rs/helpers@2.6.0", "", { "peerDependencies": { "preact": "^10.0.0", "react": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["preact", "react"] }, "sha512-nvdPW1D61BtAymlucwxYVbEdw7MNI1oq3iJ5mnqIR31U8Cz0VjNX6ikN+mr01PXofMwZMsJvM31/U0ZeB9nlSw=="], - "@takumi-rs/wasm": ["@takumi-rs/wasm@2.4.2", "", { "dependencies": { "@takumi-rs/helpers": "2.4.2" }, "peerDependencies": { "csstype": "*" }, "optionalPeers": ["csstype"] }, "sha512-LVj7R5kuFC8NpzrHM/AbUyFI3CvldSI32eN3VRK8C40PPEXy3boilI5CivUf9aOXmQuPqDWn6UcZnfnIIzVJZw=="], + "@takumi-rs/wasm": ["@takumi-rs/wasm@2.6.0", "", { "dependencies": { "@takumi-rs/helpers": "2.6.0" }, "peerDependencies": { "csstype": "*" }, "optionalPeers": ["csstype"] }, "sha512-wE7R9fZ8Uulo8gatovK0LhKeTJYZUeN+J4t1EJrgIHcizXJ/jjW83Ioe/oI3OgplOaWfZdiumJF5LTI3n39Lvg=="], "@tanstack/directive-functions-plugin": ["@tanstack/directive-functions-plugin@1.134.5", "", { "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "^7.27.7", "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "@tanstack/router-utils": "1.133.19", "babel-dead-code-elimination": "^1.0.10", "pathe": "^2.0.3", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "vite": ">=6.0.0 || >=7.0.0" } }, "sha512-J3oawV8uBRBbPoLgMdyHt+LxzTNuWRKNJJuCLWsm/yq6v0IQSvIVCgfD2+liIiSnDPxGZ8ExduPXy8IzS70eXw=="], @@ -2975,9 +3035,9 @@ "@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - "@testing-library/jest-dom": ["@testing-library/jest-dom@6.10.0", "", { "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "picocolors": "^1.1.1", "redent": "^3.0.0" }, "peerDependencies": { "@testing-library/dom": ">=10 <11" } }, "sha512-HQwu0KaB2zyT0iLzBL+8CLyZDL3KlZlZJ+2iyc9uCUnlJVskJU/UlPuVCyIPhtukjPQdT2QNoR5nCP5FqTmmDQ=="], + "@testing-library/jest-dom": ["@testing-library/jest-dom@6.9.1", "", { "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "picocolors": "^1.1.1", "redent": "^3.0.0" } }, "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA=="], - "@testing-library/user-event": ["@testing-library/user-event@14.6.1", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="], + "@testing-library/user-event": ["@testing-library/user-event@14.6.3", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-6dBq67jT8lE+JTE8Exm02Kt6ze43hz1jdiSpSJwtTZiT1xQQ6b7nZYTTQ9njdArdU8XklOwaDp/AbT/eYSKF4g=="], "@thisbeyond/solid-dnd": ["@thisbeyond/solid-dnd@0.7.5", "", { "peerDependencies": { "solid-js": "^1.5" } }, "sha512-DfI5ff+yYGpK9M21LhYwIPlbP2msKxN2ARwuu6GF8tT1GgNVDTI8VCQvH4TJFoVApP9d44izmAcTh/iTCH2UUw=="], @@ -3181,7 +3241,7 @@ "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="], - "@types/send": ["@types/send@1.2.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="], + "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="], @@ -3225,9 +3285,49 @@ "@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20251207.1", "", { "os": "win32", "cpu": "x64" }, "sha512-5l51HlXjX7lXwo65DEl1IaCFLjmkMtL6K3NrSEamPNeNTtTQwZRa3pQ9V65dCglnnCQ0M3+VF1RqzC7FU0iDKg=="], + "@typescript/typescript-aix-ppc64": ["@typescript/typescript-aix-ppc64@7.0.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ=="], + + "@typescript/typescript-darwin-arm64": ["@typescript/typescript-darwin-arm64@7.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA=="], + + "@typescript/typescript-darwin-x64": ["@typescript/typescript-darwin-x64@7.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA=="], + + "@typescript/typescript-freebsd-arm64": ["@typescript/typescript-freebsd-arm64@7.0.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ=="], + + "@typescript/typescript-freebsd-x64": ["@typescript/typescript-freebsd-x64@7.0.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw=="], + + "@typescript/typescript-linux-arm": ["@typescript/typescript-linux-arm@7.0.2", "", { "os": "linux", "cpu": "arm" }, "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ=="], + + "@typescript/typescript-linux-arm64": ["@typescript/typescript-linux-arm64@7.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ=="], + + "@typescript/typescript-linux-loong64": ["@typescript/typescript-linux-loong64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ=="], + + "@typescript/typescript-linux-mips64el": ["@typescript/typescript-linux-mips64el@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA=="], + + "@typescript/typescript-linux-ppc64": ["@typescript/typescript-linux-ppc64@7.0.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA=="], + + "@typescript/typescript-linux-riscv64": ["@typescript/typescript-linux-riscv64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ=="], + + "@typescript/typescript-linux-s390x": ["@typescript/typescript-linux-s390x@7.0.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw=="], + + "@typescript/typescript-linux-x64": ["@typescript/typescript-linux-x64@7.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A=="], + + "@typescript/typescript-netbsd-arm64": ["@typescript/typescript-netbsd-arm64@7.0.2", "", { "os": "none", "cpu": "arm64" }, "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA=="], + + "@typescript/typescript-netbsd-x64": ["@typescript/typescript-netbsd-x64@7.0.2", "", { "os": "none", "cpu": "x64" }, "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA=="], + + "@typescript/typescript-openbsd-arm64": ["@typescript/typescript-openbsd-arm64@7.0.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ=="], + + "@typescript/typescript-openbsd-x64": ["@typescript/typescript-openbsd-x64@7.0.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg=="], + + "@typescript/typescript-sunos-x64": ["@typescript/typescript-sunos-x64@7.0.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g=="], + + "@typescript/typescript-win32-arm64": ["@typescript/typescript-win32-arm64@7.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ=="], + + "@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="], + "@typescript/vfs": ["@typescript/vfs@1.6.4", "", { "dependencies": { "debug": "^4.4.3" }, "peerDependencies": { "typescript": "*" } }, "sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ=="], - "@typespec/ts-http-runtime": ["@typespec/ts-http-runtime@0.3.7", "", { "dependencies": { "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "tslib": "^2.6.2" } }, "sha512-JVUD8X2tfDMWjcjLs4yVxxVrS8yR5vnh386GAXT9Qj79nBxxXSaHFQZg5FweLmT8HlPQ3kii6noUB+Z9RN7DvQ=="], + "@typespec/ts-http-runtime": ["@typespec/ts-http-runtime@0.3.8", "", { "dependencies": { "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "tslib": "^2.6.2" } }, "sha512-bLMpVcWZNzq6lYOybwFwOAR1IXKcHnhUNqYeHjl1bET/qE3jFPFH+p8Wrh3rU4xwdnifPxmKNESBYnvnmc75aA=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.3", "", {}, "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg=="], @@ -3239,11 +3339,11 @@ "@vercel/analytics": ["@vercel/analytics@2.0.1", "", { "peerDependencies": { "@remix-run/react": "^2", "@sveltejs/kit": "^1 || ^2", "next": ">= 13", "nuxt": ">= 3", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", "vue-router": "^4" }, "optionalPeers": ["@remix-run/react", "@sveltejs/kit", "next", "nuxt", "react", "svelte", "vue", "vue-router"] }, "sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g=="], - "@vercel/cli-config": ["@vercel/cli-config@0.2.1", "", { "dependencies": { "xdg-app-paths": "5", "zod": "4.1.11" } }, "sha512-RhfyXmRLHdbnry8RJqHDc+5rGxMZ0bu+fpysZjtv3bE+BubpuwxTancHOKiH5zKQREsdwFVr3mOI2kOvxlOyxA=="], + "@vercel/cli-config": ["@vercel/cli-config@0.2.2", "", { "dependencies": { "xdg-app-paths": "5", "zod": "4.1.11" } }, "sha512-kAy35eymNzRBfmcqEViVQge0KJ59FYEKsPqGNCSJQ7M9HTuFGWd3qPcZos1A5cZpAWRBdiYe82Bcz9P7pIZvUQ=="], - "@vercel/cli-exec": ["@vercel/cli-exec@1.0.0", "", { "dependencies": { "execa": "5.1.1" } }, "sha512-kQF8LGie/Hbdq9/psJxLE7owRTcqMQMhgybU04gCeR7cbQAr5t8OrjefDNColJv1QSSucFt4pLwRiARVmlOnug=="], + "@vercel/cli-exec": ["@vercel/cli-exec@1.0.1", "", { "dependencies": { "execa": "5.1.1" } }, "sha512-g9XerViJ/paZujufXYcu5XYI2vU2rtB4sgdpjUHde5RnOkdmpu0ngH46LCFGHoPXO/C+qDPSczIHIRN+8Q2YKQ=="], - "@vercel/functions": ["@vercel/functions@3.7.6", "", { "dependencies": { "@vercel/oidc": "3.8.1" }, "peerDependencies": { "@aws-sdk/credential-provider-web-identity": "*", "ws": ">=8" }, "optionalPeers": ["@aws-sdk/credential-provider-web-identity", "ws"] }, "sha512-QKlSfrgvo4pGEnzHw8Dha9GRTb5hhLBbImKi4rL4CmxClaVs+36hxgjW0MOqez57wWShstpKOWZY/mU8KuYoUQ=="], + "@vercel/functions": ["@vercel/functions@3.9.1", "", { "dependencies": { "@vercel/oidc": "3.8.2" }, "peerDependencies": { "@aws-sdk/credential-provider-web-identity": "*", "ws": ">=8" }, "optionalPeers": ["@aws-sdk/credential-provider-web-identity", "ws"] }, "sha512-RhrIZvQ0Jfgeq0pCaeZ/E19OujpGEyB2BDO//6F91Z8VC5JJ5H4ckLLswaKnM7vOutRswU/MO6UQMGhtm7fA/Q=="], "@vercel/nft": ["@vercel/nft@1.10.2", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^13.0.0", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-w+WyX5Ulmj4dtTZrxaulqrjaLZHSbnPzx75SJsTNYmotKsqn1JlLnDJa+lz5hn90HJofhl/2MAtw0mCrgM3qYw=="], @@ -3253,19 +3353,19 @@ "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], - "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + "@vitest/expect": ["@vitest/expect@3.2.7", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.7", "@vitest/utils": "3.2.7", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w=="], - "@vitest/mocker": ["@vitest/mocker@4.1.10", "", { "dependencies": { "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow=="], + "@vitest/mocker": ["@vitest/mocker@3.2.7", "", { "dependencies": { "@vitest/spy": "3.2.7", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA=="], - "@vitest/pretty-format": ["@vitest/pretty-format@4.1.10", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q=="], + "@vitest/pretty-format": ["@vitest/pretty-format@3.2.7", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA=="], - "@vitest/runner": ["@vitest/runner@4.1.10", "", { "dependencies": { "@vitest/utils": "4.1.10", "pathe": "^2.0.3" } }, "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg=="], + "@vitest/runner": ["@vitest/runner@3.2.7", "", { "dependencies": { "@vitest/utils": "3.2.7", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA=="], - "@vitest/snapshot": ["@vitest/snapshot@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "@vitest/utils": "4.1.10", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw=="], + "@vitest/snapshot": ["@vitest/snapshot@3.2.7", "", { "dependencies": { "@vitest/pretty-format": "3.2.7", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g=="], - "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + "@vitest/spy": ["@vitest/spy@3.2.7", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ=="], - "@vitest/utils": ["@vitest/utils@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA=="], + "@vitest/utils": ["@vitest/utils@3.2.7", "", { "dependencies": { "@vitest/pretty-format": "3.2.7", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw=="], "@volar/kit": ["@volar/kit@2.4.28", "", { "dependencies": { "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "typesafe-path": "^0.2.2", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "typescript": "*" } }, "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg=="], @@ -3287,27 +3387,31 @@ "@webgpu/types": ["@webgpu/types@0.1.54", "", {}, "sha512-81oaalC8LFrXjhsczomEQ0u3jG+TqE6V9QHLA8GNZq/Rnot0KDugu3LhSYSlie8tSdooAN1Hov05asrUUp9qgg=="], + "@wterm/core": ["@wterm/core@0.3.0", "", {}, "sha512-aQ73QBP+eyA3kcn31mA7DmAi7qmEsQijZdmvgwxtSjCi2248EAOZgtkGDpjlspfrxyVxQbUl/IF+gCVcXt4nZQ=="], + + "@wterm/ghostty": ["@wterm/ghostty@0.3.0", "", { "dependencies": { "@wterm/core": "0.3.0" } }, "sha512-TDjEmUSRD7IaFxq31P7+I3Inkp5mHCfBfO6LYj3/vbLbWOkOZOKPhjAcZ36AYFHe9Q0HLCFvLWmrxIO3aGCjDA=="], + "@xmldom/xmldom": ["@xmldom/xmldom@0.8.13", "", {}, "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw=="], - "@yuuang/ffi-rs-android-arm64": ["@yuuang/ffi-rs-android-arm64@1.3.2", "", { "os": "android", "cpu": "arm64" }, "sha512-eDYLT0kVBkp7e2BwdRDmt6N1rkeDPUHDefk3ZX0/nok+GLsqfy1WBoSL3Yg7HVXN1EyW8OBVc2uK8Zq8HbmaSA=="], + "@yuuang/ffi-rs-android-arm64": ["@yuuang/ffi-rs-android-arm64@1.3.7", "", { "os": "android", "cpu": "arm64" }, "sha512-t6Wx3Xll6c07Nuk0k3xnZsxKFxlshm92i0U/BiTHc6kQbvu+fMJF+gKsj4yEj886jH51CM3EqZT9Xdhq9CdUVw=="], "@yuuang/ffi-rs-darwin-arm64": ["@yuuang/ffi-rs-darwin-arm64@1.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kRdgPaOM6TfuC5wHUwstlatk4HNie2lwSLJWQL2LiAUIJ7+96CoiWUNVhwBcFrhdfxhnWenYS6F668CV0vit8Q=="], - "@yuuang/ffi-rs-darwin-x64": ["@yuuang/ffi-rs-darwin-x64@1.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-O3AlVgre8FQcZRJe44Xs7A6iDLumoPXqbw40+eJCa2gyXaXyLPdHoWrS1W9rBCa1QZRRnG7zRulPVFw8C5uo8g=="], + "@yuuang/ffi-rs-darwin-x64": ["@yuuang/ffi-rs-darwin-x64@1.3.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-x4mxXOKwSgwYx6OBAKrW+Ocp8um2KoPpUwaD0Z2tmR6EekoRvFGN7s/eEK1avqCxcsLN7/MzGOnCCFyGpOVfPA=="], - "@yuuang/ffi-rs-linux-arm-gnueabihf": ["@yuuang/ffi-rs-linux-arm-gnueabihf@1.3.2", "", { "os": "linux", "cpu": "arm" }, "sha512-IXiNdTbIcTCPny5eeElijFWYeKSJjQWSjt9ZyJNdLHYiB1Np+XD6K7wNZS6EOMgMelhW1kQE62T654skGkVDIA=="], + "@yuuang/ffi-rs-linux-arm-gnueabihf": ["@yuuang/ffi-rs-linux-arm-gnueabihf@1.3.7", "", { "os": "linux", "cpu": "arm" }, "sha512-9r//Z022QYVoIAY458Dpk8HWkisk/y4NJC3d52RlkdsLD+9p0zn0cKKSoMF/xUsOWDFSmOf+cwU/Xadi/wxFMQ=="], "@yuuang/ffi-rs-linux-arm64-gnu": ["@yuuang/ffi-rs-linux-arm64-gnu@1.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-gWFO6xufUK9lPYUqDvKa6IR243dPqdetgl9Q7HrZWaDu7wLo06QQrosw8QTzndafQnOcBKm6LoLujmGCfTgJOA=="], - "@yuuang/ffi-rs-linux-arm64-musl": ["@yuuang/ffi-rs-linux-arm64-musl@1.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-lejvOSqypPziQH5rzfkDlJ6e92qhWbDutE9ttOO6z5I2k83zoh9iZhZWhaXSU5VqgQpcshRkrbtXb9gy1ft5dA=="], + "@yuuang/ffi-rs-linux-arm64-musl": ["@yuuang/ffi-rs-linux-arm64-musl@1.3.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-eLLx4P8DzNnuPif19nAvKPaf88lSf6KFbDetH3nAIRZvI495h0jigN835Ayr7uAADssohGfO9MPMH33DXmFErA=="], "@yuuang/ffi-rs-linux-x64-gnu": ["@yuuang/ffi-rs-linux-x64-gnu@1.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-s8VCFazaJKmgY2hgMTpWk4TtBY/zy5ovbaGgwyY0FvBD0YvyhcET4IrMsDJpHhFVTPCYfKZ1dN45clD/YiFp6g=="], - "@yuuang/ffi-rs-linux-x64-musl": ["@yuuang/ffi-rs-linux-x64-musl@1.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Ahr5chfKZKWUik20bEZRug+be57LZ2yYrtolyjSRoo7A4ZniBUHBZUNWm6TD6i0CJayqyxWeVk/XiaABD8bY0w=="], + "@yuuang/ffi-rs-linux-x64-musl": ["@yuuang/ffi-rs-linux-x64-musl@1.3.7", "", { "os": "linux", "cpu": "x64" }, "sha512-YOcOkIwVvIhpwuGJ428h15vpE0KnT3teFG0g2J31FrBxrVh9IH4HeTGXjelI3l9SI5gyiZDnD4PQnQ1U6oqTcA=="], "@yuuang/ffi-rs-win32-arm64-msvc": ["@yuuang/ffi-rs-win32-arm64-msvc@1.3.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-yhpLcj0qel5VNlpzxPZfNmi7+rEX8444QHjUP6WWLxdRfqPllROu/Cp3OpkBpw3BLdxfcDhWkjWMD5QsJN0Pvg=="], - "@yuuang/ffi-rs-win32-ia32-msvc": ["@yuuang/ffi-rs-win32-ia32-msvc@1.3.2", "", { "os": "win32", "cpu": [ "x64", "ia32", ] }, "sha512-BFVSbdtg/7mJBw5kQFOPKFiA+SF7z3240HpzHN81Umm4Bp4dWkyx0msYn8+Q7/BBJiLQ4F6bi3Nftk58YA9r9w=="], + "@yuuang/ffi-rs-win32-ia32-msvc": ["@yuuang/ffi-rs-win32-ia32-msvc@1.3.7", "", { "os": "win32", "cpu": [ "x64", "ia32", ] }, "sha512-ifYz+f+giKpT39lKWDru+om6QnA9J7J953ns60xHgB46ESZvPd/Y2W5+PesRNC9U+vnFEiLZ9CNC+R3fBWC1pg=="], "@yuuang/ffi-rs-win32-x64-msvc": ["@yuuang/ffi-rs-win32-x64-msvc@1.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-ZL5MJ76n2rjwGo26kCWW7wK6QT/cee00Rx8pfW79pz6vM6jqfhoE7zTnwFiw4aOQUes9+HUc5DeeJ3z+Vb9oLg=="], @@ -3317,8 +3421,6 @@ "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], - "abort-controller-x": ["abort-controller-x@0.5.0", "", {}, "sha512-yTt9CI0x+nRfX6BFMenEGP8ooPvErGH6AbFz20C2IeOLIlDsrw/VHpgne3GsCEuTA410IiFiaLVFKmgM4bKEPQ=="], - "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], @@ -3333,7 +3435,7 @@ "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], - "ai": ["ai@6.0.168", "", { "dependencies": { "@ai-sdk/gateway": "3.0.104", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-2HqCJuO+1V2aV7vfYs5LFEUfxbkGX+5oa54q/gCCTL7KLTdbxcCu5D7TdLA5kwsrs3Szgjah9q6D9tpjHM3hUQ=="], + "ai": ["ai@5.0.228", "", { "dependencies": { "@ai-sdk/gateway": "2.0.127", "@ai-sdk/provider": "2.0.3", "@ai-sdk/provider-utils": "3.0.31", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-gf/LK4IsbvRCVrBARrVt+qTyGhYYRVC9WGBtrjXU83B7LI88YG/SVoxjxfdDlrAcdQ3FsIrBw08B0oHi1ho36Q=="], "ai-gateway-provider": ["ai-gateway-provider@3.1.2", "", { "optionalDependencies": { "@ai-sdk/amazon-bedrock": "^4.0.62", "@ai-sdk/anthropic": "^3.0.46", "@ai-sdk/azure": "^3.0.31", "@ai-sdk/cerebras": "^2.0.34", "@ai-sdk/cohere": "^3.0.21", "@ai-sdk/deepgram": "^2.0.20", "@ai-sdk/deepseek": "^2.0.20", "@ai-sdk/elevenlabs": "^2.0.20", "@ai-sdk/fireworks": "^2.0.34", "@ai-sdk/google": "^3.0.30", "@ai-sdk/google-vertex": "^4.0.61", "@ai-sdk/groq": "^3.0.24", "@ai-sdk/mistral": "^3.0.20", "@ai-sdk/openai": "^3.0.30", "@ai-sdk/perplexity": "^3.0.19", "@ai-sdk/xai": "^3.0.57", "@openrouter/ai-sdk-provider": "^2.2.3" }, "peerDependencies": { "@ai-sdk/openai-compatible": "^2.0.0", "@ai-sdk/provider": "^3.0.0", "@ai-sdk/provider-utils": "^4.0.0", "ai": "^6.0.0" } }, "sha512-krGNnJSoO/gJ7Hbe5nQDlsBpDUGIBGtMQTRUaW7s1MylsfvLduba0TLWzQaGtOmNRkP0pGhtGlwsnS6FNQMlyw=="], @@ -3425,9 +3527,9 @@ "aws4fetch": ["aws4fetch@1.0.20", "", {}, "sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g=="], - "axe-core": ["axe-core@4.12.1", "", {}, "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA=="], + "axe-core": ["axe-core@4.13.0", "", {}, "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A=="], - "axios": ["axios@1.18.1", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g=="], + "axios": ["axios@1.19.0", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], @@ -3449,19 +3551,19 @@ "bare-events": ["bare-events@2.9.1", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg=="], - "bare-fs": ["bare-fs@4.7.4", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ=="], + "bare-fs": ["bare-fs@4.8.0", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-fM+MhCvdQhZ7NV6S95a07gPSqjIYKn6mFaXfx266wN3ajZGl/+1AzH+ubkXQ0fFZvOe2nk9VHkzdYkQE5zMV3Q=="], "bare-path": ["bare-path@3.1.1", "", {}, "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ=="], "bare-stream": ["bare-stream@2.13.3", "", { "dependencies": { "b4a": "^1.8.1", "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ=="], - "bare-url": ["bare-url@2.4.6", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ=="], + "bare-url": ["bare-url@2.5.1", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-cD5ciQuKlx+eumTCfqbfiL+fhQm+dHbVNB/cX4+d+I/nx4JsVop9VoFEPAs5RJ6I84QR6bZIBjpd2kjDOYeWcg=="], "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="], "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.11.1", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-HYXq73DDpCtNzOmrFsm9eSwCvWCql0RzqjpDzXN9EadiLJ4DNat0nsZ/Bzmy+Ud12mb4/zKDY0cQ805ZzN+i0A=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ=="], "bcp-47": ["bcp-47@2.1.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw=="], @@ -3499,13 +3601,13 @@ "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="], - "brace-expansion": ["brace-expansion@5.0.8", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg=="], + "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], "brotli": ["brotli@1.3.3", "", { "dependencies": { "base64-js": "^1.1.2" } }, "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg=="], - "browserslist": ["browserslist@4.28.7", "", { "dependencies": { "baseline-browser-mapping": "^2.10.44", "caniuse-lite": "^1.0.30001806", "electron-to-chromium": "^1.5.393", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw=="], + "browserslist": ["browserslist@4.28.8", "", { "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", "electron-to-chromium": "^1.5.402", "node-releases": "^2.0.53", "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="], "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], @@ -3557,11 +3659,7 @@ "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001806", "", {}, "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="], - - "cbor-extract": ["cbor-extract@2.2.2", "", { "dependencies": { "node-gyp-build-optional-packages": "5.1.1" }, "optionalDependencies": { "@cbor-extract/cbor-extract-darwin-arm64": "2.2.2", "@cbor-extract/cbor-extract-darwin-x64": "2.2.2", "@cbor-extract/cbor-extract-linux-arm": "2.2.2", "@cbor-extract/cbor-extract-linux-arm64": "2.2.2", "@cbor-extract/cbor-extract-linux-x64": "2.2.2", "@cbor-extract/cbor-extract-win32-x64": "2.2.2" }, "bin": { "download-cbor-prebuilds": "bin/download-prebuilds.js" } }, "sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng=="], - - "cbor-x": ["cbor-x@1.6.5", "", { "optionalDependencies": { "cbor-extract": "^2.2.2" } }, "sha512-yO64CxnSh6kp+pHNRK9IfwnMvCB+c8HvmUjQY/9l9YRF0/cAPka/tUHLwS64QqUpFCq3/OtbKziVJYXH2EaRig=="], + "caniuse-lite": ["caniuse-lite@1.0.30001809", "", {}, "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -3597,6 +3695,8 @@ "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], + "classnames": ["classnames@2.3.2", "", {}, "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="], "clean-css": ["clean-css@5.3.3", "", { "dependencies": { "source-map": "~0.6.0" } }, "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg=="], @@ -3833,7 +3933,7 @@ "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="], - "devalue": ["devalue@5.8.2", "", {}, "sha512-DObPPAfdtFbXjxLqK8s2Xk9ZuWz5+ZoFEhC7J76es4GU/rEiXwHTmbImoCdyoCOcBH1UF3+Cz6Z2sYD4hyl5TA=="], + "devalue": ["devalue@5.9.0", "", {}, "sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A=="], "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], @@ -3915,7 +4015,7 @@ "electron-store": ["electron-store@11.0.2", "", { "dependencies": { "conf": "^15.0.2", "type-fest": "^5.0.1" } }, "sha512-4VkNRdN+BImL2KcCi41WvAYbh6zLX5AUTi4so68yPqiItjbgTjqpEnGAqasgnG+lB6GuAyUltKwVopp6Uv+gwQ=="], - "electron-to-chromium": ["electron-to-chromium@1.5.396", "", {}, "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ=="], + "electron-to-chromium": ["electron-to-chromium@1.5.402", "", {}, "sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA=="], "electron-updater": ["electron-updater@6.8.9", "", { "dependencies": { "builder-util-runtime": "9.7.0", "fs-extra": "^10.1.0", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", "lodash.escaperegexp": "^4.1.2", "lodash.isequal": "^4.5.0", "semver": "~7.7.3", "tiny-typed-emitter": "^2.1.0" } }, "sha512-ZhVxM9iGONUpZGI1FxdMRgJjUFXi7AYGVa5PwKlO1tV1/4zDxQmfKpXOHVztKrd6L9rLcFjERvi1Mf2vxyTkig=="], @@ -3939,7 +4039,7 @@ "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], - "enhanced-resolve": ["enhanced-resolve@5.24.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ=="], + "enhanced-resolve": ["enhanced-resolve@5.24.5", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A=="], "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], @@ -3965,7 +4065,7 @@ "es-get-iterator": ["es-get-iterator@1.1.3", "", { "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "is-arguments": "^1.1.1", "is-map": "^2.0.2", "is-set": "^2.0.2", "is-string": "^1.0.7", "isarray": "^2.0.5", "stop-iteration-iterator": "^1.0.0" } }, "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw=="], - "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + "es-module-lexer": ["es-module-lexer@2.3.1", "", {}, "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="], "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], @@ -4033,10 +4133,12 @@ "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], - "express-rate-limit": ["express-rate-limit@8.6.0", "", { "dependencies": { "debug": "^4.4.3", "ip-address": "^10.2.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA=="], + "express-rate-limit": ["express-rate-limit@8.6.2", "", { "dependencies": { "debug": "^4.4.3", "ip-address": "^10.2.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A=="], "expressive-code": ["expressive-code@0.41.7", "", { "dependencies": { "@expressive-code/core": "^0.41.7", "@expressive-code/plugin-frames": "^0.41.7", "@expressive-code/plugin-shiki": "^0.41.7", "@expressive-code/plugin-text-markers": "^0.41.7" } }, "sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA=="], + "exsolve": ["exsolve@1.1.1", "", {}, "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g=="], + "ext-list": ["ext-list@2.2.2", "", { "dependencies": { "mime-db": "^1.28.0" } }, "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA=="], "ext-name": ["ext-name@5.0.0", "", { "dependencies": { "ext-list": "^2.0.0", "sort-keys-length": "^1.0.0" } }, "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ=="], @@ -4061,7 +4163,7 @@ "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], - "fast-uri": ["fast-uri@3.1.4", "", {}, "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw=="], + "fast-uri": ["fast-uri@3.1.5", "", {}, "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw=="], "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], @@ -4077,7 +4179,7 @@ "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], - "ffi-rs": ["ffi-rs@1.3.2", "", { "optionalDependencies": { "@yuuang/ffi-rs-android-arm64": "1.3.2", "@yuuang/ffi-rs-darwin-arm64": "1.3.2", "@yuuang/ffi-rs-darwin-x64": "1.3.2", "@yuuang/ffi-rs-linux-arm-gnueabihf": "1.3.2", "@yuuang/ffi-rs-linux-arm64-gnu": "1.3.2", "@yuuang/ffi-rs-linux-arm64-musl": "1.3.2", "@yuuang/ffi-rs-linux-x64-gnu": "1.3.2", "@yuuang/ffi-rs-linux-x64-musl": "1.3.2", "@yuuang/ffi-rs-win32-arm64-msvc": "1.3.2", "@yuuang/ffi-rs-win32-ia32-msvc": "1.3.2", "@yuuang/ffi-rs-win32-x64-msvc": "1.3.2" } }, "sha512-4s8dX9VbBw/jd5NOuE3EJRqXaIVdjMyiumeeDzrOhtjQRwp6Bz2za7iksWXTnvTQKV/tTdm1s1w7mObe92zPjQ=="], + "ffi-rs": ["ffi-rs@1.3.7", "", { "optionalDependencies": { "@yuuang/ffi-rs-android-arm64": "1.3.7", "@yuuang/ffi-rs-darwin-arm64": "1.3.7", "@yuuang/ffi-rs-darwin-x64": "1.3.7", "@yuuang/ffi-rs-linux-arm-gnueabihf": "1.3.7", "@yuuang/ffi-rs-linux-arm64-gnu": "1.3.7", "@yuuang/ffi-rs-linux-arm64-musl": "1.3.7", "@yuuang/ffi-rs-linux-x64-gnu": "1.3.7", "@yuuang/ffi-rs-linux-x64-musl": "1.3.7", "@yuuang/ffi-rs-win32-arm64-msvc": "1.3.7", "@yuuang/ffi-rs-win32-ia32-msvc": "1.3.7", "@yuuang/ffi-rs-win32-x64-msvc": "1.3.7" } }, "sha512-5MMZQS2t/6f/ec3sx0f51gBcKGZPGfolPAW04lvLOSYnr7gmOKs8YzH1Rh+34WGO+VtcgcTuxaUUoJLcR4Tirg=="], "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], @@ -4167,7 +4269,7 @@ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], + "get-tsconfig": ["get-tsconfig@4.14.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-Dz/6HxkrxgNehhxLVeyv8sad9UzF2xBVeaKBQNDfJ5XiSXmp2gTR0eO0RWiT2NCKS5aGP9jjkOMggTN90qU50A=="], "ghostty-web": ["ghostty-web@github:anomalyco/ghostty-web#83c0a07", {}, "anomalyco-ghostty-web-83c0a07", "sha512-Lf2v1agHkVUpMpHBWWuCZrhOEmcwwin5/Hboc9rZwQ7/CKkIh5rU1r1CvfLlhkMoFv+ed8z52RZ8hkzGZZj3MQ=="], @@ -4347,7 +4449,7 @@ "ioredis": ["ioredis@5.11.1", "", { "dependencies": { "@ioredis/commands": "1.10.0", "cluster-key-slot": "1.1.1", "debug": "4.4.3", "denque": "2.1.0", "redis-errors": "1.2.0", "redis-parser": "3.0.0", "standard-as-callback": "2.1.0" } }, "sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A=="], - "ip-address": ["ip-address@10.3.0", "", {}, "sha512-WjqUcdgafPtBplAfDpvR1ZWncdjC2q0P1PHmCkh4edxwiANBDhuDx26cKD7HIl6UGd6BSjwnPVt58X0r5Z85eQ=="], + "ip-address": ["ip-address@10.4.0", "", {}, "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ=="], "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], @@ -4477,7 +4579,7 @@ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "js-yaml": ["js-yaml@3.15.0", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog=="], + "js-yaml": ["js-yaml@3.15.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag=="], "jsbi": ["jsbi@4.3.2", "", {}, "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew=="], @@ -4591,8 +4693,6 @@ "lodash-es": ["lodash-es@4.18.1", "", {}, "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="], - "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], - "lodash.escaperegexp": ["lodash.escaperegexp@4.1.2", "", {}, "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw=="], "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], @@ -4703,7 +4803,7 @@ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - "mermaid": ["mermaid@11.16.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.2", "@iconify/utils": "^3.0.2", "@mermaid-js/parser": "^1.2.0", "@types/d3": "^7.4.3", "@upsetjs/venn.js": "^2.0.0", "cytoscape": "^3.33.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.14", "dayjs": "^1.11.20", "dompurify": "^3.3.3", "es-toolkit": "^1.45.1", "katex": "^0.16.45", "khroma": "^2.1.0", "marked": "^16.3.0", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" } }, "sha512-Zvm3kbstgdpvIJPPItlL7fppIZ3kibvc1oZIGxdvk9t6UFz6flv+Jw7FtRGKwfcI8OckmH04LqG6LlS6X4B1pA=="], + "mermaid": ["mermaid@11.16.1", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.2", "@iconify/utils": "^3.0.2", "@mermaid-js/parser": "^1.2.0", "@types/d3": "^7.4.3", "@upsetjs/venn.js": "^2.0.0", "cytoscape": "^3.33.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.14", "dayjs": "^1.11.20", "dompurify": "^3.3.3", "es-toolkit": "^1.45.1", "katex": "^0.16.45", "khroma": "^2.1.0", "marked": "^16.3.0", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" } }, "sha512-TQsq6u22fAn3rek5VOubrhKPo1g5hwC3FXUN9hiyupTckcYiGuuKGkNQrKYwGJkXUxZdojwRG46gsSCFZMDp4g=="], "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], @@ -4817,8 +4917,6 @@ "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], - "modal": ["modal@0.9.0", "", { "dependencies": { "cbor-x": "^1.6.0", "long": "^5.3.1", "nice-grpc": "^2.1.12", "protobufjs": "^7.5.0", "smol-toml": "^1.3.3", "uuid": "^11.1.0" } }, "sha512-kCXcdJkhbJorf/q/6T9Wdlg6in9JmRnCNQnV6rVBMyeqNV/iXI6BYk4IzY4cvZ6dbauNeDMjk/Q08cbxvoIaXg=="], - "morphdom": ["morphdom@2.7.8", "", {}, "sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg=="], "motion": ["motion@12.34.5", "", { "dependencies": { "framer-motion": "^12.34.5", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-N06NLJ9IeBHeielRqIvYvjPfXuRdyTxa+9++BgpGa+hY2D7TcMkI6QzV3jaRuv0aZRXgMa7cPy9YcBUBisPzAQ=="], @@ -4831,7 +4929,7 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "msgpackr": ["msgpackr@2.0.4", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.4" } }, "sha512-o1C5KRmuRt+apqMr1HuGSqWStZoRBUpEsCsl15uM9VdAF1qHLtvMOU2En747EnTyEl6c4pzPewRMFF31s1CNbA=="], + "msgpackr": ["msgpackr@2.0.5", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.4" } }, "sha512-cef05H/dSYpLpqp3sj/qyZh5vhUYCalnaLO7j1yOmpsR0y/XwLVtK7r5gn+U/F7CTEfMowcGhlUQJDLcLf7jcA=="], "msgpackr-extract": ["msgpackr-extract@3.0.4", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw=="], @@ -4849,7 +4947,7 @@ "nanoevents": ["nanoevents@7.0.1", "", {}, "sha512-o6lpKiCxLeijK4hgsqfR6CNToPyRU3keKyyI6uwuHRvpRTbZ0wXw51WRgyldVugZqoJfkGFrjrIenYH3bfEO3Q=="], - "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], + "nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], @@ -4857,10 +4955,6 @@ "nf3": ["nf3@0.1.12", "", {}, "sha512-qbMXT7RTGh74MYWPeqTIED8nDW70NXOULVHpdWcdZ7IVHVnAsMV9fNugSNnvooipDc1FMOzpis7T9nXJEbJhvQ=="], - "nice-grpc": ["nice-grpc@2.1.16", "", { "dependencies": { "@grpc/grpc-js": "^1.14.0", "abort-controller-x": "^0.5.0", "nice-grpc-common": "^2.0.3" } }, "sha512-Cl3Pn00212Hl8/U6bpgMxmhZj5lyv3nWoJov4cd3FjWarktrMHP4DNvSjCnDwkMWYx4W1tyscEia4JX6Y4GVCQ=="], - - "nice-grpc-common": ["nice-grpc-common@2.0.3", "", { "dependencies": { "ts-error": "^1.0.6" } }, "sha512-MEhnD3JMah0mgyivpb9hpRDbOBuXBxI/TVO+OK1h6rC97WM42HsPMR+zzRNQ0C5BqYJTw1nyWiQRD0DucO+pjQ=="], - "nitro": ["nitro@3.0.1-alpha.1", "", { "dependencies": { "consola": "^3.4.2", "crossws": "^0.4.1", "db0": "^0.3.4", "h3": "2.0.1-rc.5", "jiti": "^2.6.1", "nf3": "^0.1.10", "ofetch": "^2.0.0-alpha.3", "ohash": "^2.0.11", "oxc-minify": "^0.96.0", "oxc-transform": "^0.96.0", "srvx": "^0.9.5", "undici": "^7.16.0", "unenv": "^2.0.0-rc.24", "unstorage": "^2.0.0-alpha.4" }, "peerDependencies": { "rolldown": "*", "rollup": "^4", "vite": "^7", "xml2js": "^0.6.2" }, "optionalPeers": ["rolldown", "rollup", "vite", "xml2js"], "bin": { "nitro": "dist/cli/index.mjs" } }, "sha512-U4AxIsXxdkxzkFrK0XAw0e5Qbojk8jQ50MjjRBtBakC4HurTtQoiZvF+lSe382jhuQZCfAyywGWOFa9QzXLFaw=="], "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], @@ -4889,9 +4983,9 @@ "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], - "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], + "node-mock-http": ["node-mock-http@1.0.5", "", {}, "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw=="], - "node-releases": ["node-releases@2.0.51", "", {}, "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ=="], + "node-releases": ["node-releases@2.0.53", "", {}, "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ=="], "nopt": ["nopt@9.0.0", "", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="], @@ -4951,6 +5045,8 @@ "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + "opencode-drive": ["opencode-drive@workspace:packages/drive"], + "openid-client": ["openid-client@5.6.4", "", { "dependencies": { "jose": "^4.15.4", "lru-cache": "^6.0.0", "object-hash": "^2.2.0", "oidc-token-hash": "^5.0.3" } }, "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA=="], "opentui-spinner": ["opentui-spinner@0.0.7", "", { "dependencies": { "cli-spinners": "^3.3.0" }, "peerDependencies": { "@opentui/core": "^0.3.4", "@opentui/react": "^0.3.4", "@opentui/solid": "^0.3.4", "typescript": "^5" }, "optionalPeers": ["@opentui/react", "@opentui/solid"] }, "sha512-nPzwAvJG+y9rVEwwHLHqbsMzLnIk2zw+F9LqwA7aYJvpM5gsrKC2rrGi36A+tZpA+1RnWxXeWEgVZMchnaH18Q=="], @@ -5083,7 +5179,7 @@ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="], + "postcss": ["postcss@8.5.26", "", { "dependencies": { "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="], "postcss-css-variables": ["postcss-css-variables@0.18.0", "", { "dependencies": { "balanced-match": "^1.0.0", "escape-string-regexp": "^1.0.3", "extend": "^3.0.1" }, "peerDependencies": { "postcss": "^8.2.6" } }, "sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q=="], @@ -5159,7 +5255,7 @@ "pvtsutils": ["pvtsutils@1.3.6", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="], - "pvutils": ["pvutils@1.1.5", "", {}, "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA=="], + "pvutils": ["pvutils@1.2.0", "", {}, "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg=="], "qs": ["qs@6.15.3", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A=="], @@ -5177,7 +5273,7 @@ "react": ["react@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ=="], - "react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + "react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], @@ -5205,7 +5301,7 @@ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], - "recast": ["recast@0.23.12", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA=="], + "recast": ["recast@0.23.19", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-T98lym7kH+pnZmRaD8yDRdaNqyUbwnbEBx0MuchrzMFOEMray4AO3ZJoTUZ5r78Ao78X/OhzW0DL8GB85w/I2w=="], "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], @@ -5311,9 +5407,9 @@ "robust-predicates": ["robust-predicates@3.0.3", "", {}, "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA=="], - "rolldown": ["rolldown@1.1.5", "", { "dependencies": { "@oxc-project/types": "=0.139.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.1.5", "@rolldown/binding-darwin-arm64": "1.1.5", "@rolldown/binding-darwin-x64": "1.1.5", "@rolldown/binding-freebsd-x64": "1.1.5", "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", "@rolldown/binding-linux-arm64-gnu": "1.1.5", "@rolldown/binding-linux-arm64-musl": "1.1.5", "@rolldown/binding-linux-ppc64-gnu": "1.1.5", "@rolldown/binding-linux-s390x-gnu": "1.1.5", "@rolldown/binding-linux-x64-gnu": "1.1.5", "@rolldown/binding-linux-x64-musl": "1.1.5", "@rolldown/binding-openharmony-arm64": "1.1.5", "@rolldown/binding-wasm32-wasi": "1.1.5", "@rolldown/binding-win32-arm64-msvc": "1.1.5", "@rolldown/binding-win32-x64-msvc": "1.1.5" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA=="], + "rolldown": ["rolldown@1.2.3", "", { "dependencies": { "@oxc-project/types": "=0.143.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.2.3", "@rolldown/binding-darwin-arm64": "1.2.3", "@rolldown/binding-darwin-x64": "1.2.3", "@rolldown/binding-freebsd-x64": "1.2.3", "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", "@rolldown/binding-linux-arm64-gnu": "1.2.3", "@rolldown/binding-linux-arm64-musl": "1.2.3", "@rolldown/binding-linux-ppc64-gnu": "1.2.3", "@rolldown/binding-linux-s390x-gnu": "1.2.3", "@rolldown/binding-linux-x64-gnu": "1.2.3", "@rolldown/binding-linux-x64-musl": "1.2.3", "@rolldown/binding-openharmony-arm64": "1.2.3", "@rolldown/binding-win32-arm64-msvc": "1.2.3", "@rolldown/binding-win32-x64-msvc": "1.2.3" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A=="], - "rollup": ["rollup@4.62.2", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.62.2", "@rollup/rollup-android-arm64": "4.62.2", "@rollup/rollup-darwin-arm64": "4.62.2", "@rollup/rollup-darwin-x64": "4.62.2", "@rollup/rollup-freebsd-arm64": "4.62.2", "@rollup/rollup-freebsd-x64": "4.62.2", "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", "@rollup/rollup-linux-arm-musleabihf": "4.62.2", "@rollup/rollup-linux-arm64-gnu": "4.62.2", "@rollup/rollup-linux-arm64-musl": "4.62.2", "@rollup/rollup-linux-loong64-gnu": "4.62.2", "@rollup/rollup-linux-loong64-musl": "4.62.2", "@rollup/rollup-linux-ppc64-gnu": "4.62.2", "@rollup/rollup-linux-ppc64-musl": "4.62.2", "@rollup/rollup-linux-riscv64-gnu": "4.62.2", "@rollup/rollup-linux-riscv64-musl": "4.62.2", "@rollup/rollup-linux-s390x-gnu": "4.62.2", "@rollup/rollup-linux-x64-gnu": "4.62.2", "@rollup/rollup-linux-x64-musl": "4.62.2", "@rollup/rollup-openbsd-x64": "4.62.2", "@rollup/rollup-openharmony-arm64": "4.62.2", "@rollup/rollup-win32-arm64-msvc": "4.62.2", "@rollup/rollup-win32-ia32-msvc": "4.62.2", "@rollup/rollup-win32-x64-gnu": "4.62.2", "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA=="], + "rollup": ["rollup@4.62.4", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.62.4", "@rollup/rollup-android-arm64": "4.62.4", "@rollup/rollup-darwin-arm64": "4.62.4", "@rollup/rollup-darwin-x64": "4.62.4", "@rollup/rollup-freebsd-arm64": "4.62.4", "@rollup/rollup-freebsd-x64": "4.62.4", "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", "@rollup/rollup-linux-arm-musleabihf": "4.62.4", "@rollup/rollup-linux-arm64-gnu": "4.62.4", "@rollup/rollup-linux-arm64-musl": "4.62.4", "@rollup/rollup-linux-loong64-gnu": "4.62.4", "@rollup/rollup-linux-loong64-musl": "4.62.4", "@rollup/rollup-linux-ppc64-gnu": "4.62.4", "@rollup/rollup-linux-ppc64-musl": "4.62.4", "@rollup/rollup-linux-riscv64-gnu": "4.62.4", "@rollup/rollup-linux-riscv64-musl": "4.62.4", "@rollup/rollup-linux-s390x-gnu": "4.62.4", "@rollup/rollup-linux-x64-gnu": "4.62.4", "@rollup/rollup-linux-x64-musl": "4.62.4", "@rollup/rollup-openbsd-x64": "4.62.4", "@rollup/rollup-openharmony-arm64": "4.62.4", "@rollup/rollup-win32-arm64-msvc": "4.62.4", "@rollup/rollup-win32-ia32-msvc": "4.62.4", "@rollup/rollup-win32-x64-gnu": "4.62.4", "@rollup/rollup-win32-x64-msvc": "4.62.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg=="], "rou3": ["rou3@0.7.12", "", {}, "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg=="], @@ -5345,7 +5441,7 @@ "sax": ["sax@1.6.1", "", {}, "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q=="], - "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], @@ -5421,7 +5517,7 @@ "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - "smol-toml": ["smol-toml@1.7.0", "", {}, "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ=="], + "smol-toml": ["smol-toml@1.7.1", "", {}, "sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ=="], "socket.io-client": ["socket.io-client@4.8.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g=="], @@ -5441,7 +5537,7 @@ "solid-presence": ["solid-presence@0.2.0", "", { "dependencies": { "@corvu/utils": "~0.4.2" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-YM92o+jvpzX3XGaD4rLYmq/Kc2ZVh47GSCLEufHBFQQIurvZTs8SoGJxO8BJGNDxBKdcS8F3dYhW1SDXp4BNjA=="], - "solid-prevent-scroll": ["solid-prevent-scroll@0.1.10", "", { "dependencies": { "@corvu/utils": "~0.4.1" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw=="], + "solid-prevent-scroll": ["solid-prevent-scroll@0.1.11", "", { "dependencies": { "@corvu/utils": "~0.4.2" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-2PComVCDHaQN/5t7ogEqUYeHasritZKXZ8Sb/VLkl0Web8o9YhEwOo8LSujJEahvMlYCNyKt0zRJeHldOAeWZg=="], "solid-refresh": ["solid-refresh@0.6.3", "", { "dependencies": { "@babel/generator": "^7.23.6", "@babel/helper-module-imports": "^7.22.15", "@babel/types": "^7.23.6" }, "peerDependencies": { "solid-js": "^1.3" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="], @@ -5513,7 +5609,7 @@ "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="], - "storybook": ["storybook@10.5.4", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/user-event": "^14.6.1", "@vitest/expect": "3.2.4", "@vitest/spy": "3.2.4", "@webcontainer/env": "^1.1.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0", "jsonc-parser": "^3.3.1", "open": "^10.2.0", "oxc-parser": "^0.127.0", "oxc-resolver": "^11.19.1", "recast": "^0.23.5", "semver": "^7.7.3", "use-sync-external-store": "^1.5.0", "ws": "^8.18.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "prettier": "^2 || ^3", "vite-plus": "^0.1.15 || ^0.2.0" }, "optionalPeers": ["@types/react", "prettier", "vite-plus"], "bin": "./dist/bin/dispatcher.js" }, "sha512-bmLxPsxVSPnbeiZqYQpozyNOiJXfk+pf7WfHZflvPkwT6Y+rvYz3Cj/D6H4Kf2jHpuDNiMXBKO3yawLN2OWirg=="], + "storybook": ["storybook@10.5.7", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "6.9.1", "@testing-library/user-event": "^14.6.1", "@vitest/expect": "3.2.4", "@vitest/spy": "3.2.4", "@webcontainer/env": "^1.1.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0", "jsonc-parser": "^3.3.1", "open": "^10.2.0", "oxc-parser": "^0.127.0", "oxc-resolver": "^11.19.1", "recast": "^0.23.5", "semver": "^7.7.3", "use-sync-external-store": "^1.5.0", "ws": "^8.21.1" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "prettier": "^2 || ^3", "vite-plus": "^0.1.15 || ^0.2.0" }, "optionalPeers": ["@types/react", "prettier", "vite-plus"], "bin": "./dist/bin/dispatcher.js" }, "sha512-oiKvWIwIoOhFP1i6dASYyMXwPHKEtVZMshqSB7EvIVYjWRh0l9H7gHEt1z4Gh2rLGFMekWdsm4s94rvwpR7gkg=="], "storybook-solidjs-vite": ["storybook-solidjs-vite@10.6.0", "", { "dependencies": { "@storybook/builder-vite": "^10.4.4", "@storybook/global": "^5.0.0", "@volar/language-core": "^2.4.28", "@volar/typescript": "^2.4.28", "semver": "^7.8.1" }, "peerDependencies": { "@solidjs/web": "^2.0.0-0", "solid-js": "^1.8.0-0 || ^2.0.0-0", "storybook": "^0.0.0-0 || ^10.0.0", "typescript": "^4.0.0 || ^5.0.0 || ^6.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vite-plugin-solid": "^2.0.0-0 || ^3.0.0-0" }, "optionalPeers": ["@solidjs/web", "typescript"] }, "sha512-/nNRk0D8Uwvqny/DKVNBsCzajjmC//cATifF66ebnpjpRBCwBrflg2ymsGEE0D9LmDsdcMBn1rsoe6Z4C2Jzbw=="], @@ -5545,6 +5641,8 @@ "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], + "stripe": ["stripe@18.0.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-3Fs33IzKUby//9kCkCa1uRpinAoTvj6rJgQ2jrBEysoxEvfsclvXdna1amyEYbA2EKkjynuB4+L/kleCCaWTpA=="], "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], @@ -5577,7 +5675,7 @@ "tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="], - "takumi-js": ["takumi-js@2.4.2", "", { "dependencies": { "@takumi-rs/core": "2.4.2", "@takumi-rs/helpers": "2.4.2", "@takumi-rs/wasm": "2.4.2" } }, "sha512-qWwKLsFJcCimm+4eG2tZgRV7EkI1ee65RH9VBrN3+yCXjEQnl9o113OCfUbiOwwcfg/e/4Hmam1YL1w/7SwknA=="], + "takumi-js": ["takumi-js@2.6.0", "", { "dependencies": { "@takumi-rs/core": "2.6.0", "@takumi-rs/helpers": "2.6.0", "@takumi-rs/wasm": "2.6.0" } }, "sha512-23ioyBKHG7wfizry/5iFk7SfKWskqYpNqKmZ5cMkVsHsITMya2WxWLF2bngz/bxAk64qsIck+9szPHwEADFtYg=="], "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], @@ -5593,7 +5691,7 @@ "terracotta": ["terracotta@1.1.1", "", { "dependencies": { "solid-use": "^0.9.1" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-Sa6wnvkGMFmPq8N/wQb2aKkIW2eXH0LJvUOEk6QZLBEjqy+LsbzAOpDuqEfOmfA/hexssE6eQve2i1IIOeOh4g=="], - "terser": ["terser@5.49.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA=="], + "terser": ["terser@5.49.2", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ=="], "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], @@ -5613,11 +5711,13 @@ "tinyclip": ["tinyclip@0.1.15", "", {}, "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A=="], - "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "tinyexec": ["tinyexec@1.3.0", "", {}, "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ=="], "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], - "tinyrainbow": ["tinyrainbow@3.1.0", "", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="], + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], + + "tinyrainbow": ["tinyrainbow@3.1.1", "", {}, "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw=="], "tinyspy": ["tinyspy@4.0.4", "", {}, "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q=="], @@ -5659,8 +5759,6 @@ "ts-dedent": ["ts-dedent@2.3.0", "", {}, "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg=="], - "ts-error": ["ts-error@1.0.6", "", {}, "sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA=="], - "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], @@ -5715,7 +5813,7 @@ "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], - "undici": ["undici@8.9.0", "", {}, "sha512-aWZpUj7XoGonMClx4gdDRfgBjqeA+F473aDmROQQbM9n6PRfK/u1q/a0X4wMTgcHfT8H6fpbt98PFuDUwFg2YA=="], + "undici": ["undici@8.10.0", "", {}, "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], @@ -5767,7 +5865,7 @@ "unzipper": ["unzipper@0.12.5", "", { "dependencies": { "bluebird": "~3.7.2", "duplexer2": "~0.1.4", "fs-extra": "11.3.1", "graceful-fs": "^4.2.2", "node-int64": "^0.4.0" } }, "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A=="], - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "update-browserslist-db": ["update-browserslist-db@1.3.0", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA=="], "uqr": ["uqr@0.1.3", "", {}, "sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA=="], @@ -5805,6 +5903,8 @@ "vite": ["vite@7.1.4", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw=="], + "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + "vite-plugin-dynamic-import": ["vite-plugin-dynamic-import@1.6.0", "", { "dependencies": { "acorn": "^8.12.1", "es-module-lexer": "^1.5.4", "fast-glob": "^3.3.2", "magic-string": "^0.30.11" } }, "sha512-TM0sz70wfzTIo9YCxVFwS8OA9lNREsh+0vMHGSkWDTZ7bgd1Yjs5RV8EgB634l/91IsXJReg0xtmuQqP0mf+rg=="], "vite-plugin-icons-spritesheet": ["vite-plugin-icons-spritesheet@3.0.1", "", { "dependencies": { "chalk": "^5.4.1", "glob": "^11.0.1", "node-html-parser": "^7.0.1", "tinyexec": "^0.3.2" }, "peerDependencies": { "vite": ">=5.2.0" } }, "sha512-Cr0+Z6wRMwSwKisWW9PHeTjqmQFv0jwRQQMc3YgAhAgZEe03j21el0P/CA31KN/L5eiL1LhR14VTXl96LetonA=="], @@ -5939,7 +6039,7 @@ "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="], - "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + "yoctocolors": ["yoctocolors@2.2.0", "", {}, "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg=="], "youch": ["youch@4.1.0-beta.10", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.4", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.3" } }, "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="], @@ -5991,7 +6091,7 @@ "@ai-sdk/deepgram/@ai-sdk/provider": ["@ai-sdk/provider@3.0.14", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA=="], - "@ai-sdk/deepgram/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.40", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw=="], + "@ai-sdk/deepgram/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.42", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8", "undici": "^5.29.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Q07lZsq4ir+xwAGVfSbY2WNGLrbfWINFaL2I/vTBFrkuXeP7VZh+UtQgLOKZS6Z/6flNFW22jDYdbINvwTV/PA=="], "@ai-sdk/deepinfra/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="], @@ -6003,13 +6103,13 @@ "@ai-sdk/elevenlabs/@ai-sdk/provider": ["@ai-sdk/provider@3.0.14", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA=="], - "@ai-sdk/elevenlabs/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.40", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw=="], + "@ai-sdk/elevenlabs/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.42", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8", "undici": "^5.29.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Q07lZsq4ir+xwAGVfSbY2WNGLrbfWINFaL2I/vTBFrkuXeP7VZh+UtQgLOKZS6Z/6flNFW22jDYdbINvwTV/PA=="], - "@ai-sdk/fireworks/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.62", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.40" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-lRe54zvyIS1a60N8UVhnwKZRI5I+GSV8uhKkPpId+aiKO7z7UgSbNqFmXkBBMD3yc9UrLnQnATV2EQyXNhzEkA=="], + "@ai-sdk/fireworks/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.64", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.42" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-oMh5/bhu2ibsXqzHeLbJ+9Y7UQdOSrfOLPI+UA1vEcqXGYVBQfWxLe5jBUpsaL8GBBj/nmSeYGX6QPan8RfHiQ=="], "@ai-sdk/fireworks/@ai-sdk/provider": ["@ai-sdk/provider@3.0.14", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA=="], - "@ai-sdk/fireworks/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.40", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw=="], + "@ai-sdk/fireworks/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.42", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8", "undici": "^5.29.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Q07lZsq4ir+xwAGVfSbY2WNGLrbfWINFaL2I/vTBFrkuXeP7VZh+UtQgLOKZS6Z/6flNFW22jDYdbINvwTV/PA=="], "@ai-sdk/google/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="], @@ -6043,13 +6143,11 @@ "@ai-sdk/vercel/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], - "@ai-sdk/xai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.56", "", { "dependencies": { "@ai-sdk/provider": "3.0.13", "@ai-sdk/provider-utils": "4.0.35" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cQrN6OUn/jvsY3OdsU6Wn+ss7vp1iwIcakZKSlSRMnYqShBfyT7Qht+eqmgxs7w9ttrw6FAG6o11AiBs+iEsTA=="], + "@ai-sdk/xai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.64", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.42" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-oMh5/bhu2ibsXqzHeLbJ+9Y7UQdOSrfOLPI+UA1vEcqXGYVBQfWxLe5jBUpsaL8GBBj/nmSeYGX6QPan8RfHiQ=="], - "@ai-sdk/xai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.13", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-ZPtVYt5QIJzOta1kdUiDuCx4HhFkvNPv/rvmZ2b1iXwybYjJsCnNYR4PAw4kW7rgVfDARvHXcU64efWuqNp6bw=="], + "@ai-sdk/xai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.14", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA=="], - "@ai-sdk/xai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.35", "", { "dependencies": { "@ai-sdk/provider": "3.0.13", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-bjYld/2KGPLt78kpqbya+fD4LYS7BqVQJyUjE3qAHrYB0FR2Q90BaWEVIBZaguTWXf/A8L6uG1zO1v9TxVlGWg=="], - - "@antfu/install-pkg/tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], + "@ai-sdk/xai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.42", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8", "undici": "^5.29.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Q07lZsq4ir+xwAGVfSbY2WNGLrbfWINFaL2I/vTBFrkuXeP7VZh+UtQgLOKZS6Z/6flNFW22jDYdbINvwTV/PA=="], "@astrojs/cloudflare/vite": ["vite@6.4.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A=="], @@ -6057,7 +6155,7 @@ "@astrojs/markdown-remark/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.6.1", "", {}, "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A=="], - "@astrojs/markdown-remark/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@astrojs/markdown-remark/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "@astrojs/markdown-remark/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], @@ -6067,25 +6165,27 @@ "@astrojs/mdx/@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.11", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.6", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ=="], + "@astrojs/mdx/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + "@astrojs/mdx/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - "@astrojs/node/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], + "@astrojs/node/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.2", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.3.0", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-yt7fMgPYqSM4Tmr+taTW6Per+hjJ8Pk6lA1PAcDyqzOt8HzJ6Kje5WzCxA2Sd+9wsUW7uhkLeoTMK0cXPwH9rQ=="], "@astrojs/node/astro": ["astro@7.1.3", "", { "dependencies": { "@astrojs/compiler-rs": "^0.3.1", "@astrojs/internal-helpers": "0.10.1", "@astrojs/markdown-satteri": "0.3.4", "@astrojs/telemetry": "3.3.3", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "am-i-vibing": "^0.4.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "ci-info": "^4.4.0", "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", "cookie": "^2.0.1", "devalue": "^5.8.1", "diff": "^8.0.3", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", "esbuild": "^0.28.0", "flattie": "^1.1.1", "fontace": "~0.4.1", "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "js-yaml": "^4.1.1", "jsonc-parser": "^3.3.1", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mrmime": "^2.0.1", "neotraverse": "^1.0.1", "obug": "^2.1.1", "p-limit": "^7.3.0", "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.4", "semver": "^7.7.4", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "svgo": "^4.0.1", "tinyclip": "^0.1.12", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "ultrahtml": "^1.6.0", "unifont": "~0.7.4", "unstorage": "^1.17.5", "vite": "^8.0.13", "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", "zod": "^4.3.6" }, "optionalDependencies": { "sharp": "^0.34.0 || ^0.35.0" }, "peerDependencies": { "@astrojs/markdown-remark": "7.2.1" }, "optionalPeers": ["@astrojs/markdown-remark"], "bin": { "astro": "./bin/astro.mjs" } }, "sha512-4dhPyAAXthf3xLEYnG8SeL7yr/nTPPABfY7e9YF0yuO+vK9Xp+8Q5j4xzsmL3GueukQv4oNwGNTBepLOiDGeJA=="], - "@astrojs/react/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], + "@astrojs/react/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.2", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.3.0", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-yt7fMgPYqSM4Tmr+taTW6Per+hjJ8Pk6lA1PAcDyqzOt8HzJ6Kje5WzCxA2Sd+9wsUW7uhkLeoTMK0cXPwH9rQ=="], "@astrojs/react/@vitejs/plugin-react": ["@vitejs/plugin-react@5.2.0", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw=="], - "@astrojs/react/vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="], + "@astrojs/react/vite": ["vite@8.2.1", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.25", "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw=="], "@astrojs/sitemap/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "@astrojs/solid-js/vite": ["vite@6.4.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A=="], - "@astrojs/starlight/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@astrojs/starlight/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], - "@astrojs/vercel/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], + "@astrojs/vercel/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.2", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.3.0", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-yt7fMgPYqSM4Tmr+taTW6Per+hjJ8Pk6lA1PAcDyqzOt8HzJ6Kje5WzCxA2Sd+9wsUW7uhkLeoTMK0cXPwH9rQ=="], "@astrojs/vercel/@vercel/analytics": ["@vercel/analytics@1.6.1", "", { "peerDependencies": { "@remix-run/react": "^2", "@sveltejs/kit": "^1 || ^2", "next": ">= 13", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", "vue-router": "^4" }, "optionalPeers": ["@remix-run/react", "@sveltejs/kit", "next", "react", "svelte", "vue", "vue-router"] }, "sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg=="], @@ -6111,15 +6211,15 @@ "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - "@aws-sdk/client-cognito-identity/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/client-cognito-identity/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], - "@aws-sdk/client-cognito-identity/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.72", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.61", "@aws-sdk/credential-provider-http": "^3.972.63", "@aws-sdk/credential-provider-ini": "^3.973.6", "@aws-sdk/credential-provider-process": "^3.972.61", "@aws-sdk/credential-provider-sso": "^3.973.5", "@aws-sdk/credential-provider-web-identity": "^3.972.67", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/credential-provider-imds": "^4.4.13", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-blQ7F5QGzylnzeh5549zQLoCAiMHkXFLjFovEMaVy4b2X8JhUu+u9NXro1hyK95YHdVFNmBHKs2hIHtZchxKlQ=="], + "@aws-sdk/client-cognito-identity/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.78", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.67", "@aws-sdk/credential-provider-http": "^3.972.69", "@aws-sdk/credential-provider-ini": "^3.973.12", "@aws-sdk/credential-provider-process": "^3.972.67", "@aws-sdk/credential-provider-sso": "^3.973.11", "@aws-sdk/credential-provider-web-identity": "^3.972.73", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-OgPAnfvbGAMWac6yvxJ1ihslrvDpPVwR68D2csospdNCCyPvHk9JLzYKwz48SNiS1T2znDwHauywRKRFfpyYng=="], "@aws-sdk/client-cognito-identity/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/client-lambda/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/client-lambda/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], - "@aws-sdk/client-lambda/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.72", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.61", "@aws-sdk/credential-provider-http": "^3.972.63", "@aws-sdk/credential-provider-ini": "^3.973.6", "@aws-sdk/credential-provider-process": "^3.972.61", "@aws-sdk/credential-provider-sso": "^3.973.5", "@aws-sdk/credential-provider-web-identity": "^3.972.67", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/credential-provider-imds": "^4.4.13", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-blQ7F5QGzylnzeh5549zQLoCAiMHkXFLjFovEMaVy4b2X8JhUu+u9NXro1hyK95YHdVFNmBHKs2hIHtZchxKlQ=="], + "@aws-sdk/client-lambda/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.78", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.67", "@aws-sdk/credential-provider-http": "^3.972.69", "@aws-sdk/credential-provider-ini": "^3.973.12", "@aws-sdk/credential-provider-process": "^3.972.67", "@aws-sdk/credential-provider-sso": "^3.973.11", "@aws-sdk/credential-provider-web-identity": "^3.972.73", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-OgPAnfvbGAMWac6yvxJ1ihslrvDpPVwR68D2csospdNCCyPvHk9JLzYKwz48SNiS1T2znDwHauywRKRFfpyYng=="], "@aws-sdk/client-lambda/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], @@ -6147,19 +6247,19 @@ "@aws-sdk/credential-provider-cognito-identity/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/credential-provider-env/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/credential-provider-env/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], "@aws-sdk/credential-provider-env/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/credential-provider-http/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/credential-provider-http/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], "@aws-sdk/credential-provider-http/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/credential-provider-ini/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/credential-provider-ini/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], "@aws-sdk/credential-provider-ini/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/credential-provider-login/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/credential-provider-login/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], "@aws-sdk/credential-provider-login/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], @@ -6175,31 +6275,31 @@ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.933.0", "", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/nested-clients": "3.933.0", "@aws-sdk/types": "3.930.0", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-c7Eccw2lhFx2/+qJn3g+uIDWRuWi2A6Sz3PVvckFUEzPsP0dPUo19hlvtarwP5GzrsXn0yEPRVhpewsIaSCGaQ=="], - "@aws-sdk/credential-provider-process/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/credential-provider-process/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], "@aws-sdk/credential-provider-process/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/credential-provider-sso/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/credential-provider-sso/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], "@aws-sdk/credential-provider-sso/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/credential-provider-web-identity/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/credential-provider-web-identity/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], "@aws-sdk/credential-provider-web-identity/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/credential-providers/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/credential-providers/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], - "@aws-sdk/credential-providers/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.72", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.61", "@aws-sdk/credential-provider-http": "^3.972.63", "@aws-sdk/credential-provider-ini": "^3.973.6", "@aws-sdk/credential-provider-process": "^3.972.61", "@aws-sdk/credential-provider-sso": "^3.973.5", "@aws-sdk/credential-provider-web-identity": "^3.972.67", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.8", "@smithy/credential-provider-imds": "^4.4.13", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-blQ7F5QGzylnzeh5549zQLoCAiMHkXFLjFovEMaVy4b2X8JhUu+u9NXro1hyK95YHdVFNmBHKs2hIHtZchxKlQ=="], + "@aws-sdk/credential-providers/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.78", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.67", "@aws-sdk/credential-provider-http": "^3.972.69", "@aws-sdk/credential-provider-ini": "^3.973.12", "@aws-sdk/credential-provider-process": "^3.972.67", "@aws-sdk/credential-provider-sso": "^3.973.11", "@aws-sdk/credential-provider-web-identity": "^3.972.73", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.31.1", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-OgPAnfvbGAMWac6yvxJ1ihslrvDpPVwR68D2csospdNCCyPvHk9JLzYKwz48SNiS1T2znDwHauywRKRFfpyYng=="], "@aws-sdk/credential-providers/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/nested-clients/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/nested-clients/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], - "@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.42", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-DBV4naZP6HYBlAvPpoQzOP12Wvfou/5rN8yJPXjBTBylU5qwCbh/tXr2MddHoIjgoRkEl/eS+IljiUqvmwey1Q=="], + "@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.43", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-lKekx8bLBXSv4O+cslk9Zfnw2XKSkWBs3uWL5QGhH2ZAQfNS7FE0vcSSN2vD/AhxX54ZTywWxR4STThoeOXlBA=="], "@aws-sdk/nested-clients/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], - "@aws-sdk/token-providers/@aws-sdk/core": ["@aws-sdk/core@3.977.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.29.8", "@smithy/signature-v4": "^5.6.9", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-KVtQRtc00ES/y+Sc3vYXeP6pCIcNlBJCZOwvqSy8ZpVGmbM5+IG+AfhuTKQ2oXmIVqZJewaGMMpzPkywC6xg0w=="], + "@aws-sdk/token-providers/@aws-sdk/core": ["@aws-sdk/core@3.977.6", "", { "dependencies": { "@aws-sdk/types": "^3.974.2", "@aws-sdk/xml-builder": "^3.972.37", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-QiaJV4/zDrB4ZY2mfeSXSzSTc36W16sZXcGz+SPFk0CJ26gziO0cS+4LjJUMAbdeeBOvS0k0Aq1cZpfGdUXxSw=="], "@aws-sdk/token-providers/@aws-sdk/types": ["@aws-sdk/types@3.974.2", "", { "dependencies": { "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA=="], @@ -6221,12 +6321,24 @@ "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@bruits/satteri-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], + + "@bruits/satteri-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], + "@bufbuild/protoplugin/typescript": ["typescript@5.4.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ=="], "@cloudflare/kv-asset-handler/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], "@cloudflare/vite-plugin/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "@cloudflare/vitest-pool-workers/esbuild": ["esbuild@0.27.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.0", "@esbuild/android-arm": "0.27.0", "@esbuild/android-arm64": "0.27.0", "@esbuild/android-x64": "0.27.0", "@esbuild/darwin-arm64": "0.27.0", "@esbuild/darwin-x64": "0.27.0", "@esbuild/freebsd-arm64": "0.27.0", "@esbuild/freebsd-x64": "0.27.0", "@esbuild/linux-arm": "0.27.0", "@esbuild/linux-arm64": "0.27.0", "@esbuild/linux-ia32": "0.27.0", "@esbuild/linux-loong64": "0.27.0", "@esbuild/linux-mips64el": "0.27.0", "@esbuild/linux-ppc64": "0.27.0", "@esbuild/linux-riscv64": "0.27.0", "@esbuild/linux-s390x": "0.27.0", "@esbuild/linux-x64": "0.27.0", "@esbuild/netbsd-arm64": "0.27.0", "@esbuild/netbsd-x64": "0.27.0", "@esbuild/openbsd-arm64": "0.27.0", "@esbuild/openbsd-x64": "0.27.0", "@esbuild/openharmony-arm64": "0.27.0", "@esbuild/sunos-x64": "0.27.0", "@esbuild/win32-arm64": "0.27.0", "@esbuild/win32-ia32": "0.27.0", "@esbuild/win32-x64": "0.27.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA=="], + + "@cloudflare/vitest-pool-workers/miniflare": ["miniflare@4.20260120.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.18.2", "workerd": "1.20260120.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "^3.25.76" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-XXZyE2pDKMtP5OLuv0LPHEAzIYhov4jrYjcqrhhqtxGGtXneWOHvXIPo+eV8sqwqWd3R7j4DlEKcyb+87BR49Q=="], + + "@cloudflare/vitest-pool-workers/wrangler": ["wrangler@4.60.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.2", "@cloudflare/unenv-preset": "2.11.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20260120.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260120.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260120.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-n4kibm/xY0Qd5G2K/CbAQeVeOIlwPNVglmFjlDRCCYk3hZh8IggO/rg8AXt/vByK2Sxsugl5Z7yvgWxrUbmS6g=="], + + "@cloudflare/vitest-pool-workers/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], "@dot/log/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -6265,47 +6377,51 @@ "@jsx-email/cli/esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="], + "@jsx-email/cli/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + "@jsx-email/cli/tailwindcss": ["tailwindcss@3.3.3", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.18.2", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", "postcss": "^8.4.23", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.1", "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "resolve": "^1.22.2", "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w=="], "@jsx-email/cli/vite": ["vite@4.5.14", "", { "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", "rollup": "^3.27.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g=="], "@jsx-email/doiuse-email/htmlparser2": ["htmlparser2@9.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.1.0", "entities": "^4.5.0" } }, "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ=="], + "@jsx-email/tailwind/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + "@kobalte/core/solid-presence": ["solid-presence@0.1.8", "", { "dependencies": { "@corvu/utils": "~0.4.0" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA=="], "@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], "@mapbox/node-pre-gyp/nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], - "@mdx-js/mdx/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + "@mdx-js/mdx/acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "@mdx-js/mdx/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - "@modelcontextprotocol/sdk/hono": ["hono@4.12.32", "", {}, "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg=="], + "@modelcontextprotocol/sdk/hono": ["hono@4.13.1", "", {}, "sha512-kdJoFVv2xmayw6cY09H7AbMJMt8Jn5jdlEdXsP7AGBdF2DIptVlKlOLKXP41yPip4/a3yQPv9gVcJYI8YY04dw=="], - "@modelcontextprotocol/sdk/jose": ["jose@6.2.4", "", {}, "sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA=="], + "@modelcontextprotocol/sdk/jose": ["jose@6.2.8", "", {}, "sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ=="], "@npmcli/config/ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], "@npmcli/git/ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], - "@npmcli/query/postcss-selector-parser": ["postcss-selector-parser@7.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg=="], + "@npmcli/query/postcss-selector-parser": ["postcss-selector-parser@7.1.5", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw=="], - "@octokit/auth-app/@octokit/request": ["@octokit/request@10.0.11", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q=="], + "@octokit/auth-app/@octokit/request": ["@octokit/request@10.0.13", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A=="], - "@octokit/auth-app/@octokit/request-error": ["@octokit/request-error@7.1.0", "", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="], + "@octokit/auth-app/@octokit/request-error": ["@octokit/request-error@7.1.1", "", { "dependencies": { "@octokit/types": "^17.0.0" } }, "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA=="], - "@octokit/auth-oauth-app/@octokit/request": ["@octokit/request@10.0.11", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q=="], + "@octokit/auth-oauth-app/@octokit/request": ["@octokit/request@10.0.13", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A=="], - "@octokit/auth-oauth-app/@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@octokit/auth-oauth-app/@octokit/types": ["@octokit/types@17.0.0", "", { "dependencies": { "@octokit/openapi-types": "^28.0.0" } }, "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="], - "@octokit/auth-oauth-device/@octokit/request": ["@octokit/request@10.0.11", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q=="], + "@octokit/auth-oauth-device/@octokit/request": ["@octokit/request@10.0.13", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A=="], - "@octokit/auth-oauth-device/@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@octokit/auth-oauth-device/@octokit/types": ["@octokit/types@17.0.0", "", { "dependencies": { "@octokit/openapi-types": "^28.0.0" } }, "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="], - "@octokit/auth-oauth-user/@octokit/request": ["@octokit/request@10.0.11", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q=="], + "@octokit/auth-oauth-user/@octokit/request": ["@octokit/request@10.0.13", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A=="], - "@octokit/auth-oauth-user/@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@octokit/auth-oauth-user/@octokit/types": ["@octokit/types@17.0.0", "", { "dependencies": { "@octokit/openapi-types": "^28.0.0" } }, "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="], "@octokit/core/@octokit/types": ["@octokit/types@13.10.0", "", { "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA=="], @@ -6319,17 +6435,17 @@ "@octokit/graphql/universal-user-agent": ["universal-user-agent@6.0.1", "", {}, "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="], - "@octokit/oauth-methods/@octokit/request": ["@octokit/request@10.0.11", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q=="], + "@octokit/oauth-methods/@octokit/request": ["@octokit/request@10.0.13", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A=="], - "@octokit/oauth-methods/@octokit/request-error": ["@octokit/request-error@7.1.0", "", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="], + "@octokit/oauth-methods/@octokit/request-error": ["@octokit/request-error@7.1.1", "", { "dependencies": { "@octokit/types": "^17.0.0" } }, "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA=="], - "@octokit/oauth-methods/@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@octokit/oauth-methods/@octokit/types": ["@octokit/types@17.0.0", "", { "dependencies": { "@octokit/openapi-types": "^28.0.0" } }, "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="], - "@octokit/plugin-paginate-rest/@octokit/core": ["@octokit/core@7.0.6", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q=="], + "@octokit/plugin-paginate-rest/@octokit/core": ["@octokit/core@7.0.7", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.4", "@octokit/request": "^10.0.13", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA=="], "@octokit/plugin-paginate-rest/@octokit/types": ["@octokit/types@15.0.2", "", { "dependencies": { "@octokit/openapi-types": "^26.0.0" } }, "sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q=="], - "@octokit/plugin-rest-endpoint-methods/@octokit/core": ["@octokit/core@7.0.6", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q=="], + "@octokit/plugin-rest-endpoint-methods/@octokit/core": ["@octokit/core@7.0.7", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.4", "@octokit/request": "^10.0.13", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA=="], "@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@15.0.2", "", { "dependencies": { "@octokit/openapi-types": "^26.0.0" } }, "sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q=="], @@ -6341,7 +6457,7 @@ "@octokit/request-error/@octokit/types": ["@octokit/types@13.10.0", "", { "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA=="], - "@octokit/rest/@octokit/core": ["@octokit/core@7.0.6", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q=="], + "@octokit/rest/@octokit/core": ["@octokit/core@7.0.7", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.4", "@octokit/request": "^10.0.13", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA=="], "@octokit/rest/@octokit/plugin-request-log": ["@octokit/plugin-request-log@6.0.0", "", { "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q=="], @@ -6361,18 +6477,36 @@ "@opencode-ai/desktop/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], + "@opencode-ai/lab-catalog/react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], + + "@opencode-ai/lab-catalog/typescript": ["typescript@7.0.2", "", { "optionalDependencies": { "@typescript/typescript-aix-ppc64": "7.0.2", "@typescript/typescript-darwin-arm64": "7.0.2", "@typescript/typescript-darwin-x64": "7.0.2", "@typescript/typescript-freebsd-arm64": "7.0.2", "@typescript/typescript-freebsd-x64": "7.0.2", "@typescript/typescript-linux-arm": "7.0.2", "@typescript/typescript-linux-arm64": "7.0.2", "@typescript/typescript-linux-loong64": "7.0.2", "@typescript/typescript-linux-mips64el": "7.0.2", "@typescript/typescript-linux-ppc64": "7.0.2", "@typescript/typescript-linux-riscv64": "7.0.2", "@typescript/typescript-linux-s390x": "7.0.2", "@typescript/typescript-linux-x64": "7.0.2", "@typescript/typescript-netbsd-arm64": "7.0.2", "@typescript/typescript-netbsd-x64": "7.0.2", "@typescript/typescript-openbsd-arm64": "7.0.2", "@typescript/typescript-openbsd-x64": "7.0.2", "@typescript/typescript-sunos-x64": "7.0.2", "@typescript/typescript-win32-arm64": "7.0.2", "@typescript/typescript-win32-x64": "7.0.2" }, "bin": { "tsc": "bin/tsc" } }, "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="], + + "@opencode-ai/lab-catalog/wrangler": ["wrangler@4.110.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", "miniflare": "4.20260708.1", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260708.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "peerDependencies": { "@cloudflare/workers-types": "^5.20260708.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js", "cf-wrangler": "bin/cf-wrangler.js" } }, "sha512-xZeXKYi7hxQRF5anL+v77RkufJNpF9f3Eqeyqq2QBsETpLZgh0Agj0jJ6JPtkbgn6ukZdh8OK5egsGPWIditgg=="], + "@opencode-ai/session-ui/@opencode-ai/sdk": ["@opencode-ai/sdk@../app/vendor/opencode-ai-sdk-1.18.8-dev.tgz", { "dependencies": { "cross-spawn": "7.0.6" } }, "sha512-C2nfk4x0sPINwE5V6DPkFSuH3PkUmKPWHPzxpXC1j+3Ui5hslLCWJbkk8WcOG1Lyt3C0+yp4ea64v/kmtYCO4w=="], "@opencode-ai/session-ui/@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.3", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/rootless": "^1.5.2", "@solid-primitives/static-store": "^0.1.2", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ=="], + "@opencode-ai/simulation/@fontsource/noto-sans-math": ["@fontsource/noto-sans-math@5.2.5", "", {}, "sha512-1bxEvVlF51Vfgpju32mRZzI/CHvsfqjXjI2+sAuEyHYvXABUAIyj+93sCO3QZIoMG5drWyrzgoCqRQRaL6wQ8Q=="], + + "@opencode-ai/simulation/@fontsource/noto-sans-symbols": ["@fontsource/noto-sans-symbols@5.2.5", "", {}, "sha512-mxoIRstsmZpZFzd/SRWiD+l6T7TGhpgCrGs7TEnnuGSQIfjVMrQT9Zej2enh9pkfmPNAFyeaGJkHkszJ1hH++w=="], + + "@opencode-ai/simulation/@fontsource/noto-sans-symbols-2": ["@fontsource/noto-sans-symbols-2@5.2.5", "", {}, "sha512-F4O9WLifwoZS1quNzY1ebjMNo2cQPe/UP68Dmud0ONi2lOxaR6xp6fFPO2gG17MI7DwAnfMyQFl64A2tAd28hg=="], + "@opencode-ai/storybook/@types/react": ["@types/react@18.0.25", "", { "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g=="], + "@opencode-ai/storybook/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + "@opencode-ai/ui/@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.3", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/rootless": "^1.5.2", "@solid-primitives/static-store": "^0.1.2", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ=="], "@opencode-ai/updates/wrangler": ["wrangler@4.110.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", "miniflare": "4.20260708.1", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260708.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "peerDependencies": { "@cloudflare/workers-types": "^5.20260708.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js", "cf-wrangler": "bin/cf-wrangler.js" } }, "sha512-xZeXKYi7hxQRF5anL+v77RkufJNpF9f3Eqeyqq2QBsETpLZgh0Agj0jJ6JPtkbgn6ukZdh8OK5egsGPWIditgg=="], "@opencode-ai/web/@shikijs/transformers": ["@shikijs/transformers@3.20.0", "", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/types": "3.20.0" } }, "sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g=="], + "@opencode-ai/workerd-spike/vitest": ["vitest@3.2.7", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.7", "@vitest/mocker": "3.2.7", "@vitest/pretty-format": "^3.2.7", "@vitest/runner": "3.2.7", "@vitest/snapshot": "3.2.7", "@vitest/spy": "3.2.7", "@vitest/utils": "3.2.7", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.7", "@vitest/ui": "3.2.7", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg=="], + + "@opencode-ai/workerd-spike/wrangler": ["wrangler@4.28.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.6.0", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20250803.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.19", "workerd": "1.20250803.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250803.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-y0yHIuScpok9oSErLqDbxkBChC2+/jZpvqMg2NxOto1JCyUtDUuKljOfcVMaI48d9GuhOCSoWSumYxLAHNxaLA=="], + "@opencode-ai/www/@astrojs/cloudflare": ["@astrojs/cloudflare@14.1.4", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@astrojs/underscore-redirects": "1.0.3", "@cloudflare/vite-plugin": "^1.39.0", "piccolore": "^0.1.3", "vite": "^8.0.13" }, "peerDependencies": { "astro": "^7.0.0", "wrangler": "^4.83.0" } }, "sha512-Zyo1E/5/dmegmKODbwUzOd67euNd6oKcbllhAwe3uFFprA7mIFNkpF6yBBa78vIkpMNuU13MkBJHCLd+yJSuEA=="], "@opencode-ai/www/astro": ["astro@7.1.3", "", { "dependencies": { "@astrojs/compiler-rs": "^0.3.1", "@astrojs/internal-helpers": "0.10.1", "@astrojs/markdown-satteri": "0.3.4", "@astrojs/telemetry": "3.3.3", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "am-i-vibing": "^0.4.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "ci-info": "^4.4.0", "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", "cookie": "^2.0.1", "devalue": "^5.8.1", "diff": "^8.0.3", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", "esbuild": "^0.28.0", "flattie": "^1.1.1", "fontace": "~0.4.1", "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "js-yaml": "^4.1.1", "jsonc-parser": "^3.3.1", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mrmime": "^2.0.1", "neotraverse": "^1.0.1", "obug": "^2.1.1", "p-limit": "^7.3.0", "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.4", "semver": "^7.7.4", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "svgo": "^4.0.1", "tinyclip": "^0.1.12", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "ultrahtml": "^1.6.0", "unifont": "~0.7.4", "unstorage": "^1.17.5", "vite": "^8.0.13", "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", "zod": "^4.3.6" }, "optionalDependencies": { "sharp": "^0.34.0 || ^0.35.0" }, "peerDependencies": { "@astrojs/markdown-remark": "7.2.1" }, "optionalPeers": ["@astrojs/markdown-remark"], "bin": { "astro": "./bin/astro.mjs" } }, "sha512-4dhPyAAXthf3xLEYnG8SeL7yr/nTPPABfY7e9YF0yuO+vK9Xp+8Q5j4xzsmL3GueukQv4oNwGNTBepLOiDGeJA=="], @@ -6387,10 +6521,6 @@ "@oslojs/jwt/@oslojs/encoding": ["@oslojs/encoding@0.4.1", "", {}, "sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q=="], - "@oxc-parser/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], - - "@oxc-parser/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], - "@oxc-resolver/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], "@oxc-resolver/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], @@ -6403,18 +6533,44 @@ "@pierre/diffs/react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], - "@pierre/diffs/react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], - "@pierre/trees/react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], - "@pierre/trees/react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], - "@poppinss/dumper/@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="], "@poppinss/dumper/supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], "@protobuf-ts/plugin/typescript": ["typescript@3.9.10", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q=="], + "@radix-ui/react-arrow/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-collapsible/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-collection/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-dismissable-layer/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-focus-scope/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-popover/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-popper/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-portal/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-presence/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-primitive/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-roving-focus/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-toggle/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-toggle-group/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-tooltip/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + + "@radix-ui/react-visually-hidden/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "@scalar/types/nanoid": ["nanoid@5.1.16", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ=="], @@ -6445,9 +6601,9 @@ "@shikijs/themes/@shikijs/types": ["@shikijs/types@4.2.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-VT/MKtlpOhEPZloSH3Pb9WCZEBDoQVMa9jedp5UAwmJOar1DVc9DRODAxmYPW9M93IK4ryuqRejFfmlvlVDemw=="], - "@shikijs/twoslash/@shikijs/core": ["@shikijs/core@4.3.1", "", { "dependencies": { "@shikijs/primitive": "4.3.1", "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA=="], + "@shikijs/twoslash/@shikijs/core": ["@shikijs/core@4.4.2", "", { "dependencies": { "@shikijs/primitive": "4.4.2", "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-StyzbAyxg2/tBGf78gwbBkGyeQ73lf8UiJArFaQhTQIDqQOCKPCQFanvrs4/Yv3Yfyc+ONInJM6K+FMIf+P+kA=="], - "@shikijs/twoslash/@shikijs/types": ["@shikijs/types@4.3.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g=="], + "@shikijs/twoslash/@shikijs/types": ["@shikijs/types@4.4.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-PFYitV4vpDr/iPCIhnHp+Q4ftic5N5VeNJ3KQ1O8gn3h2ar8qgwMAXF7tq4m1CWaMS60fV4VqF6vfnWH4F7vqQ=="], "@slack/bolt/express": ["express@4.22.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q=="], @@ -6471,6 +6627,8 @@ "@slack/web-api/p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], + "@solidjs/start/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + "@solidjs/start/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], "@solidjs/start/shiki": ["shiki@1.29.2", "", { "dependencies": { "@shikijs/core": "1.29.2", "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/langs": "1.29.2", "@shikijs/themes": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg=="], @@ -6479,8 +6637,6 @@ "@storybook/addon-docs/react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], - "@storybook/addon-docs/react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], - "@storybook/csf-plugin/unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], @@ -6507,13 +6663,11 @@ "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], - "@types/serve-static/@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], - "@vercel/cli-config/zod": ["zod@4.1.11", "", {}, "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg=="], - "@vercel/functions/@vercel/oidc": ["@vercel/oidc@3.8.1", "", { "dependencies": { "@vercel/cli-config": "0.2.1", "@vercel/cli-exec": "1.0.0", "jose": "^5.9.6" } }, "sha512-ufdalm2MWOYksyj8KVpWjoOFPJO6zoYpuyvIggIQ2bB0CFCjTCiTkGXHqAKwG77GVRjOaN3/8S5ITlZpXWmqOw=="], + "@vercel/functions/@vercel/oidc": ["@vercel/oidc@3.8.2", "", { "dependencies": { "@vercel/cli-config": "0.2.2", "@vercel/cli-exec": "1.0.1", "jose": "^5.9.6" } }, "sha512-nmVSeQ7tewCkqYBNB/MNL8aPB9sTvtjvqIE6+U17U4IuTyehuWVERDlWrSn0DVfiFAstRlRkGLHBlKHB2FyzbQ=="], - "@vercel/nft/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + "@vercel/nft/acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "@vercel/nft/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], @@ -6523,15 +6677,19 @@ "@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], - "@vitest/expect/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], - "@vitest/expect/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], - "@vitest/mocker/@vitest/spy": ["@vitest/spy@4.1.10", "", {}, "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw=="], + "@vitest/pretty-format/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "@vitest/utils/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], "@vscode/emmet-helper/jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="], - "@vscode/emmet-helper/vscode-languageserver-types": ["vscode-languageserver-types@3.18.0", "", {}, "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g=="], + "ai/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.127", "", { "dependencies": { "@ai-sdk/provider": "2.0.3", "@ai-sdk/provider-utils": "3.0.31", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-SiD2kyR2J4fEY0FTXYpNznwWN90ohrwzAMi2laZCGkI/lL8DmyJ31zFzMYJvzRusp2IQYmvkYQWOpZpBl01xYw=="], + + "ai/@ai-sdk/provider": ["@ai-sdk/provider@2.0.3", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww=="], + + "ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.31", "", { "dependencies": { "@ai-sdk/provider": "2.0.3", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6", "undici": "^5.29.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-hlxLxqbdV+f7gBpL2SbLL+UhjV+DfUpJ28J4vSHekVV9fiTRrhqcd/ewJwaVbR/ahtLCGJPAVYzj+yJzaddc6g=="], "ai-gateway-provider/@ai-sdk/openai": ["@ai-sdk/openai@3.0.84", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.38" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cmgbeJL0bbY0yTJH4/AdmP5E7MjWRL9G8UdhIi0JlV/So03o82ORJofW8OzwCZPTORVQblFbpZXYGDcUd9NdUQ=="], @@ -6545,7 +6703,7 @@ "app-builder-lib/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - "app-builder-lib/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "app-builder-lib/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "app-builder-lib/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], @@ -6561,10 +6719,14 @@ "astro/diff": ["diff@5.2.2", "", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="], - "astro/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "astro/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "astro/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "astro/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], + "astro/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "astro/unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], "astro/vite": ["vite@6.4.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A=="], @@ -6577,32 +6739,26 @@ "babel-plugin-module-resolver/glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], - "blume/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="], - - "blume/@astrojs/mdx": ["@astrojs/mdx@7.0.3", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@astrojs/markdown-remark": "7.2.1", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.16.0", "es-module-lexer": "^2.0.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@astrojs/markdown-satteri": "^0.3.1", "astro": "^7.0.0" }, "optionalPeers": ["@astrojs/markdown-satteri"] }, "sha512-RxyIwU0uFam5ftwqKOjpIdhnFxZ/kEikeimLyQy3eGXbHT8WgRGzzesOIHVU8+m9TY8ag5WVOyvV24/GyqPdPQ=="], + "blume/@astrojs/mdx": ["@astrojs/mdx@7.0.5", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.2", "@astrojs/markdown-remark": "7.2.2", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.16.0", "es-module-lexer": "^2.0.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@astrojs/markdown-satteri": "^0.3.1", "astro": "^7.0.0" }, "optionalPeers": ["@astrojs/markdown-satteri"] }, "sha512-wEM/HH1RiEntyPVagdiF+yArzfcYLKBB0C1RZspVidKZ97rRMbaqP1Nbl/GR0sJs8zwaceqxRymw8aOKKJRdYw=="], "blume/@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="], - "blume/@pierre/diffs": ["@pierre/diffs@1.2.12", "", { "dependencies": { "@pierre/theme": "1.1.0", "@pierre/theming": "0.0.2", "@shikijs/transformers": "^3.0.0 || ^4.0.0", "diff": "9.0.0", "hast-util-to-html": "9.0.5", "lru_map": "0.4.1", "shiki": "^3.0.0 || ^4.0.0" }, "peerDependencies": { "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0" } }, "sha512-pY/gmgWL03WnagqCyCnBi3QtRXUv4hCIY6FYqd5b1ZGaoI6a4Bsji8j+yRl2RfzPh/8Hf19rCl1GE80G6a1cLQ=="], + "blume/@pierre/diffs": ["@pierre/diffs@1.3.5", "", { "dependencies": { "@pierre/theme": "2.0.0", "@pierre/theming": "1.0.1", "@shikijs/transformers": "^3.0.0 || ^4.0.0", "diff": "9.0.0", "hast-util-to-html": "9.0.5", "lru_map": "0.4.1", "shiki": "^3.0.0 || ^4.0.0" }, "peerDependencies": { "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0" } }, "sha512-BhaLEiUvR+BdIyOYdogA4JLQjluWPubuwySmmIqEkcE0FwIWRbgJgHNC/r884dlxEr89fO4hTk/sBln0a7NSOw=="], - "blume/@shikijs/transformers": ["@shikijs/transformers@4.3.1", "", { "dependencies": { "@shikijs/core": "4.3.1", "@shikijs/types": "4.3.1" } }, "sha512-z6ir0bGDgWcF2FduktEfPgIsdOtIlDiLAjFBgBzE42Q9xHbkkIXZtORHzlLVB71iZP9elEcqKg6keajvOUwE2A=="], - - "blume/ai": ["ai@5.0.220", "", { "dependencies": { "@ai-sdk/gateway": "2.0.119", "@ai-sdk/provider": "2.0.3", "@ai-sdk/provider-utils": "3.0.30", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8v7IFO+OMjVJeprLSNemO9GnDMBcoslid1SlxzhxlqPLnFS6o2uI+V5enEYZ3L0rLcu5aXeNilqP8VMccgyq6A=="], + "blume/@shikijs/transformers": ["@shikijs/transformers@4.4.2", "", { "dependencies": { "@shikijs/core": "4.4.2", "@shikijs/types": "4.4.2" } }, "sha512-d81PJ9KkR1tVP95FH/9296HTtDo0mh76wv10u9T1YmsZq/UcXgt0OLdBszfUQ1i+umkRMCjDnFbFZU7/tCODTQ=="], "blume/astro": ["astro@7.1.3", "", { "dependencies": { "@astrojs/compiler-rs": "^0.3.1", "@astrojs/internal-helpers": "0.10.1", "@astrojs/markdown-satteri": "0.3.4", "@astrojs/telemetry": "3.3.3", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "am-i-vibing": "^0.4.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "ci-info": "^4.4.0", "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", "cookie": "^2.0.1", "devalue": "^5.8.1", "diff": "^8.0.3", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", "esbuild": "^0.28.0", "flattie": "^1.1.1", "fontace": "~0.4.1", "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "js-yaml": "^4.1.1", "jsonc-parser": "^3.3.1", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mrmime": "^2.0.1", "neotraverse": "^1.0.1", "obug": "^2.1.1", "p-limit": "^7.3.0", "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.4", "semver": "^7.7.4", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "svgo": "^4.0.1", "tinyclip": "^0.1.12", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "ultrahtml": "^1.6.0", "unifont": "~0.7.4", "unstorage": "^1.17.5", "vite": "^8.0.13", "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", "zod": "^4.3.6" }, "optionalDependencies": { "sharp": "^0.34.0 || ^0.35.0" }, "peerDependencies": { "@astrojs/markdown-remark": "7.2.1" }, "optionalPeers": ["@astrojs/markdown-remark"], "bin": { "astro": "./bin/astro.mjs" } }, "sha512-4dhPyAAXthf3xLEYnG8SeL7yr/nTPPABfY7e9YF0yuO+vK9Xp+8Q5j4xzsmL3GueukQv4oNwGNTBepLOiDGeJA=="], - "blume/dompurify": ["dompurify@3.4.12", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg=="], + "blume/dompurify": ["dompurify@3.4.13", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ=="], - "blume/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "blume/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "blume/katex": ["katex@0.17.0", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-Vdw0ATsQ9V+LuegM/BTwQqV/6cTl5lbGcIrU+BCgLxyf6bo38ybOr372tuSIxir3CN720flu1meYR6XzNMwQnw=="], - "blume/node-html-parser": ["node-html-parser@9.0.0", "", { "dependencies": { "css-select": "^5.1.0", "entities": "^8.0.0" } }, "sha512-MhdaHPyxnyYu/sf0TpiRvDnTrkum0UKHC7FdbDGIUQNlx3I7xzwXoyV0eMUMv/XU+lkJT1glOUzpDPq7b2p1Ew=="], + "blume/node-html-parser": ["node-html-parser@9.0.1", "", { "dependencies": { "css-select": "^5.1.0", "entities": "^8.0.0" } }, "sha512-QrdiYYm1NnLRXsMXThUgVcF/syWfWIgHFmy8hylWMGFbHFtnRuXLBxxGQvIm3xaIJMUDJ0ayOmT/FGJYT3pZIw=="], "blume/react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], - "blume/react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], - "blume/typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], "blume/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -6611,9 +6767,7 @@ "builder-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "builder-util/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], - - "cbor-extract/node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.1.1", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-test": "build-test.js", "node-gyp-build-optional-packages-optional": "optional.js" } }, "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw=="], + "builder-util/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -6649,7 +6803,7 @@ "dir-compare/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - "dmg-builder/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "dmg-builder/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], @@ -6669,12 +6823,14 @@ "electron-store/type-fest": ["type-fest@5.8.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA=="], - "electron-updater/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "electron-updater/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "electron-updater/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], "electron-winstaller/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + "engine.io-client/ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], + "epub-gen-memory/css-select": ["css-select@4.3.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ=="], "epub-gen-memory/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], @@ -6687,7 +6843,7 @@ "epub-gen-memory/mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], - "esast-util-from-js/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + "esast-util-from-js/acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "esbuild-plugin-copy/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -6705,10 +6861,22 @@ "fetch-blob/web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + "ffi-rs/@yuuang/ffi-rs-darwin-arm64": ["@yuuang/ffi-rs-darwin-arm64@1.3.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-OueBlUFBT9IwD9pQnoYs0UszRBEySskfrEPXXfvKfGjL/DXnfn6kUheQ3oIP6sSmshVGNQUwrTCPo6feAa4QjA=="], + + "ffi-rs/@yuuang/ffi-rs-linux-arm64-gnu": ["@yuuang/ffi-rs-linux-arm64-gnu@1.3.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-nrW4MlFlyQInfxTsI5wtcIpbV4KlHLWo2BCk4CHIETlUT+PUspNFqDg+Byy7My3hpCZlXp0WsMVP/3N0LlybNw=="], + + "ffi-rs/@yuuang/ffi-rs-linux-x64-gnu": ["@yuuang/ffi-rs-linux-x64-gnu@1.3.7", "", { "os": "linux", "cpu": "x64" }, "sha512-upEz1Q98T51x2In872fsjgHCJbE3e8r9JxhJD+5NvSMk6BpieYWRodTbsMxV6oKWmfl12loKwF2j4OBSWKl0lA=="], + + "ffi-rs/@yuuang/ffi-rs-win32-arm64-msvc": ["@yuuang/ffi-rs-win32-arm64-msvc@1.3.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-ZfYzLV1w7Mhzh9XRScEMpw9oazIEiwO+0+TYHHRL882d5oD0Q99YikmRhdifsoHCCQefKmWF/4BXCeFkzg8NFA=="], + + "ffi-rs/@yuuang/ffi-rs-win32-x64-msvc": ["@yuuang/ffi-rs-win32-x64-msvc@1.3.7", "", { "os": "win32", "cpu": "x64" }, "sha512-H3s4wOLtZtKtmuPjUNE+bhnSKxxpXcuxG70jRC8dUMHqIm5iCvdoZ4XYDeq7/uUYlySerXFmRL4dAVCX/TUNTg=="], + "filelist/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "framer-motion/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="], + "fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], "gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], @@ -6741,13 +6909,13 @@ "md-to-react-email/marked": ["marked@7.0.4", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ=="], - "mermaid/dompurify": ["dompurify@3.4.12", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg=="], + "mermaid/dompurify": ["dompurify@3.4.13", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ=="], "mermaid/katex": ["katex@0.16.47", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg=="], "mermaid/marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="], - "micromark-extension-mdxjs/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + "micromark-extension-mdxjs/acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], @@ -6763,9 +6931,7 @@ "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "modal/uuid": ["uuid@11.1.1", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ=="], - - "motion/framer-motion": ["framer-motion@12.42.2", "", { "dependencies": { "motion-dom": "^12.42.2", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw=="], + "motion/framer-motion": ["framer-motion@12.43.0", "", { "dependencies": { "motion-dom": "^12.43.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g=="], "nitro/h3": ["h3@2.0.1-rc.5", "", { "dependencies": { "rou3": "^0.7.9", "srvx": "^0.9.1" }, "peerDependencies": { "crossws": "^0.4.1" }, "optionalPeers": ["crossws"] }, "sha512-qkohAzCab0nLzXNm78tBjZDvtKMTmtygS8BJLT3VPczAQofdqlFXDPkXdLMJN4r05+xqneG8snZJ0HgkERCZTg=="], @@ -6817,6 +6983,8 @@ "proper-lockfile/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "react-dom/react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], + "readdir-glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], "rimraf/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], @@ -6843,16 +7011,24 @@ "sst/jose": ["jose@5.2.3", "", {}, "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA=="], + "storybook/@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + + "storybook/@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + "storybook/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], "storybook/open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], + "storybook/ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], @@ -6861,11 +7037,11 @@ "temp/rimraf": ["rimraf@2.6.3", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="], - "terser/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + "terser/acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "tiny-async-pool/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], - "tree-sitter-bash/node-addon-api": ["node-addon-api@8.9.0", "", {}, "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q=="], + "tree-sitter-bash/node-addon-api": ["node-addon-api@8.9.1", "", {}, "sha512-4eUQWVPCUUUiBjLnHS3cXWeC6ryoPUc0U3rP7IuzapoGbzMqd/r6KKO0clr0b+snQhsrueFEhCZDdK+LK7hxKg=="], "tw-to-css/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], @@ -6883,23 +7059,35 @@ "unzipper/fs-extra": ["fs-extra@11.3.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g=="], - "venice-ai-sdk-provider/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.56", "", { "dependencies": { "@ai-sdk/provider": "3.0.13", "@ai-sdk/provider-utils": "4.0.35" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cQrN6OUn/jvsY3OdsU6Wn+ss7vp1iwIcakZKSlSRMnYqShBfyT7Qht+eqmgxs7w9ttrw6FAG6o11AiBs+iEsTA=="], + "venice-ai-sdk-provider/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.64", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.42" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-oMh5/bhu2ibsXqzHeLbJ+9Y7UQdOSrfOLPI+UA1vEcqXGYVBQfWxLe5jBUpsaL8GBBj/nmSeYGX6QPan8RfHiQ=="], "venice-ai-sdk-provider/@ai-sdk/provider": ["@ai-sdk/provider@3.0.14", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA=="], "venice-ai-sdk-provider/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.40", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw=="], + "vite-node/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "vite-plugin-dynamic-import/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + "vite-plugin-icons-spritesheet/glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="], + "vite-plugin-icons-spritesheet/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "vitest/@vitest/expect": ["@vitest/expect@4.1.10", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA=="], + "vitest/@vitest/mocker": ["@vitest/mocker@4.1.10", "", { "dependencies": { "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow=="], + + "vitest/@vitest/pretty-format": ["@vitest/pretty-format@4.1.10", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q=="], + + "vitest/@vitest/runner": ["@vitest/runner@4.1.10", "", { "dependencies": { "@vitest/utils": "4.1.10", "pathe": "^2.0.3" } }, "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg=="], + + "vitest/@vitest/snapshot": ["@vitest/snapshot@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "@vitest/utils": "4.1.10", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw=="], + "vitest/@vitest/spy": ["@vitest/spy@4.1.10", "", {}, "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw=="], - "vitest/es-module-lexer": ["es-module-lexer@2.3.1", "", {}, "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="], + "vitest/@vitest/utils": ["@vitest/utils@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA=="], - "vitest/tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], - - "vitest/vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="], + "vitest/vite": ["vite@8.2.1", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.25", "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw=="], "vscode-json-languageservice/vscode-languageserver-types": ["vscode-languageserver-types@3.18.0", "", {}, "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g=="], @@ -6921,8 +7109,6 @@ "yaml-language-server/request-light": ["request-light@0.5.8", "", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="], - "yaml-language-server/vscode-languageserver-types": ["vscode-languageserver-types@3.18.0", "", {}, "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g=="], - "yaml-language-server/yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -6935,6 +7121,14 @@ "@actions/github/@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@12.6.0", "", { "dependencies": { "@octokit/openapi-types": "^20.0.0" } }, "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw=="], + "@ai-sdk/deepgram/@ai-sdk/provider-utils/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + + "@ai-sdk/elevenlabs/@ai-sdk/provider-utils/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + + "@ai-sdk/fireworks/@ai-sdk/provider-utils/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + + "@ai-sdk/xai/@ai-sdk/provider-utils/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + "@astrojs/cloudflare/wrangler/@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.5.0", "", {}, "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg=="], "@astrojs/cloudflare/wrangler/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.1", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": ">1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw=="], @@ -6959,17 +7153,19 @@ "@astrojs/markdown-remark/shiki/@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="], - "@astrojs/markdown-satteri/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@astrojs/markdown-satteri/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "@astrojs/mdx/@astrojs/markdown-remark/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.6", "", {}, "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q=="], "@astrojs/mdx/@astrojs/markdown-remark/@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="], - "@astrojs/mdx/@astrojs/markdown-remark/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@astrojs/mdx/@astrojs/markdown-remark/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "@astrojs/mdx/@astrojs/markdown-remark/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], - "@astrojs/node/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@astrojs/node/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], + + "@astrojs/node/astro/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], "@astrojs/node/astro/@astrojs/telemetry": ["@astrojs/telemetry@3.3.3", "", { "dependencies": { "ci-info": "^4.4.0", "dset": "^3.1.4", "is-docker": "^4.0.0", "package-manager-detector": "^1.6.0" } }, "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ=="], @@ -6981,17 +7177,15 @@ "@astrojs/node/astro/diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], - "@astrojs/node/astro/es-module-lexer": ["es-module-lexer@2.3.1", "", {}, "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="], - "@astrojs/node/astro/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], "@astrojs/node/astro/fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], "@astrojs/node/astro/get-tsconfig": ["get-tsconfig@5.0.0-beta.4", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ=="], - "@astrojs/node/astro/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@astrojs/node/astro/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], - "@astrojs/node/astro/magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="], + "@astrojs/node/astro/magicast": ["magicast@0.5.4", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w=="], "@astrojs/node/astro/neotraverse": ["neotraverse@1.0.1", "", {}, "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w=="], @@ -7001,19 +7195,17 @@ "@astrojs/node/astro/sharp": ["sharp@0.35.3", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.3", "@img/sharp-darwin-x64": "0.35.3", "@img/sharp-freebsd-wasm32": "0.35.3", "@img/sharp-libvips-darwin-arm64": "1.3.2", "@img/sharp-libvips-darwin-x64": "1.3.2", "@img/sharp-libvips-linux-arm": "1.3.2", "@img/sharp-libvips-linux-arm64": "1.3.2", "@img/sharp-libvips-linux-ppc64": "1.3.2", "@img/sharp-libvips-linux-riscv64": "1.3.2", "@img/sharp-libvips-linux-s390x": "1.3.2", "@img/sharp-libvips-linux-x64": "1.3.2", "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", "@img/sharp-libvips-linuxmusl-x64": "1.3.2", "@img/sharp-linux-arm": "0.35.3", "@img/sharp-linux-arm64": "0.35.3", "@img/sharp-linux-ppc64": "0.35.3", "@img/sharp-linux-riscv64": "0.35.3", "@img/sharp-linux-s390x": "0.35.3", "@img/sharp-linux-x64": "0.35.3", "@img/sharp-linuxmusl-arm64": "0.35.3", "@img/sharp-linuxmusl-x64": "0.35.3", "@img/sharp-webcontainers-wasm32": "0.35.3", "@img/sharp-win32-arm64": "0.35.3", "@img/sharp-win32-ia32": "0.35.3", "@img/sharp-win32-x64": "0.35.3" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q=="], - "@astrojs/node/astro/tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], - "@astrojs/node/astro/unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="], "@astrojs/node/astro/unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], - "@astrojs/node/astro/vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="], + "@astrojs/node/astro/vite": ["vite@8.2.1", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.25", "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw=="], "@astrojs/node/astro/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], "@astrojs/node/astro/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], - "@astrojs/react/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@astrojs/react/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "@astrojs/react/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], @@ -7025,7 +7217,9 @@ "@astrojs/starlight/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "@astrojs/vercel/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@astrojs/vercel/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], + + "@astrojs/vercel/astro/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], "@astrojs/vercel/astro/@astrojs/telemetry": ["@astrojs/telemetry@3.3.3", "", { "dependencies": { "ci-info": "^4.4.0", "dset": "^3.1.4", "is-docker": "^4.0.0", "package-manager-detector": "^1.6.0" } }, "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ=="], @@ -7037,15 +7231,13 @@ "@astrojs/vercel/astro/diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], - "@astrojs/vercel/astro/es-module-lexer": ["es-module-lexer@2.3.1", "", {}, "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="], - "@astrojs/vercel/astro/fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], "@astrojs/vercel/astro/get-tsconfig": ["get-tsconfig@5.0.0-beta.4", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ=="], - "@astrojs/vercel/astro/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@astrojs/vercel/astro/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], - "@astrojs/vercel/astro/magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="], + "@astrojs/vercel/astro/magicast": ["magicast@0.5.4", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w=="], "@astrojs/vercel/astro/neotraverse": ["neotraverse@1.0.1", "", {}, "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w=="], @@ -7055,13 +7247,11 @@ "@astrojs/vercel/astro/sharp": ["sharp@0.35.3", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.3", "@img/sharp-darwin-x64": "0.35.3", "@img/sharp-freebsd-wasm32": "0.35.3", "@img/sharp-libvips-darwin-arm64": "1.3.2", "@img/sharp-libvips-darwin-x64": "1.3.2", "@img/sharp-libvips-linux-arm": "1.3.2", "@img/sharp-libvips-linux-arm64": "1.3.2", "@img/sharp-libvips-linux-ppc64": "1.3.2", "@img/sharp-libvips-linux-riscv64": "1.3.2", "@img/sharp-libvips-linux-s390x": "1.3.2", "@img/sharp-libvips-linux-x64": "1.3.2", "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", "@img/sharp-libvips-linuxmusl-x64": "1.3.2", "@img/sharp-linux-arm": "0.35.3", "@img/sharp-linux-arm64": "0.35.3", "@img/sharp-linux-ppc64": "0.35.3", "@img/sharp-linux-riscv64": "0.35.3", "@img/sharp-linux-s390x": "0.35.3", "@img/sharp-linux-x64": "0.35.3", "@img/sharp-linuxmusl-arm64": "0.35.3", "@img/sharp-linuxmusl-x64": "0.35.3", "@img/sharp-webcontainers-wasm32": "0.35.3", "@img/sharp-win32-arm64": "0.35.3", "@img/sharp-win32-ia32": "0.35.3", "@img/sharp-win32-x64": "0.35.3" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q=="], - "@astrojs/vercel/astro/tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], - "@astrojs/vercel/astro/unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="], "@astrojs/vercel/astro/unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], - "@astrojs/vercel/astro/vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="], + "@astrojs/vercel/astro/vite": ["vite@8.2.1", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.25", "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw=="], "@astrojs/vercel/astro/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], @@ -7197,7 +7387,75 @@ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "@electron/asar/minimatch/brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], + "@bruits/satteri-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.0", "", { "os": "android", "cpu": "arm" }, "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.0", "", { "os": "android", "cpu": "arm64" }, "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.0", "", { "os": "android", "cpu": "x64" }, "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.0", "", { "os": "none", "cpu": "x64" }, "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ=="], + + "@cloudflare/vitest-pool-workers/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.0", "", { "os": "win32", "cpu": "x64" }, "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + + "@cloudflare/vitest-pool-workers/miniflare/undici": ["undici@7.18.2", "", {}, "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw=="], + + "@cloudflare/vitest-pool-workers/miniflare/workerd": ["workerd@1.20260120.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260120.0", "@cloudflare/workerd-darwin-arm64": "1.20260120.0", "@cloudflare/workerd-linux-64": "1.20260120.0", "@cloudflare/workerd-linux-arm64": "1.20260120.0", "@cloudflare/workerd-windows-64": "1.20260120.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-R6X/VQOkwLTBGLp4VRUwLQZZVxZ9T9J8pGiJ6GQUMaRkY7TVWrCSkVfoNMM1/YyFsY5UYhhPoQe5IehnhZ3Pdw=="], + + "@cloudflare/vitest-pool-workers/miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "@cloudflare/vitest-pool-workers/wrangler/@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.2", "", {}, "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ=="], + + "@cloudflare/vitest-pool-workers/wrangler/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.11.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20260115.0" }, "optionalPeers": ["workerd"] }, "sha512-z3hxFajL765VniNPGV0JRStZolNz63gU3B3AktwoGdDlnQvz5nP+Ah4RL04PONlZQjwmDdGHowEStJ94+RsaJg=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd": ["workerd@1.20260120.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260120.0", "@cloudflare/workerd-darwin-arm64": "1.20260120.0", "@cloudflare/workerd-linux-64": "1.20260120.0", "@cloudflare/workerd-linux-arm64": "1.20260120.0", "@cloudflare/workerd-windows-64": "1.20260120.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-R6X/VQOkwLTBGLp4VRUwLQZZVxZ9T9J8pGiJ6GQUMaRkY7TVWrCSkVfoNMM1/YyFsY5UYhhPoQe5IehnhZ3Pdw=="], + + "@electron/asar/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], "@electron/fuses/fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], @@ -7205,7 +7463,7 @@ "@electron/universal/fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], - "@electron/universal/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], + "@electron/universal/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "@electron/windows-sign/fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], @@ -7271,6 +7529,8 @@ "@jsx-email/cli/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="], + "@jsx-email/cli/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + "@jsx-email/cli/tailwindcss/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], "@jsx-email/cli/tailwindcss/glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -7285,41 +7545,43 @@ "@jsx-email/doiuse-email/htmlparser2/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "@jsx-email/tailwind/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + "@malept/flatpak-bundler/fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], "@mapbox/node-pre-gyp/nopt/abbrev": ["abbrev@3.0.1", "", {}, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], - "@octokit/auth-app/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="], + "@octokit/auth-app/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.4", "", { "dependencies": { "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA=="], - "@octokit/auth-app/@octokit/request/@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@octokit/auth-app/@octokit/request/@octokit/types": ["@octokit/types@17.0.0", "", { "dependencies": { "@octokit/openapi-types": "^28.0.0" } }, "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="], "@octokit/auth-app/@octokit/request/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], - "@octokit/auth-app/@octokit/request-error/@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@octokit/auth-app/@octokit/request-error/@octokit/types": ["@octokit/types@17.0.0", "", { "dependencies": { "@octokit/openapi-types": "^28.0.0" } }, "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="], - "@octokit/auth-oauth-app/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="], + "@octokit/auth-oauth-app/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.4", "", { "dependencies": { "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA=="], - "@octokit/auth-oauth-app/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.0", "", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="], + "@octokit/auth-oauth-app/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.1", "", { "dependencies": { "@octokit/types": "^17.0.0" } }, "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA=="], "@octokit/auth-oauth-app/@octokit/request/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], - "@octokit/auth-oauth-app/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@octokit/auth-oauth-app/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@28.0.0", "", {}, "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="], - "@octokit/auth-oauth-device/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="], + "@octokit/auth-oauth-device/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.4", "", { "dependencies": { "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA=="], - "@octokit/auth-oauth-device/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.0", "", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="], + "@octokit/auth-oauth-device/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.1", "", { "dependencies": { "@octokit/types": "^17.0.0" } }, "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA=="], "@octokit/auth-oauth-device/@octokit/request/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], - "@octokit/auth-oauth-device/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@octokit/auth-oauth-device/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@28.0.0", "", {}, "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="], - "@octokit/auth-oauth-user/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="], + "@octokit/auth-oauth-user/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.4", "", { "dependencies": { "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA=="], - "@octokit/auth-oauth-user/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.0", "", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="], + "@octokit/auth-oauth-user/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.1", "", { "dependencies": { "@octokit/types": "^17.0.0" } }, "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA=="], "@octokit/auth-oauth-user/@octokit/request/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], - "@octokit/auth-oauth-user/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@octokit/auth-oauth-user/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@28.0.0", "", {}, "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="], "@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="], @@ -7327,21 +7589,21 @@ "@octokit/graphql/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="], - "@octokit/oauth-methods/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="], + "@octokit/oauth-methods/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.4", "", { "dependencies": { "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA=="], "@octokit/oauth-methods/@octokit/request/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], - "@octokit/oauth-methods/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@octokit/oauth-methods/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@28.0.0", "", {}, "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="], "@octokit/plugin-paginate-rest/@octokit/core/@octokit/auth-token": ["@octokit/auth-token@6.0.0", "", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="], - "@octokit/plugin-paginate-rest/@octokit/core/@octokit/graphql": ["@octokit/graphql@9.0.3", "", { "dependencies": { "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA=="], + "@octokit/plugin-paginate-rest/@octokit/core/@octokit/graphql": ["@octokit/graphql@9.0.4", "", { "dependencies": { "@octokit/request": "^10.0.13", "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg=="], - "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request": ["@octokit/request@10.0.11", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q=="], + "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request": ["@octokit/request@10.0.13", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A=="], - "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request-error": ["@octokit/request-error@7.1.0", "", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="], + "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request-error": ["@octokit/request-error@7.1.1", "", { "dependencies": { "@octokit/types": "^17.0.0" } }, "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA=="], - "@octokit/plugin-paginate-rest/@octokit/core/@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@octokit/plugin-paginate-rest/@octokit/core/@octokit/types": ["@octokit/types@17.0.0", "", { "dependencies": { "@octokit/openapi-types": "^28.0.0" } }, "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="], "@octokit/plugin-paginate-rest/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], @@ -7349,13 +7611,13 @@ "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/auth-token": ["@octokit/auth-token@6.0.0", "", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="], - "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/graphql": ["@octokit/graphql@9.0.3", "", { "dependencies": { "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA=="], + "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/graphql": ["@octokit/graphql@9.0.4", "", { "dependencies": { "@octokit/request": "^10.0.13", "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg=="], - "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request": ["@octokit/request@10.0.11", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q=="], + "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request": ["@octokit/request@10.0.13", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A=="], - "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request-error": ["@octokit/request-error@7.1.0", "", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="], + "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request-error": ["@octokit/request-error@7.1.1", "", { "dependencies": { "@octokit/types": "^17.0.0" } }, "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA=="], - "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/types": ["@octokit/types@17.0.0", "", { "dependencies": { "@octokit/openapi-types": "^28.0.0" } }, "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="], "@octokit/plugin-rest-endpoint-methods/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], @@ -7369,13 +7631,13 @@ "@octokit/rest/@octokit/core/@octokit/auth-token": ["@octokit/auth-token@6.0.0", "", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="], - "@octokit/rest/@octokit/core/@octokit/graphql": ["@octokit/graphql@9.0.3", "", { "dependencies": { "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA=="], + "@octokit/rest/@octokit/core/@octokit/graphql": ["@octokit/graphql@9.0.4", "", { "dependencies": { "@octokit/request": "^10.0.13", "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg=="], - "@octokit/rest/@octokit/core/@octokit/request": ["@octokit/request@10.0.11", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q=="], + "@octokit/rest/@octokit/core/@octokit/request": ["@octokit/request@10.0.13", "", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.1.1", "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A=="], - "@octokit/rest/@octokit/core/@octokit/request-error": ["@octokit/request-error@7.1.0", "", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="], + "@octokit/rest/@octokit/core/@octokit/request-error": ["@octokit/request-error@7.1.1", "", { "dependencies": { "@octokit/types": "^17.0.0" } }, "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA=="], - "@octokit/rest/@octokit/core/@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@octokit/rest/@octokit/core/@octokit/types": ["@octokit/types@17.0.0", "", { "dependencies": { "@octokit/openapi-types": "^28.0.0" } }, "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="], "@octokit/rest/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], @@ -7383,6 +7645,18 @@ "@opencode-ai/desktop/@actions/artifact/@actions/http-client": ["@actions/http-client@2.2.3", "", { "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA=="], + "@opencode-ai/lab-catalog/wrangler/@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.5.0", "", {}, "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg=="], + + "@opencode-ai/lab-catalog/wrangler/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.1", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": ">1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare": ["miniflare@4.20260708.1", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "0.34.5", "undici": "7.28.0", "workerd": "1.20260708.1", "ws": "8.21.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-c94O9zRDISdqO18EHt6l0iF/fWgWt8p18PJvRsA/L/NJZ9Cfke3s/F5Blg1XXF7WDutVRzWVWy8Vy4LaT5ifsA=="], + + "@opencode-ai/lab-catalog/wrangler/workerd": ["workerd@1.20260708.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260708.1", "@cloudflare/workerd-darwin-arm64": "1.20260708.1", "@cloudflare/workerd-linux-64": "1.20260708.1", "@cloudflare/workerd-linux-arm64": "1.20260708.1", "@cloudflare/workerd-windows-64": "1.20260708.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-WAK+Kt/VVCSldH2qSr8lx46XCJ4Q+bdlHNaFqUtOHthBEIB8C1N8HVW+VOLrxDoTCk0NGNv0zajnBeQK4JOB9w=="], + + "@opencode-ai/storybook/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + "@opencode-ai/updates/wrangler/@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.5.0", "", {}, "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg=="], "@opencode-ai/updates/wrangler/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.1", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": ">1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw=="], @@ -7397,13 +7671,29 @@ "@opencode-ai/web/@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.20.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="], + "@opencode-ai/workerd-spike/vitest/std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], + + "@opencode-ai/workerd-spike/vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + + "@opencode-ai/workerd-spike/vitest/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "@opencode-ai/workerd-spike/wrangler/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.6.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.19", "workerd": "^1.20250802.0" }, "optionalPeers": ["workerd"] }, "sha512-h7Txw0WbDuUbrvZwky6+x7ft+U/Gppfn/rWx6IdR+e9gjygozRJnV26Y2TOr3yrIFa6OsZqqR2lN+jWTrakHXg=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], + + "@opencode-ai/workerd-spike/wrangler/miniflare": ["miniflare@4.20250803.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "^7.10.0", "workerd": "1.20250803.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-1tmCLfmMw0SqRBF9PPII9CVLQRzOrO7uIBmSng8BMSmtgs2kos7OeoM0sg6KbR9FrvP/zAniLyZuCAMAjuu4fQ=="], + + "@opencode-ai/workerd-spike/wrangler/unenv": ["unenv@2.0.0-rc.19", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.7", "ohash": "^2.0.11", "pathe": "^2.0.3", "ufo": "^1.6.1" } }, "sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA=="], + + "@opencode-ai/workerd-spike/wrangler/workerd": ["workerd@1.20250803.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250803.0", "@cloudflare/workerd-darwin-arm64": "1.20250803.0", "@cloudflare/workerd-linux-64": "1.20250803.0", "@cloudflare/workerd-linux-arm64": "1.20250803.0", "@cloudflare/workerd-windows-64": "1.20250803.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-oYH29mE/wNolPc32NHHQbySaNorj6+KASUtOvQHySxB5mO1NWdGuNv49woxNCF5971UYceGQndY+OLT+24C3wQ=="], + "@opencode-ai/www/@astrojs/cloudflare/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], "@opencode-ai/www/@astrojs/cloudflare/@astrojs/underscore-redirects": ["@astrojs/underscore-redirects@1.0.3", "", {}, "sha512-cxnGSw+sJigBLdX4TMSZKkzV6C3gMLJMucDk2W+n281Xhie68T2/9f1+1NMNDCZsc5i0FED7Qt5I10g2O9wtZg=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.47.0", "", { "dependencies": { "@cloudflare/unenv-preset": "2.16.1", "miniflare": "4.20260722.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260722.1", "wrangler": "4.114.0", "ws": "8.21.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0 || ^8.0.0" }, "bin": { "cf-vite": "bin/cf-vite" } }, "sha512-WyGNYtJ2nzcJXtlwCHTO5S5+flFaYhfH5WfFfx6IpGf2Y/oNwyizEW9mNSImpg65PWmDs1715Pk/vGSKKtYJ1w=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.51.1", "", { "dependencies": { "@cloudflare/unenv-preset": "2.16.1", "miniflare": "5.20260801.1-alpha", "unenv": "2.0.0-rc.24", "workerd": "1.20260801.1", "wrangler": "4.120.0", "ws": "8.21.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0 || ^8.0.0" }, "bin": { "cf-vite": "bin/cf-vite" } }, "sha512-qVTv67W3yLPIVZcq3L7z6yoqNGYA6W9PzDwHMGeku7gNhimNj+Bf84A8ukLdfz2EpVkzLam4pPbqoQYY8bawJA=="], - "@opencode-ai/www/@astrojs/cloudflare/vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="], + "@opencode-ai/www/@astrojs/cloudflare/vite": ["vite@8.2.1", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.25", "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw=="], "@opencode-ai/www/astro/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], @@ -7417,17 +7707,15 @@ "@opencode-ai/www/astro/diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], - "@opencode-ai/www/astro/es-module-lexer": ["es-module-lexer@2.3.1", "", {}, "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="], - "@opencode-ai/www/astro/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], "@opencode-ai/www/astro/fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], "@opencode-ai/www/astro/get-tsconfig": ["get-tsconfig@5.0.0-beta.4", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ=="], - "@opencode-ai/www/astro/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@opencode-ai/www/astro/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], - "@opencode-ai/www/astro/magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="], + "@opencode-ai/www/astro/magicast": ["magicast@0.5.4", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w=="], "@opencode-ai/www/astro/neotraverse": ["neotraverse@1.0.1", "", {}, "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w=="], @@ -7437,13 +7725,11 @@ "@opencode-ai/www/astro/sharp": ["sharp@0.35.3", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.3", "@img/sharp-darwin-x64": "0.35.3", "@img/sharp-freebsd-wasm32": "0.35.3", "@img/sharp-libvips-darwin-arm64": "1.3.2", "@img/sharp-libvips-darwin-x64": "1.3.2", "@img/sharp-libvips-linux-arm": "1.3.2", "@img/sharp-libvips-linux-arm64": "1.3.2", "@img/sharp-libvips-linux-ppc64": "1.3.2", "@img/sharp-libvips-linux-riscv64": "1.3.2", "@img/sharp-libvips-linux-s390x": "1.3.2", "@img/sharp-libvips-linux-x64": "1.3.2", "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", "@img/sharp-libvips-linuxmusl-x64": "1.3.2", "@img/sharp-linux-arm": "0.35.3", "@img/sharp-linux-arm64": "0.35.3", "@img/sharp-linux-ppc64": "0.35.3", "@img/sharp-linux-riscv64": "0.35.3", "@img/sharp-linux-s390x": "0.35.3", "@img/sharp-linux-x64": "0.35.3", "@img/sharp-linuxmusl-arm64": "0.35.3", "@img/sharp-linuxmusl-x64": "0.35.3", "@img/sharp-webcontainers-wasm32": "0.35.3", "@img/sharp-win32-arm64": "0.35.3", "@img/sharp-win32-ia32": "0.35.3", "@img/sharp-win32-x64": "0.35.3" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q=="], - "@opencode-ai/www/astro/tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], - "@opencode-ai/www/astro/unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="], "@opencode-ai/www/astro/unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], - "@opencode-ai/www/astro/vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="], + "@opencode-ai/www/astro/vite": ["vite@8.2.1", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.25", "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw=="], "@opencode-ai/www/astro/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], @@ -7461,15 +7747,41 @@ "@opentui/solid/@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@oxc-parser/binding-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + "@oxc-resolver/binding-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], "@pierre/diffs/@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="], "@pierre/diffs/@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.20.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="], - "@pierre/diffs/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@radix-ui/react-arrow/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], - "@pierre/trees/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@radix-ui/react-collapsible/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-collection/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-dismissable-layer/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-focus-scope/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-popover/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-popper/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-portal/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-presence/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-primitive/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-roving-focus/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-toggle-group/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-toggle/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-tooltip/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "@radix-ui/react-visually-hidden/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], "@sentry/bundler-plugin-core/glob/minimatch": ["minimatch@8.0.7", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="], @@ -7483,7 +7795,7 @@ "@shikijs/stream/@shikijs/core/@shikijs/types": ["@shikijs/types@4.2.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-VT/MKtlpOhEPZloSH3Pb9WCZEBDoQVMa9jedp5UAwmJOar1DVc9DRODAxmYPW9M93IK4ryuqRejFfmlvlVDemw=="], - "@shikijs/twoslash/@shikijs/core/@shikijs/primitive": ["@shikijs/primitive@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A=="], + "@shikijs/twoslash/@shikijs/core/@shikijs/primitive": ["@shikijs/primitive@4.4.2", "", { "dependencies": { "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-l6fQQKsOMlz72n38fztmSgZ76MO6KSWuw8o+GJ+FhmqrpC9pIOJNQNXGgbb5yX2AwpzlEHwsaLPnk/8o4Fm+rA=="], "@slack/bolt/express/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], @@ -7533,9 +7845,7 @@ "@solidjs/start/shiki/@shikijs/types": ["@shikijs/types@1.29.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw=="], - "@storybook/addon-docs/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@storybook/csf-plugin/unplugin/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + "@storybook/csf-plugin/unplugin/acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "@storybook/csf-plugin/unplugin/webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], @@ -7545,12 +7855,14 @@ "@vercel/routing-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "@vitest/expect/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], - "ai-gateway-provider/@ai-sdk/openai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.14", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA=="], "ai-gateway-provider/@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.38", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-/HHGmtKllqjg1OLc023v9w9kK3laW7Z6TzfZukYQWCsGBbzB9p60zTvvpXFVcs44NZBVXL3viOa1HRKUbeee8g=="], + "ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], + + "ai/@ai-sdk/provider-utils/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -7601,35 +7913,25 @@ "babel-plugin-module-resolver/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "blume/@ai-sdk/openai-compatible/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], + "blume/@astrojs/mdx/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.2", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.3.0", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-yt7fMgPYqSM4Tmr+taTW6Per+hjJ8Pk6lA1PAcDyqzOt8HzJ6Kje5WzCxA2Sd+9wsUW7uhkLeoTMK0cXPwH9rQ=="], - "blume/@astrojs/mdx/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], + "blume/@astrojs/mdx/@astrojs/markdown-remark": ["@astrojs/markdown-remark@7.2.2", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.2", "@astrojs/prism": "4.0.2", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-FGfmK84zSNcrsBd0dl1gXE9JvZYElp8EXQa2jpHVAxG4deGKAp43wspxFupjADJX7MSsMRHwYCnfT6EyVmgeFQ=="], - "blume/@astrojs/mdx/@astrojs/markdown-remark": ["@astrojs/markdown-remark@7.2.1", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@astrojs/prism": "4.0.2", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-jPVNIqTvk+yKviikszv/Y1U4jGUSKpp/Nw48QZV4qjWgp70j4Lkq3lhSDRbWwCfgKvEyO9GHuVbV1dM2WYXy1w=="], - - "blume/@astrojs/mdx/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], - - "blume/@astrojs/mdx/es-module-lexer": ["es-module-lexer@2.3.1", "", {}, "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="], + "blume/@astrojs/mdx/acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "blume/@astrojs/mdx/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "blume/@clack/prompts/@clack/core": ["@clack/core@1.4.3", "", { "dependencies": { "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ=="], - "blume/@pierre/diffs/@pierre/theme": ["@pierre/theme@1.1.0", "", {}, "sha512-GC2OWTAfTIIWWYhPCygwG8t2EtePQkRfON4MI2rwIkJylmiyqIttJID2dCL8sUD8cNdEvYkEyfEHHKMeCiDLoQ=="], + "blume/@pierre/diffs/@pierre/theme": ["@pierre/theme@2.0.0", "", {}, "sha512-yNDd9GYLQl1mEUJR8AneJ5e4ohLIHQd/wZLWr4fagt78vS2RwwZNW530vVgHqXFAyFVcFlRmGUD5ramXH46OXw=="], - "blume/@pierre/diffs/@pierre/theming": ["@pierre/theming@0.0.2", "", { "peerDependencies": { "@pierre/theme": "^1.1.0", "@shikijs/themes": "^3.0.0 || ^4.0.0", "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0", "shiki": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["@pierre/theme", "@shikijs/themes", "react", "react-dom", "shiki"] }, "sha512-QM1M4stXfnzfaE8I8YbjXSApV8c+2dBsXJj8eYg9WTpBR/cTmCZIcfGnN4p13iRrYu2Br/R/OJfEL7uR8Qjctw=="], + "blume/@pierre/diffs/@pierre/theming": ["@pierre/theming@1.0.1", "", { "peerDependencies": { "@pierre/theme": "^1.1.0 || ^2.0.0", "@shikijs/themes": "^3.0.0 || ^4.0.0", "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0", "shiki": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["@pierre/theme", "@shikijs/themes", "react", "react-dom", "shiki"] }, "sha512-WCI5Qd7iprDpISL9fBYOLe8RV53+b7mFNA3bPzl60/2CKCSrsKN8zEcep6Y3BAzvARlmca50zGjDodqPGiTUKA=="], "blume/@pierre/diffs/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "blume/@shikijs/transformers/@shikijs/core": ["@shikijs/core@4.3.1", "", { "dependencies": { "@shikijs/primitive": "4.3.1", "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA=="], + "blume/@shikijs/transformers/@shikijs/core": ["@shikijs/core@4.4.2", "", { "dependencies": { "@shikijs/primitive": "4.4.2", "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-StyzbAyxg2/tBGf78gwbBkGyeQ73lf8UiJArFaQhTQIDqQOCKPCQFanvrs4/Yv3Yfyc+ONInJM6K+FMIf+P+kA=="], - "blume/@shikijs/transformers/@shikijs/types": ["@shikijs/types@4.3.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g=="], - - "blume/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.119", "", { "dependencies": { "@ai-sdk/provider": "2.0.3", "@ai-sdk/provider-utils": "3.0.30", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-LTbVThusUYSw6SxsRvdCKveVHCFf+3DBU3XY8+RgBYPBSjSfeKkVMirvGkcj7Hvwd5aTptioHpnreVXzhwjpVw=="], - - "blume/ai/@ai-sdk/provider": ["@ai-sdk/provider@2.0.3", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww=="], - - "blume/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.3", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-NCJ9JKow5ENAgEZxzvEvF20thwDiH+hutvzmrUDbloRX0azpJHNst8+7pZIVryYhLM9wgpT5/ShTSjPTFhkxEQ=="], + "blume/@shikijs/transformers/@shikijs/types": ["@shikijs/types@4.4.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-PFYitV4vpDr/iPCIhnHp+Q4ftic5N5VeNJ3KQ1O8gn3h2ar8qgwMAXF7tq4m1CWaMS60fV4VqF6vfnWH4F7vqQ=="], "blume/astro/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], @@ -7641,15 +7943,13 @@ "blume/astro/diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], - "blume/astro/es-module-lexer": ["es-module-lexer@2.3.1", "", {}, "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="], - "blume/astro/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], "blume/astro/fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], "blume/astro/get-tsconfig": ["get-tsconfig@5.0.0-beta.4", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ=="], - "blume/astro/magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="], + "blume/astro/magicast": ["magicast@0.5.4", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w=="], "blume/astro/neotraverse": ["neotraverse@1.0.1", "", {}, "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w=="], @@ -7659,13 +7959,11 @@ "blume/astro/sharp": ["sharp@0.35.3", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.3", "@img/sharp-darwin-x64": "0.35.3", "@img/sharp-freebsd-wasm32": "0.35.3", "@img/sharp-libvips-darwin-arm64": "1.3.2", "@img/sharp-libvips-darwin-x64": "1.3.2", "@img/sharp-libvips-linux-arm": "1.3.2", "@img/sharp-libvips-linux-arm64": "1.3.2", "@img/sharp-libvips-linux-ppc64": "1.3.2", "@img/sharp-libvips-linux-riscv64": "1.3.2", "@img/sharp-libvips-linux-s390x": "1.3.2", "@img/sharp-libvips-linux-x64": "1.3.2", "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", "@img/sharp-libvips-linuxmusl-x64": "1.3.2", "@img/sharp-linux-arm": "0.35.3", "@img/sharp-linux-arm64": "0.35.3", "@img/sharp-linux-ppc64": "0.35.3", "@img/sharp-linux-riscv64": "0.35.3", "@img/sharp-linux-s390x": "0.35.3", "@img/sharp-linux-x64": "0.35.3", "@img/sharp-linuxmusl-arm64": "0.35.3", "@img/sharp-linuxmusl-x64": "0.35.3", "@img/sharp-webcontainers-wasm32": "0.35.3", "@img/sharp-win32-arm64": "0.35.3", "@img/sharp-win32-ia32": "0.35.3", "@img/sharp-win32-x64": "0.35.3" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q=="], - "blume/astro/tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], - "blume/astro/unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="], "blume/astro/unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], - "blume/astro/vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="], + "blume/astro/vite": ["vite@8.2.1", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.25", "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw=="], "blume/astro/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], @@ -7677,8 +7975,6 @@ "blume/node-html-parser/entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], - "blume/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "builder-util/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -7697,7 +7993,7 @@ "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], - "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], + "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], "dir-compare/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -7709,7 +8005,7 @@ "duplexer2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "editorconfig/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], + "editorconfig/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "electron-updater/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], @@ -7721,10 +8017,12 @@ "esbuild-plugin-copy/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "filelist/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], + "filelist/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + "framer-motion/react-dom/scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + "gcp-metadata/gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], "js-beautify/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], @@ -7749,7 +8047,7 @@ "mermaid/katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], - "motion/framer-motion/motion-dom": ["motion-dom@12.42.2", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA=="], + "motion/framer-motion/motion-dom": ["motion-dom@12.43.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag=="], "motion/framer-motion/motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="], @@ -7759,7 +8057,7 @@ "pkg-up/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], - "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], + "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "rimraf/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], @@ -7767,6 +8065,10 @@ "rimraf/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "storybook/@vitest/expect/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + + "storybook/@vitest/expect/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + "storybook/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], "storybook/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], @@ -7831,15 +8133,13 @@ "tw-to-css/tailwindcss/object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], - "tw-to-css/tailwindcss/postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="], + "tw-to-css/tailwindcss/postcss": ["postcss@8.5.26", "", { "dependencies": { "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="], "unplugin/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], "unzipper/fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], - "venice-ai-sdk-provider/@ai-sdk/openai-compatible/@ai-sdk/provider": ["@ai-sdk/provider@3.0.13", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-ZPtVYt5QIJzOta1kdUiDuCx4HhFkvNPv/rvmZ2b1iXwybYjJsCnNYR4PAw4kW7rgVfDARvHXcU64efWuqNp6bw=="], - - "venice-ai-sdk-provider/@ai-sdk/openai-compatible/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.35", "", { "dependencies": { "@ai-sdk/provider": "3.0.13", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-bjYld/2KGPLt78kpqbya+fD4LYS7BqVQJyUjE3qAHrYB0FR2Q90BaWEVIBZaguTWXf/A8L6uG1zO1v9TxVlGWg=="], + "venice-ai-sdk-provider/@ai-sdk/openai-compatible/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.42", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8", "undici": "^5.29.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Q07lZsq4ir+xwAGVfSbY2WNGLrbfWINFaL2I/vTBFrkuXeP7VZh+UtQgLOKZS6Z/6flNFW22jDYdbINvwTV/PA=="], "vitest/@vitest/expect/chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], @@ -8247,6 +8547,74 @@ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.933.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-o1GX0+IPlFi/D8ei9y/jj3yucJWNfPnbB5appVBWevAyUdZA5KzQ2nK/hDxiu9olTZlFEFpf1m1Rn3FaGxHqsw=="], + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + + "@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260120.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-JLHx3p5dpwz4wjVSis45YNReftttnI3ndhdMh5BUbbpdreN/g0jgxNt5Qp9tDFqEKl++N63qv+hxJiIIvSLR+Q=="], + + "@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260120.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-1Md2tCRhZjwajsZNOiBeOVGiS3zbpLPzUDjHr4+XGTXWOA6FzzwScJwQZLa0Doc28Cp4Nr1n7xGL0Dwiz1XuOA=="], + + "@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260120.0", "", { "os": "linux", "cpu": "x64" }, "sha512-O0mIfJfvU7F8N5siCoRDaVDuI12wkz2xlG4zK6/Ct7U9c9FiE0ViXNFWXFQm5PPj+qbkNRyhjUwhP+GCKTk5EQ=="], + + "@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260120.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-aRHO/7bjxVpjZEmVVcpmhbzpN6ITbFCxuLLZSW0H9O0C0w40cDCClWSi19T87Ax/PQcYjFNT22pTewKsupkckA=="], + + "@cloudflare/vitest-pool-workers/miniflare/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260120.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ASZIz1E8sqZQqQCgcfY1PJbBpUDrxPt8NZ+lqNil0qxnO4qX38hbCsdDF2/TDAuq0Txh7nu8ztgTelfNDlb4EA=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260120.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-JLHx3p5dpwz4wjVSis45YNReftttnI3ndhdMh5BUbbpdreN/g0jgxNt5Qp9tDFqEKl++N63qv+hxJiIIvSLR+Q=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260120.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-1Md2tCRhZjwajsZNOiBeOVGiS3zbpLPzUDjHr4+XGTXWOA6FzzwScJwQZLa0Doc28Cp4Nr1n7xGL0Dwiz1XuOA=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260120.0", "", { "os": "linux", "cpu": "x64" }, "sha512-O0mIfJfvU7F8N5siCoRDaVDuI12wkz2xlG4zK6/Ct7U9c9FiE0ViXNFWXFQm5PPj+qbkNRyhjUwhP+GCKTk5EQ=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260120.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-aRHO/7bjxVpjZEmVVcpmhbzpN6ITbFCxuLLZSW0H9O0C0w40cDCClWSi19T87Ax/PQcYjFNT22pTewKsupkckA=="], + + "@cloudflare/vitest-pool-workers/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260120.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ASZIz1E8sqZQqQCgcfY1PJbBpUDrxPt8NZ+lqNil0qxnO4qX38hbCsdDF2/TDAuq0Txh7nu8ztgTelfNDlb4EA=="], + "@electron/asar/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "@electron/universal/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], @@ -8299,32 +8667,98 @@ "@jsx-email/cli/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], - "@octokit/auth-app/@octokit/request-error/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@octokit/auth-app/@octokit/request-error/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@28.0.0", "", {}, "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="], - "@octokit/auth-app/@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@octokit/auth-app/@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@28.0.0", "", {}, "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="], - "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="], + "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.4", "", { "dependencies": { "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA=="], "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], - "@octokit/plugin-paginate-rest/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@octokit/plugin-paginate-rest/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@28.0.0", "", {}, "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="], - "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="], + "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.4", "", { "dependencies": { "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA=="], "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], - "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@28.0.0", "", {}, "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="], - "@octokit/rest/@octokit/core/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="], + "@octokit/rest/@octokit/core/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.4", "", { "dependencies": { "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA=="], "@octokit/rest/@octokit/core/@octokit/request/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], - "@octokit/rest/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@octokit/rest/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@28.0.0", "", {}, "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="], "@opencode-ai/desktop/@actions/artifact/@actions/core/@actions/exec": ["@actions/exec@1.1.1", "", { "dependencies": { "@actions/io": "^1.0.1" } }, "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w=="], "@opencode-ai/desktop/@actions/artifact/@actions/http-client/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + + "@opencode-ai/lab-catalog/wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/undici": ["undici@7.28.0", "", {}, "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA=="], + + "@opencode-ai/lab-catalog/wrangler/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260708.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-HXFCvhS1wpg3uXO0CLUwmwC41i2loM5FSK69EUchOBpmYBAXxT1oHLm6EOA5lqhTk5Mu9kjRiQYxa1GwKPwfJg=="], + + "@opencode-ai/lab-catalog/wrangler/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260708.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JVlJaKDoRTVKSroHIlf8g3UCPjKj4iDbMZE2CNYht5qQ+2rL0FAUiVlV82G3BqKnnw9kHYnnsMzC08b9zVtdzA=="], + + "@opencode-ai/lab-catalog/wrangler/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260708.1", "", { "os": "linux", "cpu": "x64" }, "sha512-3daE60YdD7YX0Jtuzc9DE/r/qMkmx8ZvHTkF8Mzmp3F5tbzlV0DAzmu5PFUPF2WuvtKbAhZKbvC2cHmWpQYxnA=="], + + "@opencode-ai/lab-catalog/wrangler/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260708.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-VLdNYOx5Hj+9C6isy0ACWZsbMtSxex2DIJWEe7cZxUdlphZ58ZT8zxNXK8yunFiowd34hn3VwGMopdvdj8lvmA=="], + + "@opencode-ai/lab-catalog/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260708.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bC/aSAwLy16Vjo24i9XU3aWH+eRgz7NeR5xPKavGbembO18ZywYTQbXh14eXtY6fAqN3RzRG8psijTdhX4xydA=="], + "@opencode-ai/updates/wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], "@opencode-ai/updates/wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], @@ -8391,15 +8825,83 @@ "@opencode-ai/updates/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260708.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bC/aSAwLy16Vjo24i9XU3aWH+eRgz7NeR5xPKavGbembO18ZywYTQbXh14eXtY6fAqN3RzRG8psijTdhX4xydA=="], - "@opencode-ai/www/@astrojs/cloudflare/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], + + "@opencode-ai/workerd-spike/wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], + + "@opencode-ai/workerd-spike/wrangler/miniflare/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + + "@opencode-ai/workerd-spike/wrangler/miniflare/undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="], + + "@opencode-ai/workerd-spike/wrangler/miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "@opencode-ai/workerd-spike/wrangler/miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + + "@opencode-ai/workerd-spike/wrangler/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250803.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-6QciMnJp1p3F1qUiN0LaLfmw7SuZA/gfUBOe8Ft81pw16JYZ3CyiqIKPJvc1SV8jgDx8r+gz/PRi1NwOMt329A=="], + + "@opencode-ai/workerd-spike/wrangler/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250803.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DoIgghDowtqoNhL6OoN/F92SKtrk7mRQKc4YSs/Dst8IwFZq+pCShOlWfB0MXqHKPSoiz5xLSrUKR9H6gQMPvw=="], + + "@opencode-ai/workerd-spike/wrangler/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250803.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mYdz4vNWX3+PoqRjssepVQqgh42IBiSrl+wb7vbh7VVWUVzBnQKtW3G+UFiBF62hohCLexGIEi7L0cFfRlcKSQ=="], + + "@opencode-ai/workerd-spike/wrangler/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250803.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RmrtUYLRUg6djKU7Z6yebS6YGJVnaDVY6bbXca+2s26vw4ibJDOTPLuBHFQF62Grw3fAfsNbjQh5i14vG2mqUg=="], + + "@opencode-ai/workerd-spike/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250803.0", "", { "os": "win32", "cpu": "x64" }, "sha512-uLV8gdudz36o9sUaAKbBxxTwZwLFz1KyW7QpBvOo4+r3Ib8yVKXGiySIMWGD7A0urSMrjf3e5LlLcJKgZUOjMA=="], + + "@opencode-ai/www/@astrojs/cloudflare/@astrojs/internal-helpers/js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.1", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": ">1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/miniflare": ["miniflare@4.20260722.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "0.35.2", "undici": "7.28.0", "workerd": "1.20260722.1", "ws": "8.21.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-LW6ABMhCx/yIEFBLC/DO4yAhdm2T/G7jp7pr5T2kj895+CCIaHZqpMXdW9O6YE48LcYcCJChwWc8aEs1vpbTXw=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/miniflare": ["miniflare@5.20260801.1-alpha", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "0.35.2", "undici": "7.29.0", "workerd": "1.20260801.1", "ws": "8.21.0", "youch": "4.1.0-beta.10" } }, "sha512-BHPVzIDA6mbx7LefxpvkXW7DHx9FKB9GorZatbnrrFTt3CVMU8zuUpbgyCuebwDKcTTOZos43ta8GQ0eMVEpxA=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd": ["workerd@1.20260722.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260722.1", "@cloudflare/workerd-darwin-arm64": "1.20260722.1", "@cloudflare/workerd-linux-64": "1.20260722.1", "@cloudflare/workerd-linux-arm64": "1.20260722.1", "@cloudflare/workerd-windows-64": "1.20260722.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-NycKuc1x2onvsRfGGpM093vRlLFU2zHDAM0+APpccfg4+gZxDGCH27RmdDvkeBuoZyYqgLo3oAfF6re4mvC3vQ=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd": ["workerd@1.20260801.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260801.1", "@cloudflare/workerd-darwin-arm64": "1.20260801.1", "@cloudflare/workerd-linux-64": "1.20260801.1", "@cloudflare/workerd-linux-arm64": "1.20260801.1", "@cloudflare/workerd-windows-64": "1.20260801.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-/g9JGTyqnHtoIscpBHqKD8swE2V4StBs2i69PmLiOhH45OP95jCFICl4F1hKlgN57rqfni5LiCitttoX5OOkVA=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/wrangler": ["wrangler@4.114.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", "miniflare": "4.20260722.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260722.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "peerDependencies": { "@cloudflare/workers-types": "^5.20260722.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "cf-wrangler": "bin/cf-wrangler.js", "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-M65P25t5UHA1TIJfgZXDcj+YzVobgKdRguM2QPz0xnxLFuOcuE3ErgllDht0iaho7MS4o0g/Bb4YK2+GT+bibg=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/wrangler": ["wrangler@4.120.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", "miniflare": "5.20260801.1-alpha", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260801.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "peerDependencies": { "@cloudflare/workers-types": "^5.20260801.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js", "cf-wrangler": "bin/cf-wrangler.js" } }, "sha512-cBmu/MeaB/fPacC0JpATs4duTOCagBxrZo+vBzuTX06tLzwSyAHE1drlHUZ8rP0VqVz1fy3ReGYTiHdKkoHltg=="], "@opencode-ai/www/@astrojs/cloudflare/vite/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], @@ -8577,7 +9079,7 @@ "@opencode-ai/www/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260708.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bC/aSAwLy16Vjo24i9XU3aWH+eRgz7NeR5xPKavGbembO18ZywYTQbXh14eXtY6fAqN3RzRG8psijTdhX4xydA=="], - "@sentry/bundler-plugin-core/glob/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], + "@sentry/bundler-plugin-core/glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "@sentry/bundler-plugin-core/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -8607,17 +9109,17 @@ "archiver-utils/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], + "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "archiver-utils/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - "astro/unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "astro/unstorage/chokidar/readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "astro/unstorage/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], "astro/unstorage/h3/crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], - "babel-plugin-module-resolver/glob/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], + "babel-plugin-module-resolver/glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "babel-plugin-module-resolver/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -8625,9 +9127,7 @@ "blume/@astrojs/mdx/@astrojs/markdown-remark/@astrojs/prism": ["@astrojs/prism@4.0.2", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA=="], - "blume/@shikijs/transformers/@shikijs/core/@shikijs/primitive": ["@shikijs/primitive@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A=="], - - "blume/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], + "blume/@shikijs/transformers/@shikijs/core/@shikijs/primitive": ["@shikijs/primitive@4.4.2", "", { "dependencies": { "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-l6fQQKsOMlz72n38fztmSgZ76MO6KSWuw8o+GJ+FhmqrpC9pIOJNQNXGgbb5yX2AwpzlEHwsaLPnk/8o4Fm+rA=="], "blume/astro/@astrojs/telemetry/is-docker": ["is-docker@4.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA=="], @@ -8741,7 +9241,7 @@ "js-beautify/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - "js-beautify/glob/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], + "js-beautify/glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "js-beautify/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -8755,10 +9255,12 @@ "rimraf/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "rimraf/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "storybook/@vitest/expect/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + "temp/rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "tw-to-css/tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], @@ -8767,6 +9269,8 @@ "unplugin/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + "venice-ai-sdk-provider/@ai-sdk/openai-compatible/@ai-sdk/provider-utils/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + "vitest/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], "vitest/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], @@ -8889,7 +9393,7 @@ "@astrojs/cloudflare/wrangler/miniflare/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], - "@astrojs/node/astro/unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "@astrojs/node/astro/unstorage/chokidar/readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "@astrojs/node/astro/unstorage/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], @@ -8915,7 +9419,7 @@ "@astrojs/node/astro/vite/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="], - "@astrojs/vercel/astro/unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "@astrojs/vercel/astro/unstorage/chokidar/readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "@astrojs/vercel/astro/unstorage/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], @@ -8943,10 +9447,60 @@ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.782.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-user-agent": "3.782.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.782.0", "@aws-sdk/util-user-agent-browser": "3.775.0", "@aws-sdk/util-user-agent-node": "3.782.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-retry": "^4.1.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/middleware-stack": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.8", "@smithy/util-defaults-mode-node": "^4.0.8", "@smithy/util-endpoints": "^3.0.2", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-QOYC8q7luzHFXrP0xYAqBctoPkynjfV0r9dqntFu4/IWMTyC1vlo1UTxFAjIPyclYw92XJyEkVCVg9v/nQnsUA=="], + "@cloudflare/vitest-pool-workers/miniflare/sharp/@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + "@jsx-email/cli/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "@opencode-ai/desktop/@actions/artifact/@actions/core/@actions/exec/@actions/io": ["@actions/io@1.1.3", "", {}, "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q=="], + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "@opencode-ai/updates/wrangler/miniflare/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], "@opencode-ai/updates/wrangler/miniflare/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], @@ -8999,17 +9553,17 @@ "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/miniflare/sharp": ["sharp@0.35.2", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.4" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.2", "@img/sharp-darwin-x64": "0.35.2", "@img/sharp-freebsd-wasm32": "0.35.2", "@img/sharp-libvips-darwin-arm64": "1.3.1", "@img/sharp-libvips-darwin-x64": "1.3.1", "@img/sharp-libvips-linux-arm": "1.3.1", "@img/sharp-libvips-linux-arm64": "1.3.1", "@img/sharp-libvips-linux-ppc64": "1.3.1", "@img/sharp-libvips-linux-riscv64": "1.3.1", "@img/sharp-libvips-linux-s390x": "1.3.1", "@img/sharp-libvips-linux-x64": "1.3.1", "@img/sharp-libvips-linuxmusl-arm64": "1.3.1", "@img/sharp-libvips-linuxmusl-x64": "1.3.1", "@img/sharp-linux-arm": "0.35.2", "@img/sharp-linux-arm64": "0.35.2", "@img/sharp-linux-ppc64": "0.35.2", "@img/sharp-linux-riscv64": "0.35.2", "@img/sharp-linux-s390x": "0.35.2", "@img/sharp-linux-x64": "0.35.2", "@img/sharp-linuxmusl-arm64": "0.35.2", "@img/sharp-linuxmusl-x64": "0.35.2", "@img/sharp-webcontainers-wasm32": "0.35.2", "@img/sharp-win32-arm64": "0.35.2", "@img/sharp-win32-ia32": "0.35.2", "@img/sharp-win32-x64": "0.35.2" } }, "sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/miniflare/undici": ["undici@7.28.0", "", {}, "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/miniflare/undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260722.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-vZOP8vIS3NwnuaO+gz0FZ7kIGeiO3bZmxV35Ph9zOXKSREhDFlH7wQ7mkCdhW3O4jnXsew+XT7b+DNEI2CcJGQ=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260801.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-wuJWbXpKvncJi1P0GKS+iYpN5tHdb7JPJJ/+6ZQe8zzovHHVMkLJPNBsgWpqeUhpM3g9qTwEKd2rglNKejuh5A=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260722.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EmIQymihDq6WNdER4+LF8Qn80yqayBUpJ+tkOO7wmY8pmgfyXjIUFNXotl21AHovTeu2seR7HdVUgeN/BilCWw=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260801.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kwoZiTpnhNrF3+APx84Q/oAqvJ3sU9yefGagwm/ASaH/2W19x0vghkW/r4qCoHCK0WW7EPugZ+aXjgPMRtlq1Q=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260722.1", "", { "os": "linux", "cpu": "x64" }, "sha512-jvZ3k9fxcnEn04s80CgIYxQfpOyAiz/8qC42DP8EBa9tR27qWyg9wmm31zIobVlrgBZn/+8NfdP73avRGcQOjQ=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260801.1", "", { "os": "linux", "cpu": "x64" }, "sha512-r0vAxCZH+Jih9Unm1yoyiByPNWNgawcKciOHDm5Q37ZVGOkKLsT9AtLe3yLSaul76WrKqtf+JP2n0WW32VBLJg=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260722.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-BOSB55SMNdy+DA5uj2WirgiNanpHGis5PVvXH1wSfvjRKr4JGgWK+EZzxz0RFUo6QjjQQC/NimEzNZ7va7jmKg=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260801.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-zWgpdZtSozvIgzQNmQiDSF8yEOQJUkRAWNsDXXzAAoy+fCn8YUoSibj3mpFSbZRvbUldeBEaW6SCdC2VEMkhNQ=="], - "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260722.1", "", { "os": "win32", "cpu": "x64" }, "sha512-sYM8YgUpKnRz2xjvdJLX1Ojzoi4MlA4gk8WTTExhGydjYB2UTs5NIbv0ZmpKgMoK9io3ixgmiW56ZnTbcWOdiA=="], + "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260801.1", "", { "os": "win32", "cpu": "x64" }, "sha512-2oQz+Ksu4ji6e/+ZoYX+tWQEcxAii2p7l+iR8kx48W1llMalaufAsmVxTlk+3/vrM7D3/2c0iK448e0UQTcIMg=="], "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/wrangler/@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.5.0", "", {}, "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg=="], @@ -9087,7 +9641,7 @@ "@opencode-ai/www/@astrojs/cloudflare/vite/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="], - "@opencode-ai/www/astro/unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "@opencode-ai/www/astro/unstorage/chokidar/readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "@opencode-ai/www/astro/unstorage/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], @@ -9179,7 +9733,7 @@ "babel-plugin-module-resolver/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "blume/astro/unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "blume/astro/unstorage/chokidar/readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "blume/astro/unstorage/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], @@ -9221,12 +9775,14 @@ "rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "temp/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], + "temp/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], "tw-to-css/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "@astrojs/cloudflare/wrangler/miniflare/sharp/@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + "@opencode-ai/lab-catalog/wrangler/miniflare/sharp/@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + "@opencode-ai/updates/wrangler/miniflare/sharp/@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], "@opencode-ai/www/@astrojs/cloudflare/@cloudflare/vite-plugin/miniflare/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.3.1" }, "os": "darwin", "cpu": "arm64" }, "sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg=="], diff --git a/package.json b/package.json index 23c5416f1a4..b02d3dda1ad 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "packages": [ "packages/*", "packages/console/*", + "packages/lab/*", "packages/stats/*", "packages/slack" ], @@ -46,9 +47,9 @@ "@octokit/rest": "22.0.0", "@hono/standard-validator": "0.2.0", "@hono/zod-validator": "0.4.2", - "@opentui/core": "0.0.0-20260808-9ecf7c0a", - "@opentui/keymap": "0.0.0-20260808-9ecf7c0a", - "@opentui/solid": "0.0.0-20260808-9ecf7c0a", + "@opentui/core": "0.5.2", + "@opentui/keymap": "0.5.2", + "@opentui/solid": "0.5.2", "@tanstack/solid-virtual": "3.13.32", "@shikijs/stream": "4.2.0", "@standard-schema/spec": "1.1.0", @@ -120,7 +121,8 @@ "prettier": "3.6.2", "semver": "^7.6.0", "sst": "catalog:", - "turbo": "2.10.2" + "turbo": "2.10.2", + "vitest": "4.1.10" }, "dependencies": { "@aws-sdk/client-s3": "3.933.0", @@ -150,9 +152,9 @@ "electron" ], "overrides": { - "@opentui/core": "0.0.0-20260808-9ecf7c0a", - "@opentui/keymap": "0.0.0-20260808-9ecf7c0a", - "@opentui/solid": "0.0.0-20260808-9ecf7c0a", + "@opentui/core": "catalog:", + "@opentui/keymap": "catalog:", + "@opentui/solid": "catalog:", "@types/bun": "catalog:", "@types/node": "catalog:", "effect": "catalog:" @@ -172,6 +174,7 @@ "@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch", "effect@4.0.0-beta.101": "patches/effect@4.0.0-beta.101.patch", "@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch", + "@cloudflare/vitest-pool-workers@0.12.6": "patches/@cloudflare%2Fvitest-pool-workers@0.12.6.patch", "@ff-labs/fff-bun@0.10.1": "patches/@ff-labs%2Ffff-bun@0.10.1.patch" } } diff --git a/packages/ai/src/protocols/anthropic-messages.ts b/packages/ai/src/protocols/anthropic-messages.ts index 7539e54d092..78c76be5e43 100644 --- a/packages/ai/src/protocols/anthropic-messages.ts +++ b/packages/ai/src/protocols/anthropic-messages.ts @@ -573,7 +573,10 @@ const lowerMessages = Effect.fn("AnthropicMessages.lowerMessages")(function* ( cache_control: cacheControl(breakpoints, part.cache), }) } - messages.push({ role: "user", content }) + const previous = messages.at(-1) + if (previous?.role === "user" && previous.content.every((block) => block.type === "tool_result")) + messages[messages.length - 1] = { role: "user", content: [...previous.content, ...content] } + else messages.push({ role: "user", content }) } return messages diff --git a/packages/ai/src/route/executor.ts b/packages/ai/src/route/executor.ts index 388fd4198ef..b9628954863 100644 --- a/packages/ai/src/route/executor.ts +++ b/packages/ai/src/route/executor.ts @@ -1,4 +1,4 @@ -import { Cause, Context, Effect, Layer, Option, Schema } from "effect" +import { Cause, Context, Effect, Layer, Option, Schema, Stream } from "effect" import { FetchHttpClient, Headers, @@ -297,44 +297,86 @@ export const classifyHttpFailure = (input: { }) } -const toHttpError = (redactedNames: ReadonlyArray) => (error: unknown) => { - const transportError = (input: { - readonly message: string - readonly kind?: string | undefined - readonly request?: HttpClientRequest.HttpClientRequest | undefined - }) => +type HttpOperation = "request" | "read" + +const NativeTransportFailure = Schema.Struct({ + message: Schema.String, + code: Schema.optionalKey(Schema.String), + cause: Schema.optionalKey(Schema.Unknown), +}) +const decodeNativeTransportFailure = Schema.decodeUnknownOption(NativeTransportFailure) + +const nativeTransportFailure = (error: unknown) => { + const failure = Option.getOrUndefined(decodeNativeTransportFailure(error)) + if (!failure) return undefined + if (failure.code !== undefined) return failure + const cause = Option.getOrUndefined(decodeNativeTransportFailure(failure.cause)) + if (cause?.code !== undefined) return cause + return failure +} + +const httpError = (input: { + readonly error: unknown + readonly request: HttpClientRequest.HttpClientRequest + readonly operation: HttpOperation + readonly redactedNames: ReadonlyArray +}) => { + const request = HttpClientError.isHttpClientError(input.error) ? input.error.request : input.request + const transportError = (failure: { readonly message: string; readonly code?: string | undefined }) => new AIError({ module: "RequestExecutor", - method: "execute", + method: input.operation, reason: new TransportReason({ - message: input.message, - kind: input.kind, - url: input.request ? redactUrl(input.request.url) : undefined, - http: input.request ? new HttpContext({ request: requestDetails(input.request, redactedNames) }) : undefined, + message: failure.message, + transport: "http", + operation: input.operation, + code: failure.code, + url: redactUrl(request.url), + http: new HttpContext({ request: requestDetails(request, input.redactedNames) }), }), }) - if (Cause.isTimeoutError(error)) { - return transportError({ message: error.message, kind: "Timeout" }) - } - if (!HttpClientError.isHttpClientError(error)) { - return transportError({ message: error instanceof Error ? error.message : "HTTP transport failed" }) - } - const request = "request" in error ? error.request : undefined - if (error.reason._tag === "TransportError") { + const source = + HttpClientError.isHttpClientError(input.error) && "cause" in input.error.reason + ? input.error.reason.cause + : input.error + const native = nativeTransportFailure(source) + const code = native?.code + const raw = native?.message ?? (input.error instanceof Error ? input.error.message : undefined) + const detail = raw ? redactBody(raw, secretValues(request)) : undefined + const message = code && detail && !detail.includes(code) ? `${code}: ${detail}` : detail + + if (Cause.isTimeoutError(input.error) || Cause.isTimeoutError(source)) + return transportError({ message: message ?? "HTTP transport timed out", code: code ?? "Timeout" }) + if (!HttpClientError.isHttpClientError(input.error)) + return transportError({ message: message ?? "HTTP transport failed", code }) + if (input.error.reason._tag === "TransportError") { return transportError({ - message: error.reason.description ?? "HTTP transport failed", - kind: error.reason._tag, - request, + message: message ?? input.error.reason.description ?? "HTTP transport failed", + code: code ?? input.error.reason._tag, }) } return transportError({ - message: `HTTP transport failed: ${error.reason._tag}`, - kind: error.reason._tag, - request, + message: message ?? `HTTP transport failed: ${input.error.reason._tag}`, + code: code ?? input.error.reason._tag, }) } +export const stream = ( + executor: Interface, + request: HttpClientRequest.HttpClientRequest, + middleware?: HttpMiddleware, +): Stream.Stream => + Stream.unwrap( + Effect.gen(function* () { + const redactedNames = yield* Headers.CurrentRedactedNames + const response = yield* executor.execute(request, middleware) + return response.stream.pipe( + Stream.mapError((error) => httpError({ error, request: response.request, operation: "read", redactedNames })), + ) + }), + ) + export const layer: Layer.Layer = Layer.effect( Service, Effect.gen(function* () { @@ -343,15 +385,16 @@ export const layer: Layer.Layer = Layer.e Effect.gen(function* () { const redactedNames = yield* Headers.CurrentRedactedNames if (!middleware) - return yield* http - .execute(request) - .pipe(Effect.mapError(toHttpError(redactedNames)), Effect.flatMap(statusError(request, redactedNames))) + return yield* http.execute(request).pipe( + Effect.mapError((error) => httpError({ error, request, operation: "request", redactedNames })), + Effect.flatMap(statusError(request, redactedNames)), + ) const response = yield* middleware(request, (input) => http .execute(input) .pipe(Effect.mapError((cause) => (cause instanceof Error ? cause : new Error(String(cause))))), - ).pipe(Effect.mapError(toHttpError(redactedNames))) + ).pipe(Effect.mapError((error) => httpError({ error, request, operation: "request", redactedNames }))) return yield* statusError(response.request, redactedNames)(response) }) return Service.of({ diff --git a/packages/ai/src/route/transport/http.ts b/packages/ai/src/route/transport/http.ts index 12482f39188..06cb2fa48cd 100644 --- a/packages/ai/src/route/transport/http.ts +++ b/packages/ai/src/route/transport/http.ts @@ -1,4 +1,4 @@ -import { Effect, Stream } from "effect" +import { Effect } from "effect" import { Headers, HttpClientRequest } from "effect/unstable/http" import { Auth } from "../auth.js" import { render as renderEndpoint } from "../endpoint.js" @@ -6,6 +6,7 @@ import { Framing } from "../framing.js" import type { HttpMiddleware, Transport, TransportPrepareInput } from "./index.js" import * as ProviderShared from "../../protocols/shared.js" import { mergeJsonRecords, type LLMRequest } from "../../schema/index.js" +import { RequestExecutor } from "../executor.js" export type JsonRequestInput = TransportPrepareInput @@ -86,26 +87,8 @@ export const httpJson = (input: HttpJsonInput): HttpJs middleware: prepareInput.middleware, } }), - frames: (prepared, request, runtime) => - Stream.unwrap( - runtime.http - .execute(prepared.request, prepared.middleware) - .pipe( - Effect.map((response) => - prepared.framing.frame( - response.stream.pipe( - Stream.mapError((error) => - ProviderShared.eventError( - `${request.model.provider}/${request.model.route.id}`, - `Failed to read ${request.model.provider}/${request.model.route.id} stream`, - ProviderShared.errorText(error), - ), - ), - ), - ), - ), - ), - ), + frames: (prepared, _request, runtime) => + prepared.framing.frame(RequestExecutor.stream(runtime.http, prepared.request, prepared.middleware)), }) export const sseJson = { diff --git a/packages/ai/src/route/transport/websocket.ts b/packages/ai/src/route/transport/websocket.ts index 0198deb5c63..b1d8854de1e 100644 --- a/packages/ai/src/route/transport/websocket.ts +++ b/packages/ai/src/route/transport/websocket.ts @@ -1,6 +1,6 @@ import { Cause, Context, Effect, Layer, Queue, Stream } from "effect" import { Headers } from "effect/unstable/http" -import { AIError, TransportReason } from "../../schema/index.js" +import { AIError, TransportReason, type TransportOperation } from "../../schema/index.js" import * as HttpTransport from "./http.js" import type { Transport } from "./index.js" @@ -29,12 +29,18 @@ export class Service extends Context.Service()("@opencode/AI const transportError = ( method: string, message: string, - input: { readonly url?: string; readonly kind?: string } = {}, + input: { readonly operation: TransportOperation; readonly url?: string; readonly code?: string }, ) => new AIError({ module: "WebSocketExecutor", method, - reason: new TransportReason({ message, url: input.url, kind: input.kind }), + reason: new TransportReason({ + message, + transport: "websocket", + operation: input.operation, + url: input.url, + code: input.code, + }), }) const eventMessage = (event: Event) => { @@ -55,7 +61,8 @@ const waitOpen = (ws: globalThis.WebSocket, input: WebSocketRequest) => { return Effect.fail( transportError("open", `WebSocket closed before opening (state ${ws.readyState})`, { url: input.url, - kind: "open", + operation: "request", + code: "closed", }), ) } @@ -79,7 +86,10 @@ const waitOpen = (ws: globalThis.WebSocket, input: WebSocketRequest) => { cleanup() resume( Effect.fail( - transportError("open", `Failed to open WebSocket: ${eventMessage(event)}`, { url: input.url, kind: "open" }), + transportError("open", `Failed to open WebSocket: ${eventMessage(event)}`, { + url: input.url, + operation: "request", + }), ), ) } @@ -89,7 +99,8 @@ const waitOpen = (ws: globalThis.WebSocket, input: WebSocketRequest) => { Effect.fail( transportError("open", `WebSocket closed before opening with code ${event.code}`, { url: input.url, - kind: "open", + operation: "request", + code: String(event.code), }), ), ) @@ -118,7 +129,8 @@ const webSocketUrl = (value: string) => catch: (error) => transportError("prepare", error instanceof Error ? error.message : "Invalid WebSocket URL", { url: value, - kind: "websocket", + operation: "request", + code: "invalid-url", }), }) @@ -129,7 +141,7 @@ export const open = (input: WebSocketRequest) => catch: (error) => transportError("open", error instanceof Error ? error.message : "Failed to construct WebSocket", { url: input.url, - kind: "open", + operation: "request", }), }).pipe(Effect.flatMap((ws) => fromWebSocket(ws, input))) @@ -150,7 +162,10 @@ export const fromWebSocket = ( Queue.failCauseUnsafe( messages, Cause.fail( - transportError("message", "Unsupported WebSocket message payload", { url: input.url, kind: "message" }), + transportError("message", "Unsupported WebSocket message payload", { + url: input.url, + operation: "read", + }), ), ) } @@ -158,7 +173,10 @@ export const fromWebSocket = ( Queue.failCauseUnsafe( messages, Cause.fail( - transportError("message", `WebSocket error: ${eventMessage(event)}`, { url: input.url, kind: "message" }), + transportError("message", `WebSocket error: ${eventMessage(event)}`, { + url: input.url, + operation: "read", + }), ), ) } @@ -167,7 +185,11 @@ export const fromWebSocket = ( Queue.failCauseUnsafe( messages, Cause.fail( - transportError("message", `WebSocket closed with code ${event.code}`, { url: input.url, kind: "close" }), + transportError("message", `WebSocket closed with code ${event.code}`, { + url: input.url, + operation: "read", + code: String(event.code), + }), ), ) } @@ -188,7 +210,7 @@ export const fromWebSocket = ( catch: (error) => transportError("sendText", error instanceof Error ? error.message : "Failed to send WebSocket message", { url: input.url, - kind: "write", + operation: "write", }), }), messages: Stream.fromQueue(messages), @@ -243,7 +265,8 @@ export const json = (input: JsonInput): JsonTransp return Stream.fail( transportError("json", "WebSocket JSON transport requires WebSocketExecutor.Service", { url: prepared.url, - kind: "websocket", + operation: "request", + code: "unavailable", }), ) } diff --git a/packages/ai/src/schema/errors.ts b/packages/ai/src/schema/errors.ts index 0c201450fd9..d03f2f3cf7f 100644 --- a/packages/ai/src/schema/errors.ts +++ b/packages/ai/src/schema/errors.ts @@ -92,10 +92,18 @@ export class ProviderInternalReason extends Schema.Class http: Schema.optional(HttpContext), }) {} +export const TransportType = Schema.Literals(["http", "websocket"]) +export type TransportType = typeof TransportType.Type + +export const TransportOperation = Schema.Literals(["request", "read", "write"]) +export type TransportOperation = typeof TransportOperation.Type + export class TransportReason extends Schema.Class("AI.Error.Transport")({ _tag: Schema.tag("Transport"), message: Schema.String, - kind: Schema.optional(Schema.String), + transport: TransportType, + operation: TransportOperation, + code: Schema.optional(Schema.String), url: Schema.optional(Schema.String), http: Schema.optional(HttpContext), }) {} diff --git a/packages/ai/test/executor.test.ts b/packages/ai/test/executor.test.ts index 1d3353e44b8..25750d174f4 100644 --- a/packages/ai/test/executor.test.ts +++ b/packages/ai/test/executor.test.ts @@ -1,10 +1,10 @@ import { describe, expect } from "bun:test" -import { Effect, Layer, Ref } from "effect" -import { Headers, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" +import { Effect, Layer, Ref, Stream } from "effect" +import { Headers, HttpClient, HttpClientError, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" import { LLM, AIError } from "../src/index.js" import { LLMClient, RequestExecutor } from "../src/route.js" import * as OpenAIChat from "../src/protocols/openai-chat.js" -import { dynamicResponse } from "./lib/http.js" +import { dynamicResponse, systemError } from "./lib/http.js" import { deltaChunk } from "./lib/openai-chunks.js" import { sseRaw } from "./lib/sse.js" import { it } from "./lib/effect.js" @@ -67,6 +67,62 @@ const expectAIError = (error: unknown) => { const errorHttp = (error: AIError) => ("http" in error.reason ? error.reason.http : undefined) describe("RequestExecutor", () => { + it.effect("parses response body failures at the executor seam", () => + Effect.gen(function* () { + const executor = yield* RequestExecutor.Service + const error = yield* RequestExecutor.stream(executor, secretRequest).pipe(Stream.runDrain, Effect.flip) + + expectAIError(error) + expect(error.reason).toMatchObject({ + _tag: "Transport", + message: "ECONNRESET: disconnected ", + transport: "http", + operation: "read", + code: "ECONNRESET", + url: "https://provider.test/v1/chat?api_key=%3Credacted%3E&debug=1", + }) + }).pipe( + Effect.provide( + responsesLayer([ + new Response( + new ReadableStream({ + start(controller) { + controller.error(systemError("ECONNRESET", "disconnected query-secret-123 header-secret-456")) + }, + }), + ), + ]), + ), + ), + ) + + it.effect("unwraps native transport failure causes", () => + Effect.gen(function* () { + const executor = yield* RequestExecutor.Service + const error = yield* RequestExecutor.stream(executor, secretRequest).pipe(Stream.runDrain, Effect.flip) + + expectAIError(error) + expect(error.reason).toMatchObject({ + _tag: "Transport", + message: "ECONNRESET: socket closed", + operation: "read", + code: "ECONNRESET", + }) + }).pipe( + Effect.provide( + responsesLayer([ + new Response( + new ReadableStream({ + pull(controller) { + controller.error(new TypeError("fetch failed", { cause: systemError("ECONNRESET", "socket closed") })) + }, + }), + ), + ]), + ), + ), + ) + it.effect("preserves middleware error messages", () => Effect.gen(function* () { const executor = yield* RequestExecutor.Service @@ -79,6 +135,48 @@ describe("RequestExecutor", () => { }).pipe(Effect.provide(responsesLayer([]))), ) + it.effect("reports the request sent by middleware", () => + Effect.gen(function* () { + const executor = yield* RequestExecutor.Service + const error = yield* executor + .execute(request, (original, handler) => + handler( + original.pipe( + HttpClientRequest.setUrl("https://proxy.test/v1/chat?api_key=proxy-secret"), + HttpClientRequest.setHeader("authorization", "Bearer proxy-secret"), + ), + ), + ) + .pipe(Effect.flip) + + expectAIError(error) + expect(error.reason).toMatchObject({ + _tag: "Transport", + message: "ECONNRESET: proxy disconnected ", + url: "https://proxy.test/v1/chat?api_key=%3Credacted%3E", + http: { + request: { + url: "https://proxy.test/v1/chat?api_key=%3Credacted%3E", + headers: { authorization: "" }, + }, + }, + }) + }).pipe( + Effect.provide( + dynamicResponse((input) => + Effect.fail( + new HttpClientError.HttpClientError({ + reason: new HttpClientError.TransportError({ + request: input.request, + cause: systemError("ECONNRESET", "proxy disconnected proxy-secret"), + }), + }), + ), + ), + ), + ), + ) + it.effect("classifies context overflow responses", () => Effect.gen(function* () { const executor = yield* RequestExecutor.Service diff --git a/packages/ai/test/lib/http.ts b/packages/ai/test/lib/http.ts index e53794aa876..7c98d687ce4 100644 --- a/packages/ai/test/lib/http.ts +++ b/packages/ai/test/lib/http.ts @@ -1,5 +1,5 @@ import { Effect, Layer, Ref } from "effect" -import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" +import { HttpClient, HttpClientError, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" import { LLMClient, RequestExecutor, WebSocketExecutor } from "../../src/route.js" import type { Service as LLMClientService } from "../../src/route/client.js" import type { Service as RequestExecutorService } from "../../src/route/executor.js" @@ -14,7 +14,9 @@ export type HandlerInput = { ) => HttpClientResponse.HttpClientResponse } -export type Handler = (input: HandlerInput) => Effect.Effect +export type Handler = ( + input: HandlerInput, +) => Effect.Effect const handlerLayer = (handler: Handler): Layer.Layer => Layer.succeed( @@ -34,6 +36,12 @@ const handlerLayer = (handler: Handler): Layer.Layer => export type RuntimeEnv = RequestExecutorService | WebSocketExecutorService | LLMClientService +export interface SystemError extends Error { + readonly code: string +} + +export const systemError = (code: string, message: string): SystemError => Object.assign(new Error(message), { code }) + export const runtimeLayer = (layer: Layer.Layer): Layer.Layer => { const requestExecutorLayer = RequestExecutor.layer.pipe(Layer.provide(layer)) const deps = Layer.mergeAll(requestExecutorLayer, WebSocketExecutor.layer) @@ -63,14 +71,20 @@ export const dynamicResponse = (handler: Handler) => runtimeLayer(handlerLayer(h * Layer that emits the supplied SSE chunks and then aborts mid-stream. Used to * exercise transport errors that surface during parsing. */ -export const truncatedStream = (chunks: ReadonlyArray) => +export const truncatedStream = (chunks: ReadonlyArray, error: Error = new Error("connection reset")) => dynamicResponse((input) => Effect.sync(() => { const encoder = new TextEncoder() + let index = 0 const stream = new ReadableStream({ - start(controller) { - for (const chunk of chunks) controller.enqueue(encoder.encode(chunk)) - controller.error(new Error("connection reset")) + pull(controller) { + const chunk = chunks[index] + if (chunk !== undefined) { + index++ + controller.enqueue(encoder.encode(chunk)) + return + } + controller.error(error) }, }) return input.respond(stream, { headers: SSE_HEADERS }) diff --git a/packages/ai/test/provider/anthropic-messages.test.ts b/packages/ai/test/provider/anthropic-messages.test.ts index ab1047f2c92..d8792c3d9df 100644 --- a/packages/ai/test/provider/anthropic-messages.test.ts +++ b/packages/ai/test/provider/anthropic-messages.test.ts @@ -271,6 +271,47 @@ describe("Anthropic Messages route", () => { }), ) + it.effect("batches parallel tool results into one Anthropic user message", () => + Effect.gen(function* () { + const prepared = yield* compileRequest( + LLM.request({ + model, + messages: [ + Message.user("Check both cities."), + Message.assistant([ + { type: "text", text: "I'll check both." }, + ToolCallPart.make({ id: "call_paris", name: "weather", input: { city: "Paris" } }), + ToolCallPart.make({ id: "call_london", name: "weather", input: { city: "London" } }), + ]), + Message.tool({ id: "call_paris", name: "weather", result: { temperature: 22 } }), + Message.tool({ id: "call_london", name: "weather", result: { temperature: 18 } }), + ], + cache: "none", + }), + ) + + expect(prepared.body.messages).toMatchObject([ + { role: "user", content: [{ type: "text", text: "Check both cities." }] }, + { + role: "assistant", + content: [ + { type: "text", text: "I'll check both." }, + { type: "tool_use", id: "call_paris", name: "weather", input: { city: "Paris" } }, + { type: "tool_use", id: "call_london", name: "weather", input: { city: "London" } }, + ], + }, + { + role: "user", + content: [ + { type: "tool_result", tool_use_id: "call_paris", content: '{"temperature":22}' }, + { type: "tool_result", tool_use_id: "call_london", content: '{"temperature":18}' }, + ], + }, + ]) + expect(prepared.body.messages).toHaveLength(3) + }), + ) + it.effect("keeps tools and sends tool_choice none", () => Effect.gen(function* () { const prepared = yield* compileRequest( @@ -915,6 +956,54 @@ describe("Anthropic Messages route", () => { }), ) + it.effect("assembles and persists multiple tool calls from one Anthropic response", () => + Effect.gen(function* () { + const response = yield* LLMClient.generate(request).pipe( + Effect.provide( + fixedResponse( + sseEvents( + { type: "message_start", message: { usage: { input_tokens: 5 } } }, + { + type: "content_block_start", + index: 0, + content_block: { type: "tool_use", id: "call_paris", name: "weather", input: {} }, + }, + { + type: "content_block_delta", + index: 0, + delta: { type: "input_json_delta", partial_json: '{"city":"Paris"}' }, + }, + { type: "content_block_stop", index: 0 }, + { + type: "content_block_start", + index: 1, + content_block: { type: "tool_use", id: "call_london", name: "weather", input: {} }, + }, + { + type: "content_block_delta", + index: 1, + delta: { type: "input_json_delta", partial_json: '{"city":"London"}' }, + }, + { type: "content_block_stop", index: 1 }, + { type: "message_delta", delta: { stop_reason: "tool_use" }, usage: { output_tokens: 2 } }, + { type: "message_stop" }, + ), + ), + ), + ) + + expect(response.toolCalls).toMatchObject([ + { id: "call_paris", name: "weather", input: { city: "Paris" } }, + { id: "call_london", name: "weather", input: { city: "London" } }, + ]) + expect(response.message.content).toMatchObject([ + { type: "tool-call", id: "call_paris", name: "weather", input: { city: "Paris" } }, + { type: "tool-call", id: "call_london", name: "weather", input: { city: "London" } }, + ]) + expect(response.finishReason).toEqual({ normalized: "tool-calls", raw: "tool_use" }) + }), + ) + it.effect("keeps malformed server tool input terminal", () => Effect.gen(function* () { const body = sseEvents( diff --git a/packages/ai/test/provider/openai-chat.test.ts b/packages/ai/test/provider/openai-chat.test.ts index 910e57d26a5..ea327aa1235 100644 --- a/packages/ai/test/provider/openai-chat.test.ts +++ b/packages/ai/test/provider/openai-chat.test.ts @@ -1,5 +1,5 @@ import { describe, expect } from "bun:test" -import { Effect, Schema, Stream } from "effect" +import { Effect, Ref, Schema, Stream } from "effect" import { HttpClientRequest } from "effect/unstable/http" import { HttpOptions, @@ -22,7 +22,7 @@ import { ProviderShared } from "../../src/protocols/shared.js" import { Auth, LLMClient } from "../../src/route.js" import { compileRequest } from "../../src/route/client.js" import { it } from "../lib/effect.js" -import { dynamicResponse, fixedResponse, truncatedStream } from "../lib/http.js" +import { dynamicResponse, fixedResponse, systemError, truncatedStream } from "../lib/http.js" import { deltaChunk, usageChunk } from "../lib/openai-chunks.js" import { sseEvents } from "../lib/sse.js" @@ -1221,12 +1221,44 @@ describe("OpenAI Chat route", () => { it.effect("surfaces transport errors that occur mid-stream", () => Effect.gen(function* () { - const layer = truncatedStream([ - `data: ${JSON.stringify(deltaChunk({ role: "assistant", content: "Hello" }))}\n\n`, - ]) - const error = yield* LLMClient.generate(request).pipe(Effect.provide(layer), Effect.flip) + const layer = truncatedStream( + [`data: ${JSON.stringify(deltaChunk({ role: "assistant", content: "Hello" }))}\n\n`], + systemError("ECONNRESET", "socket closed unexpectedly"), + ) + const events = yield* Ref.make>([]) + const error = yield* LLMClient.stream(request).pipe( + Stream.tap((event) => Ref.update(events, (current) => [...current, event])), + Stream.runDrain, + Effect.provide(layer), + Effect.flip, + ) - expect(error.message).toContain("Failed to read openai/openai-chat stream") + expect((yield* Ref.get(events)).some((event) => event.type === "text-delta")).toBeTrue() + expect(error.reason).toMatchObject({ + _tag: "Transport", + message: "ECONNRESET: socket closed unexpectedly", + transport: "http", + operation: "read", + code: "ECONNRESET", + url: "https://api.openai.test/v1/chat/completions", + }) + }), + ) + + it.effect("surfaces transport errors before the first stream frame", () => + Effect.gen(function* () { + const error = yield* LLMClient.generate(request).pipe( + Effect.provide(truncatedStream([], systemError("ECONNRESET", "socket closed before output"))), + Effect.flip, + ) + + expect(error.reason).toMatchObject({ + _tag: "Transport", + message: "ECONNRESET: socket closed before output", + transport: "http", + operation: "read", + code: "ECONNRESET", + }) }), ) diff --git a/packages/app/e2e/smoke/session-timeline.spec.ts b/packages/app/e2e/smoke/session-timeline.spec.ts index d5330ac7d92..225a7228936 100644 --- a/packages/app/e2e/smoke/session-timeline.spec.ts +++ b/packages/app/e2e/smoke/session-timeline.spec.ts @@ -189,7 +189,12 @@ test.describe("smoke: session timeline", () => { .querySelector('[data-timeline-row="bottom-spacer"]') ?.getBoundingClientRect() samples.push({ ids: visible, last: visible.includes(last), bottomError: bottom?.bottom - view.bottom }) - if (!firstPaint && visible.includes(last) && Math.abs((bottom?.bottom ?? Infinity) - view.bottom) <= 1) { + if ( + !firstPaint && + visible.includes(last) && + Math.abs((bottom?.bottom ?? Infinity) - view.bottom) <= 1 && + !root.querySelector('[data-markdown-key="initial"]') + ) { firstPaint = true root.querySelectorAll("[data-timeline-key]").forEach((row) => { const rect = row.getBoundingClientRect() @@ -204,10 +209,16 @@ test.describe("smoke: session timeline", () => { } ;( window as Window & { - __sessionTabPaint?: { samples: typeof samples; removed: () => number; stop: () => void } + __sessionTabPaint?: { + samples: typeof samples + painted: () => boolean + removed: () => number + stop: () => void + } } ).__sessionTabPaint = { samples, + painted: () => firstPaint, removed: () => removedFirstPaintNodes, stop: () => { running = false @@ -219,17 +230,19 @@ test.describe("smoke: session timeline", () => { ) await switchTitlebarSession(page, fixture.targetID, fixture.expected.targetTitle) - await page.waitForFunction(() => - ( - window as Window & { __sessionTabPaint?: { samples: Array<{ ids: string[] }> } } - ).__sessionTabPaint?.samples.some((sample) => sample.ids.length > 0), - ) + await page.waitForFunction(() => { + const probe = ( + window as Window & { __sessionTabPaint?: { samples: Array<{ ids: string[] }>; painted: () => boolean } } + ).__sessionTabPaint + return probe?.painted() && probe.samples.some((sample) => sample.ids.length > 0) + }) await page.waitForTimeout(200) const first = await page.evaluate(() => { const probe = ( window as Window & { __sessionTabPaint?: { samples: Array<{ ids: string[]; last: boolean; bottomError?: number }> + painted: () => boolean removed: () => number stop: () => void } diff --git a/packages/app/e2e/utils/mock-server.ts b/packages/app/e2e/utils/mock-server.ts index 88cb236bbeb..8efd801c332 100644 --- a/packages/app/e2e/utils/mock-server.ts +++ b/packages/app/e2e/utils/mock-server.ts @@ -391,7 +391,7 @@ export async function mockOpenCodeServer(page: Page, config: MockServerConfig) { if (/^\/api\/session\/[^/]+\/form\/[^/]+\/(reply|cancel)$/.test(path) && route.request().method() === "POST") { return route.fulfill({ status: 204, headers: { "access-control-allow-origin": "*" } }) } - if (/^\/api\/session\/[^/]+\/pending$/.test(path) && route.request().method() === "GET") + if (/^\/api\/session\/[^/]+\/inbox$/.test(path) && route.request().method() === "GET") return json(route, { data: [] }) if (/^\/api\/session\/[^/]+\/permission\/[^/]+\/reply$/.test(path) && route.request().method() === "POST") { return route.fulfill({ status: 204, headers: { "access-control-allow-origin": "*" } }) diff --git a/packages/app/src/context/global-sync/event-reducer.ts b/packages/app/src/context/global-sync/event-reducer.ts index b9ec98b14d1..41e35c7c211 100644 --- a/packages/app/src/context/global-sync/event-reducer.ts +++ b/packages/app/src/context/global-sync/event-reducer.ts @@ -1,4 +1,5 @@ import { Binary } from "@opencode-ai/core/util/binary" +import { ProjectDirectories } from "@opencode-ai/schema/project-directories" import { produce, reconcile, type SetStoreFunction, type Store } from "solid-js/store" import type { Message, Part, Project, Todo } from "@/types" import type { @@ -188,6 +189,18 @@ export function applyDirectoryEvent(input: { input.setStore("sessionTotal", (value) => Math.max(0, value - 1)) break } + case "project.directory.resolved": { + const properties = event.properties as { projectID: string; directory: string; previous: string } + input.store.session.forEach((session, index) => { + const adopted = ProjectDirectories.adopt( + { projectID: session.projectID, directory: session.location.directory }, + properties, + ) + if (!adopted) return + input.setStore("session", index, (current) => ({ ...current, ...adopted })) + }) + break + } case "session.renamed": { const properties = event.properties as { sessionID: string; title: string } const result = Binary.search(input.store.session, properties.sessionID, (session) => session.id) diff --git a/packages/app/src/context/server-session-v2-reducer.test.ts b/packages/app/src/context/server-session-v2-reducer.test.ts index fe6855894d9..5d675fa3dd5 100644 --- a/packages/app/src/context/server-session-v2-reducer.test.ts +++ b/packages/app/src/context/server-session-v2-reducer.test.ts @@ -18,18 +18,18 @@ describe("v2 session reducer", () => { apply({ ...base, id: "evt_admitted", - type: "session.input.admitted", + type: "session.inbox.enqueued", data: { sessionID: "ses_1", - inputID: "msg_user", - input: { type: "user", delivery: "steer", data: { text: "hello" } }, + inboxID: "msg_user", + item: { type: "user", delivery: "steer", payload: { text: "hello" } }, }, }) apply({ ...base, id: "evt_promoted", - type: "session.input.promoted", - data: { sessionID: "ses_1", inputID: "msg_user" }, + type: "session.inbox.delivered", + data: { sessionID: "ses_1", inboxID: "msg_user" }, }) apply({ ...base, @@ -203,8 +203,8 @@ describe("v2 session reducer", () => { event({ ...base, id: "evt_promoted", - type: "session.input.promoted", - data: { sessionID: "ses_1", inputID: "msg_user" }, + type: "session.inbox.delivered", + data: { sessionID: "ses_1", inboxID: "msg_user" }, }), ) @@ -241,11 +241,11 @@ describe("v2 session reducer", () => { event({ ...base, id: "evt_admitted", - type: "session.input.admitted", + type: "session.inbox.enqueued", data: { sessionID: "ses_1", - inputID: "msg_user", - input: { type: "user", delivery: "queue", data: { text: "cancel me" } }, + inboxID: "msg_user", + item: { type: "user", delivery: "queue", payload: { text: "cancel me" } }, }, }), ) @@ -254,8 +254,8 @@ describe("v2 session reducer", () => { event({ ...base, id: "evt_cancelled", - type: "session.input.cancelled", - data: { sessionID: "ses_1", inputID: "msg_user" }, + type: "session.inbox.cancelled", + data: { sessionID: "ses_1", inboxID: "msg_user" }, }), ) const result = reducer.reduce( @@ -263,8 +263,8 @@ describe("v2 session reducer", () => { event({ ...base, id: "evt_promoted", - type: "session.input.promoted", - data: { sessionID: "ses_1", inputID: "msg_user" }, + type: "session.inbox.delivered", + data: { sessionID: "ses_1", inboxID: "msg_user" }, }), ) @@ -278,11 +278,11 @@ describe("v2 session reducer", () => { event({ ...base, id: "evt_admitted", - type: "session.input.admitted", + type: "session.inbox.enqueued", data: { sessionID: "ses_1", - inputID: "msg_user", - input: { type: "user", delivery: "queue", data: { text: "steer me" } }, + inboxID: "msg_user", + item: { type: "user", delivery: "queue", payload: { text: "steer me" } }, }, }), ) @@ -291,8 +291,8 @@ describe("v2 session reducer", () => { event({ ...base, id: "evt_steered", - type: "session.input.steered", - data: { sessionID: "ses_1", inputID: "msg_user" }, + type: "session.inbox.delivery.changed", + data: { sessionID: "ses_1", inboxID: "msg_user", delivery: "steer" }, }), ) reducer.reduce( @@ -300,8 +300,8 @@ describe("v2 session reducer", () => { event({ ...base, id: "evt_queued", - type: "session.input.queued", - data: { sessionID: "ses_1", inputID: "msg_user" }, + type: "session.inbox.delivery.changed", + data: { sessionID: "ses_1", inboxID: "msg_user", delivery: "queue" }, }), ) @@ -310,8 +310,8 @@ describe("v2 session reducer", () => { event({ ...base, id: "evt_promoted", - type: "session.input.promoted", - data: { sessionID: "ses_1", inputID: "msg_user" }, + type: "session.inbox.delivered", + data: { sessionID: "ses_1", inboxID: "msg_user" }, }), ) diff --git a/packages/app/src/context/server-session-v2-reducer.ts b/packages/app/src/context/server-session-v2-reducer.ts index c3681dab564..a7899f310ef 100644 --- a/packages/app/src/context/server-session-v2-reducer.ts +++ b/packages/app/src/context/server-session-v2-reducer.ts @@ -1,4 +1,4 @@ -import type { OpenCodeEvent, SessionMessageInfo, SessionPendingMessage } from "@opencode-ai/client/promise" +import type { OpenCodeEvent, SessionInboxItem, SessionMessageInfo } from "@opencode-ai/client/promise" type Assistant = Extract type Compaction = Extract @@ -13,7 +13,7 @@ export type V2SessionReduction = { } export function createV2SessionReducer() { - const pending = new Map() + const pending = new Map() const reduce = (source: readonly SessionMessageInfo[], event: OpenCodeEvent): V2SessionReduction | undefined => { if (!("data" in event) || !("sessionID" in event.data) || typeof event.data.sessionID !== "string") return @@ -27,57 +27,59 @@ export function createV2SessionReducer() { result(source.some((item) => item.id === message.id) ? [...source] : [...source, message], [message.id]) switch (event.type) { - case "session.input.admitted": - pending.set(key(sessionID, event.data.inputID), event.data.input) - if (event.data.input.type === "user") + case "session.inbox.enqueued": + pending.set(key(sessionID, event.data.inboxID), event.data.item) + if (event.data.item.type === "user") return append({ - id: event.data.inputID, + id: event.data.inboxID, type: "user", - metadata: event.data.input.data.metadata, - text: event.data.input.data.text, - files: event.data.input.data.files, - agents: event.data.input.data.agents, + metadata: event.data.item.payload.metadata, + text: event.data.item.payload.text, + files: event.data.item.payload.files, + agents: event.data.item.payload.agents, time: { created: event.created }, }) + if (event.data.item.type !== "synthetic") return result([...source]) return append({ - id: event.data.inputID, + id: event.data.inboxID, type: "synthetic", - metadata: event.data.input.data.metadata, - text: event.data.input.data.text, - description: event.data.input.data.description, + metadata: event.data.item.payload.metadata, + text: event.data.item.payload.text, + description: event.data.item.payload.description, time: { created: event.created }, }) - case "session.input.cancelled": - pending.delete(key(sessionID, event.data.inputID)) + case "session.inbox.cancelled": + pending.delete(key(sessionID, event.data.inboxID)) return { - ...result(source.filter((item) => item.id !== event.data.inputID)), - removed: source.some((item) => item.id === event.data.inputID) ? [event.data.inputID] : [], + ...result(source.filter((item) => item.id !== event.data.inboxID)), + removed: source.some((item) => item.id === event.data.inboxID) ? [event.data.inboxID] : [], } - case "session.input.promoted": { - const input = pending.get(key(sessionID, event.data.inputID)) - pending.delete(key(sessionID, event.data.inputID)) - const existing = source.find((item) => item.id === event.data.inputID) + case "session.inbox.delivered": { + const input = pending.get(key(sessionID, event.data.inboxID)) + pending.delete(key(sessionID, event.data.inboxID)) + const existing = source.find((item) => item.id === event.data.inboxID) if (existing) { const promoted = { ...existing, time: { ...existing.time, created: event.created } } return result([...source.filter((item) => item.id !== existing.id), promoted], [existing.id]) } - if (!input) return { ...result([...source]), missing: event.data.inputID } + if (!input) return { ...result([...source]), missing: event.data.inboxID } if (input.type === "user") return append({ - id: event.data.inputID, + id: event.data.inboxID, type: "user", - metadata: input.data.metadata, - text: input.data.text, - files: input.data.files, - agents: input.data.agents, + metadata: input.payload.metadata, + text: input.payload.text, + files: input.payload.files, + agents: input.payload.agents, time: { created: event.created }, }) + if (input.type !== "synthetic") return result([...source]) return append({ - id: event.data.inputID, + id: event.data.inboxID, type: "synthetic", - metadata: input.data.metadata, - text: input.data.text, - description: input.data.description, + metadata: input.payload.metadata, + text: input.payload.text, + description: input.payload.description, time: { created: event.created }, }) } @@ -394,7 +396,7 @@ export function createV2SessionReducer() { metadata: event.metadata, reason: event.data.reason, summary: "", - recent: event.data.recent, + recent: event.data.recent ?? "", time: { created: event.created }, }) case "session.compaction.delta": diff --git a/packages/app/src/context/server-session.test.ts b/packages/app/src/context/server-session.test.ts index 174fef77ab1..5e9fe349631 100644 --- a/packages/app/src/context/server-session.test.ts +++ b/packages/app/src/context/server-session.test.ts @@ -355,11 +355,11 @@ describe("server session", () => { apply({ id: "evt_admitted", created: 1, - type: "session.input.admitted", + type: "session.inbox.enqueued", data: { sessionID: "child", - inputID: "msg_input", - input: { type: "user", delivery: "steer", data: { text: "hello" } }, + inboxID: "msg_input", + item: { type: "user", delivery: "steer", payload: { text: "hello" } }, }, }) apply({ @@ -377,8 +377,8 @@ describe("server session", () => { apply({ id: "evt_cancelled", created: 3, - type: "session.input.cancelled", - data: { sessionID: "child", inputID: "msg_input" }, + type: "session.inbox.cancelled", + data: { sessionID: "child", inboxID: "msg_input" }, }) apply({ id: "evt_form_done", @@ -401,11 +401,11 @@ describe("server session", () => { ctx.store.applyV2({ id: "evt_admitted", created: 1, - type: "session.input.admitted", + type: "session.inbox.enqueued", data: { sessionID: "child", - inputID: "msg_input", - input: { type: "user", delivery: "queue", data: { text: "new" } }, + inboxID: "msg_input", + item: { type: "user", delivery: "queue", payload: { text: "new" } }, }, } as OpenCodeEvent) response.resolve({ pending: [], forms: [] }) diff --git a/packages/app/src/context/server-session.ts b/packages/app/src/context/server-session.ts index afa207c4964..f7beb8ea658 100644 --- a/packages/app/src/context/server-session.ts +++ b/packages/app/src/context/server-session.ts @@ -1,12 +1,13 @@ import { Binary } from "@opencode-ai/core/util/binary" +import { ProjectDirectories } from "@opencode-ai/schema/project-directories" import { retry } from "@opencode-ai/core/util/retry" import type { FormInfo, OpenCodeEvent, SessionApi, SessionInfo, + SessionInboxInfo, SessionMessageInfo, - SessionPendingInfo, } from "@opencode-ai/client/promise" import type { Message, Part, Todo } from "@/types" import type { FileDiffInfo, PermissionRequest, QuestionRequest, SessionStatus } from "@opencode-ai/client/promise" @@ -199,7 +200,7 @@ export function createServerSession( permission: {} as Record, question: {} as Record, form: {} as Record, - pending: {} as Record, + pending: {} as Record, input: {} as Record, message: {} as Record, session_message: {} as Record, @@ -926,47 +927,49 @@ export function createServerSession( setData("form", event.data.sessionID, (forms) => forms?.filter((form) => form.id !== event.data.id)) return } + if (event.type === "project.directory.resolved") { + Object.values(data.info).forEach((info) => { + if (!info) return + const adopted = ProjectDirectories.adopt( + { projectID: info.projectID, directory: info.location.directory }, + event.data, + ) + if (adopted) remember({ ...info, ...adopted }) + }) + return + } if (!("data" in event) || !("sessionID" in event.data) || typeof event.data.sessionID !== "string") return const sessionID = event.data.sessionID if ( - event.type === "session.input.admitted" || - event.type === "session.input.steered" || - event.type === "session.input.queued" || - event.type === "session.input.cancelled" || - event.type === "session.input.promoted" || - event.type === "session.compaction.admitted" || + event.type === "session.inbox.enqueued" || + event.type === "session.inbox.delivery.changed" || + event.type === "session.inbox.cancelled" || + event.type === "session.inbox.delivered" || event.type === "session.compaction.started" || event.type === "session.compaction.ended" || event.type === "session.compaction.failed" ) transientRevision.set(sessionID, (transientRevision.get(sessionID) ?? 0) + 1) - if (event.type === "session.input.admitted") { + if (event.type === "session.inbox.enqueued") { const current = data.pending[sessionID] ?? [] - if (!current.some((item) => item.id === event.data.inputID)) + if (!current.some((item) => item.id === event.data.inboxID)) setData("pending", sessionID, [ ...current, - { id: event.data.inputID, sessionID, timeCreated: event.created, ...event.data.input }, + { id: event.data.inboxID, sessionID, timeCreated: event.created, ...event.data.item }, ]) - if (!data.input[sessionID]?.includes(event.data.inputID)) - setData("input", sessionID, [...(data.input[sessionID] ?? []), event.data.inputID]) + if (!data.input[sessionID]?.includes(event.data.inboxID)) + setData("input", sessionID, [...(data.input[sessionID] ?? []), event.data.inboxID]) } - if (event.type === "session.input.steered" || event.type === "session.input.queued") + if (event.type === "session.inbox.delivery.changed") setData("pending", sessionID, (items) => items?.map((item) => - item.id === event.data.inputID && item.type !== "compaction" - ? { ...item, delivery: event.type === "session.input.steered" ? "steer" : "queue" } - : item, + item.id === event.data.inboxID ? { ...item, delivery: event.data.delivery } : item, ), ) - if (event.type === "session.input.cancelled" || event.type === "session.input.promoted") { - setData("pending", sessionID, (items) => items?.filter((item) => item.id !== event.data.inputID)) - setData("input", sessionID, (items) => items?.filter((id) => id !== event.data.inputID)) + if (event.type === "session.inbox.cancelled" || event.type === "session.inbox.delivered") { + setData("pending", sessionID, (items) => items?.filter((item) => item.id !== event.data.inboxID)) + setData("input", sessionID, (items) => items?.filter((id) => id !== event.data.inboxID)) } - if (event.type === "session.compaction.admitted") - setData("pending", sessionID, [ - ...(data.pending[sessionID] ?? []).filter((item) => item.id !== event.data.inputID), - { id: event.data.inputID, sessionID, timeCreated: event.created, type: "compaction" }, - ]) if (event.type === "session.compaction.started" || event.type === "session.compaction.failed") setData("pending", sessionID, (items) => items?.filter((item) => item.id !== event.data.inputID)) if (event.type === "session.compaction.ended") @@ -1351,7 +1354,7 @@ export function createServerSession( sync, async hydrateTransient( sessionID: string, - load: () => Promise<{ pending: SessionPendingInfo[]; forms: FormInfo[] }>, + load: () => Promise<{ pending: SessionInboxInfo[]; forms: FormInfo[] }>, ) { const revision = transientRevision.get(sessionID) ?? 0 const result = await load() diff --git a/packages/app/src/context/server-sync.tsx b/packages/app/src/context/server-sync.tsx index 3029ee37e5b..b7e9d93fc0a 100644 --- a/packages/app/src/context/server-sync.tsx +++ b/packages/app/src/context/server-sync.tsx @@ -208,7 +208,7 @@ export function createServerSyncContextInner(serverSDK: ServerSDK) { const hydrateSessionState = async (sessionID: string) => { await session.hydrateTransient(sessionID, async () => { const [pending, forms] = await Promise.all([ - serverSDK.api.session.pending.list({ sessionID }), + serverSDK.api.session.inbox.list({ sessionID }), serverSDK.api.form.list({ sessionID }), ]) return { pending, forms } diff --git a/packages/cli/src/acp/event.ts b/packages/cli/src/acp/event.ts index 5d33111ec5c..750b92f83a5 100644 --- a/packages/cli/src/acp/event.ts +++ b/packages/cli/src/acp/event.ts @@ -538,9 +538,8 @@ async function replayMessage( } function matchesStart(event: EventSubscribeOutput, start: TurnStart) { - if (start.type === "input") return event.type === "session.input.promoted" && event.data.inputID === start.id - if (start.type === "compaction") - return event.type === "session.compaction.admitted" && event.data.inputID === start.id + if (start.type === "input") return event.type === "session.inbox.delivered" && event.data.inboxID === start.id + if (start.type === "compaction") return event.type === "session.inbox.delivered" && event.data.inboxID === start.id return event.type === "session.skill.activated" && event.id === start.id.replace(/^msg_/, "evt_") } diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index e655802b7bf..6ee62f2d5a6 100644 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -1,7 +1,8 @@ export * as Config from "./config" import { Global } from "@opencode-ai/util/global" -import { Context, Effect, FileSystem, Layer, Option, Schema, Semaphore } from "effect" +import { Flock } from "@opencode-ai/util/flock" +import { Context, Effect, FileSystem, Layer, Option, Schema } from "effect" import { produce, type Draft } from "immer" import { applyEdits, modify, parse, type ParseError } from "jsonc-parser" import path from "path" @@ -28,7 +29,6 @@ export const layer = Layer.effect( const fs = yield* FileSystem.FileSystem const global = yield* Global.Service const file = path.join(global.config, "cli.json") - const lock = yield* Semaphore.make(1) const readJson = Effect.fnUntraced(function* () { const text = yield* fs.readFileString(file).pipe(Effect.catch(() => Effect.succeed(undefined))) @@ -49,38 +49,60 @@ export const layer = Layer.effect( const migrate = ConfigMigration.run({ file, config: global.config, state: global.state }).pipe( Effect.provideService(FileSystem.FileSystem, fs), ) + const withLock = (effect: Effect.Effect) => + Effect.scoped( + Effect.uninterruptibleMask((restore) => + Effect.gen(function* () { + const lock = yield* restore( + Effect.promise((signal) => Flock.acquire(file, { dir: path.join(global.state, "locks"), signal })), + ) + yield* Effect.addFinalizer(() => Effect.promise(() => lock.release())) + return yield* restore(effect) + }), + ), + ) - const get = Effect.fn("cli.config.get")(function* () { - yield* migrate.pipe(Effect.catchCause((cause) => Effect.logWarning("failed to migrate cli config", { cause }))) - return Option.getOrElse(decode(yield* readJson()), () => empty) - }) + const get = Effect.fn("cli.config.get")(() => + withLock( + Effect.gen(function* () { + const migration = yield* migrate.pipe( + Effect.catchCause((cause) => + Effect.logWarning("failed to migrate cli config", { cause }).pipe(Effect.as(undefined)), + ), + ) + if (migration?.cause) + yield* Effect.logWarning("failed to persist migrated cli config", { cause: migration.cause }) + if (migration?.info) return migration.info + return Option.getOrElse(decode(yield* readJson()), () => empty) + }), + ), + ) const update = Effect.fn("cli.config.update")((update: (draft: Draft) => void) => - lock - .withPermits(1)( - Effect.gen(function* () { - yield* migrate - const current = Option.getOrElse(decode(yield* readJson()), () => empty) - const next = produce(current, update) - const edits = changes(current, next) - if (!edits.length) return current - const text = yield* fs.readFileString(file).pipe(Effect.catch(() => Effect.succeed("{}"))) - const updated = edits.reduce( - (text, edit) => - applyEdits( - text, - modify(text, edit.path, edit.value, { formattingOptions: { tabSize: 2, insertSpaces: true } }), - ), - text, - ) - const errors: ParseError[] = [] - const config = Option.getOrUndefined(decode(parse(updated, errors, { allowTrailingComma: true }))) - if (errors.length || config === undefined) return yield* Effect.fail(new Error("Invalid CLI config update")) - yield* write(updated.endsWith("\n") ? updated : updated + "\n") - return config - }), - ) - .pipe(Effect.mapError((cause) => new Error("Failed to update CLI config", { cause }))), + withLock( + Effect.gen(function* () { + const migration = yield* migrate + if (migration?.cause) return yield* Effect.failCause(migration.cause) + const current = migration?.info ?? Option.getOrElse(decode(yield* readJson()), () => empty) + const next = produce(current, update) + const edits = changes(current, next) + if (!edits.length) return current + const text = yield* fs.readFileString(file).pipe(Effect.catch(() => Effect.succeed("{}"))) + const updated = edits.reduce( + (text, edit) => + applyEdits( + text, + modify(text, edit.path, edit.value, { formattingOptions: { tabSize: 2, insertSpaces: true } }), + ), + text, + ) + const errors: ParseError[] = [] + const config = Option.getOrUndefined(decode(parse(updated, errors, { allowTrailingComma: true }))) + if (errors.length || config === undefined) return yield* Effect.fail(new Error("Invalid CLI config update")) + yield* write(updated.endsWith("\n") ? updated : updated + "\n") + return config + }), + ).pipe(Effect.mapError((cause) => new Error("Failed to update CLI config", { cause }))), ) return Service.of({ path: file, get, update }) diff --git a/packages/cli/src/config/migrate.ts b/packages/cli/src/config/migrate.ts index f9677225b1b..44cb7b6e98a 100644 --- a/packages/cli/src/config/migrate.ts +++ b/packages/cli/src/config/migrate.ts @@ -1,13 +1,18 @@ export * as ConfigMigration from "./migrate" import { TuiConfigV1 } from "@opencode-ai/tui/config/v1" +import { TuiKeybind } from "@opencode-ai/tui/config/v1/keybind" +import { Definitions } from "@opencode-ai/tui/config/keybind" import { Effect, FileSystem, Option, Schema } from "effect" -import { parse, type ParseError } from "jsonc-parser" +import { randomUUID } from "crypto" +import { createScanner, parse, parseTree, type Node, type ParseError } from "jsonc-parser" import path from "path" -import type { Info } from "./schema" +import { Info } from "./schema" const decodeV1 = Schema.decodeUnknownOption(TuiConfigV1.Info) +const decodeInfo = Schema.decodeUnknownOption(Info) const decodeRecord = Schema.decodeUnknownOption(Schema.Record(Schema.String, Schema.Any)) +const LegacyKeybindTargets = new Set(Object.values(TuiKeybind.CommandMap)) export const run = Effect.fn("cli.config.migrate")(function* (input: { readonly file: string @@ -15,7 +20,60 @@ export const run = Effect.fn("cli.config.migrate")(function* (input: { readonly state: string }) { const fs = yield* FileSystem.FileSystem - if (yield* fs.exists(input.file).pipe(Effect.orElseSucceed(() => false))) return + const persist = Effect.fnUntraced(function* (text: string, info: Info) { + const temp = `${input.file}.${process.pid}.${randomUUID()}.tmp` + const cause = yield* Effect.gen(function* () { + yield* fs.makeDirectory(path.dirname(input.file), { recursive: true }) + yield* fs.writeFileString(temp, text, { mode: 0o600 }) + yield* fs.rename(temp, input.file) + }).pipe( + Effect.as(undefined), + Effect.catchCause((cause) => Effect.succeed(cause)), + Effect.ensuring(fs.remove(temp).pipe(Effect.ignore)), + ) + return cause === undefined ? { info } : { info, cause } + }) + + if (yield* fs.exists(input.file).pipe(Effect.orElseSucceed(() => false))) { + const text = yield* fs.readFileString(input.file) + const errors: ParseError[] = [] + const value: any = parse(text, errors, { allowTrailingComma: true }) + if (errors.length) return + const config = Option.getOrUndefined(decodeRecord(value)) + if (config === undefined) return + const keybinds = Option.getOrUndefined(decodeRecord(config.keybinds)) + if (keybinds === undefined) return + const deduped = findKeybindObjects(text) + .slice(0, -1) + .reduce((text) => { + const property = findKeybindObjects(text)[0] + return property === undefined ? text : removeProperty(text, property) + }, text) + const updated = Object.keys(keybinds).reduce((text, name) => { + const target = + TuiKeybind.CommandMap[name as keyof typeof TuiKeybind.CommandMap] ?? + (name in Definitions || LegacyKeybindTargets.has(name) ? name : undefined) + if (target === undefined) return text + const properties = findKeybindProperties(text, name) + if (!properties.length) return text + const remove = !(target in Definitions) || (target !== name && target in keybinds) + // The parser gives the final duplicate precedence, so remove earlier properties before renaming it. + const updated = properties.slice(0, remove ? properties.length : -1).reduce((text) => { + const property = findKeybindProperties(text, name)[0] + return property === undefined ? text : removeProperty(text, property) + }, text) + if (remove) return updated + if (target === name) return updated + const key = findKeybindProperties(updated, name)[0]?.children?.[0] + if (key === undefined) return text + return updated.slice(0, key.offset) + JSON.stringify(target) + updated.slice(key.offset + key.length) + }, deduped) + if (updated === text) return + const updatedErrors: ParseError[] = [] + const info = Option.getOrUndefined(decodeInfo(parse(updated, updatedErrors, { allowTrailingComma: true }))) + if (updatedErrors.length || info === undefined) return + return yield* persist(updated, info) + } const legacyValue = yield* readJson(path.join(input.config, "tui.json")) const legacy = Option.getOrUndefined(decodeV1(legacyValue)) @@ -23,19 +81,59 @@ export const run = Effect.fn("cli.config.migrate")(function* (input: { const migrated = migrateV1(legacy, kv ?? {}) if (!Object.keys(migrated).length) return - const temp = input.file + ".tmp" - yield* fs.makeDirectory(path.dirname(input.file), { recursive: true }) - yield* fs.writeFileString(temp, JSON.stringify(migrated, null, 2) + "\n", { mode: 0o600 }) - yield* fs.rename(temp, input.file) - yield* Effect.logInfo("migrated cli config", { - from: [ - legacyValue === undefined ? undefined : path.join(input.config, "tui.json"), - kv === undefined ? undefined : path.join(input.state, "kv.json"), - ].filter(Boolean), - to: input.file, - }) + const result = yield* persist(JSON.stringify(migrated, null, 2) + "\n", migrated) + if (result.cause === undefined) + yield* Effect.logInfo("migrated cli config", { + from: [ + legacyValue === undefined ? undefined : path.join(input.config, "tui.json"), + kv === undefined ? undefined : path.join(input.state, "kv.json"), + ].filter(Boolean), + to: input.file, + }) + return result }) +function findKeybindProperties(text: string, name: string) { + const keybinds = findKeybindObjects(text).at(-1)?.children?.[1] + return keybinds?.children?.filter((property) => property.children?.[0]?.value === name) ?? [] +} + +function findKeybindObjects(text: string) { + const tree = parseTree(text) + if (tree === undefined) return [] + return tree.children?.filter((property) => property.children?.[0]?.value === "keybinds") ?? [] +} + +function removeProperty(text: string, property: Node) { + const properties = property.parent?.children ?? [] + const index = properties.indexOf(property) + const end = property.offset + property.length + const next = properties[index + 1] + if (next) { + const comma = findComma(text, end, next.offset) + if (comma !== undefined) return text.slice(0, property.offset) + text.slice(end, comma) + text.slice(comma + 1) + } + const previous = properties[index - 1] + if (previous) { + const comma = findComma(text, previous.offset + previous.length, property.offset) + if (comma !== undefined) return text.slice(0, comma) + text.slice(comma + 1, property.offset) + text.slice(end) + } + const comma = findComma(text, end, (property.parent?.offset ?? 0) + (property.parent?.length ?? 0)) + if (comma !== undefined) return text.slice(0, property.offset) + text.slice(end, comma) + text.slice(comma + 1) + return text.slice(0, property.offset) + text.slice(end) +} + +function findComma(text: string, start: number, end: number) { + const scanner = createScanner(text, false) + scanner.setPosition(start) + while (true) { + scanner.scan() + const offset = scanner.getTokenOffset() + if (scanner.getTokenLength() === 0 || offset >= end) return + if (text[offset] === ",") return offset + } +} + export function migrateV1(legacy: TuiConfigV1.Info | undefined, kv: Record): Info { const plugins = [ ...(legacy?.plugin?.map((plugin) => @@ -49,6 +147,16 @@ export function migrateV1(legacy: TuiConfigV1.Info | undefined, kv: Record { + const target = TuiKeybind.CommandMap[name as keyof typeof TuiKeybind.CommandMap] ?? name + if (!(target in Definitions)) return [] + return [[target, value]] + }), + ) return { ...(themeName !== undefined || themeMode !== undefined @@ -59,7 +167,7 @@ export function migrateV1(legacy: TuiConfigV1.Info | undefined, kv: Record { delta: "before admission", }), ) - send(durableEvent("session.input.promoted", { sessionID: "ses_b", inputID: id })) - send(durableEvent("session.input.promoted", { sessionID: "ses_a", inputID: "input_other" })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_b", inboxID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_a", inboxID: "input_other" })) send( ephemeralEvent("session.text.delta", { sessionID: "ses_a", @@ -32,7 +32,7 @@ describe("acp event behavior", () => { delta: "wrong input", }), ) - send(durableEvent("session.input.promoted", { sessionID: "ses_a", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_a", inboxID: id })) send( ephemeralEvent("session.text.delta", { sessionID: "ses_b", @@ -68,7 +68,7 @@ describe("acp event behavior", () => { fixture, connection: recordingConnection(updates), sessionID: "ses_a", - inputID: "input_a", + inboxID: "input_a", }) expect(fixture.requests.slice(0, 2).map((request) => request.path)).toEqual([ @@ -99,7 +99,7 @@ describe("acp event behavior", () => { const updates: SessionUpdateParams[] = [] const fixture = createSseFixture({ async onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_order", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_order", inboxID: id })) send( ephemeralEvent("session.reasoning.delta", { sessionID: "ses_order", @@ -148,7 +148,7 @@ describe("acp event behavior", () => { }, requestPermission: async () => ({ outcome: { outcome: "cancelled" } }), } satisfies Connection - const result = turn({ fixture, connection, sessionID: "ses_order", inputID: "input_order" }) + const result = turn({ fixture, connection, sessionID: "ses_order", inboxID: "input_order" }) try { await withTimeout(firstUpdate.promise, "first ordered update was not delivered") @@ -195,7 +195,7 @@ describe("acp event behavior", () => { const updates: SessionUpdateParams[] = [] const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_parent", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_parent", inboxID: id })) send( durableEvent("session.created", { sessionID: "ses_child", @@ -240,7 +240,7 @@ describe("acp event behavior", () => { fixture, connection: recordingConnection(updates), sessionID: "ses_parent", - inputID: "input_parent", + inboxID: "input_parent", }) expect(updates.map((item) => [item.sessionId, item.update.sessionUpdate])).toEqual([ @@ -276,7 +276,7 @@ describe("acp event behavior", () => { const completed = Promise.withResolvers() const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_parent", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_parent", inboxID: id })) send( durableEvent("session.created", { sessionID: "ses_background", @@ -292,7 +292,7 @@ describe("acp event behavior", () => { fixture, connection: recordingConnection(updates), sessionID: "ses_parent", - inputID: "input_parent", + inboxID: "input_parent", childSessionUpdate: async (update) => { childUpdates.push(update) if (update.type === "status" && update.status === "completed") completed.resolve() @@ -370,7 +370,7 @@ describe("acp event behavior", () => { const updates: SessionUpdateParams[] = [] const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_tools", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_tools", inboxID: id })) send( durableEvent("session.tool.input.started", { sessionID: "ses_tools", @@ -460,7 +460,7 @@ describe("acp event behavior", () => { fixture, connection: recordingConnection(updates), sessionID: "ses_tools", - inputID: "input_tools", + inboxID: "input_tools", }) expect( @@ -597,7 +597,7 @@ describe("acp event behavior", () => { const control: TurnControl = { cancelled: false, admission: new AbortController() } const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_cancel", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_cancel", inboxID: id })) }, onInterrupt({ sessionID, send }) { send(durableEvent("session.execution.interrupted", { sessionID, reason: "user" })) @@ -680,7 +680,7 @@ describe("acp event behavior", () => { test("cancels unsupported session forms so execution can continue", async () => { const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_form", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_form", inboxID: id })) send( ephemeralEvent("form.created", { form: { @@ -704,7 +704,7 @@ describe("acp event behavior", () => { fixture, connection: recordingConnection([]), sessionID: "ses_form", - inputID: "input_form", + inboxID: "input_form", }) expect(response.stopReason).toBe("end_turn") @@ -730,7 +730,7 @@ function turn(input: { readonly fixture: Fixture readonly connection: Connection readonly sessionID: string - readonly inputID: string + readonly inboxID: string readonly childSessionUpdate?: (update: ChildSessionUpdate) => Promise }) { return streamTurn({ @@ -738,12 +738,12 @@ function turn(input: { connection: input.connection, sessionID: input.sessionID, cwd: "/workspace", - start: { type: "input", id: input.inputID }, + start: { type: "input", id: input.inboxID }, writeTextFile: false, control: { cancelled: false, admission: new AbortController() }, childSessionUpdate: input.childSessionUpdate, submit: (signal) => - input.fixture.client.session.prompt({ sessionID: input.sessionID, id: input.inputID, text: "hello" }, { signal }), + input.fixture.client.session.prompt({ sessionID: input.sessionID, id: input.inboxID, text: "hello" }, { signal }), }) } diff --git a/packages/cli/test/acp/event.test.ts b/packages/cli/test/acp/event.test.ts index 575705b294e..9a37e5e9139 100644 --- a/packages/cli/test/acp/event.test.ts +++ b/packages/cli/test/acp/event.test.ts @@ -34,8 +34,8 @@ test("acp prompt resolves after ordered turn updates", async () => { send(events, { id: "evt_promoted", created: 1, - type: "session.input.promoted", - data: { sessionID: "ses_test", inputID: id }, + type: "session.inbox.delivered", + data: { sessionID: "ses_test", inboxID: id }, }) send(events, { id: "evt_text", diff --git a/packages/cli/test/acp/permission-behavior.test.ts b/packages/cli/test/acp/permission-behavior.test.ts index 3dabbe57144..0290c873040 100644 --- a/packages/cli/test/acp/permission-behavior.test.ts +++ b/packages/cli/test/acp/permission-behavior.test.ts @@ -38,7 +38,7 @@ describe("acp permission behavior", () => { const permissionRequests: RequestPermissionRequest[] = [] const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_allow", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_allow", inboxID: id })) send( permissionAsked("ses_allow", "perm_once", { action: "shell", @@ -112,7 +112,7 @@ describe("acp permission behavior", () => { const permissionRequests: RequestPermissionRequest[] = [] const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_external", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_external", inboxID: id })) send( permissionAsked("ses_external", "perm_external", { action: "external_directory", @@ -157,7 +157,7 @@ describe("acp permission behavior", () => { const permissionRequests: RequestPermissionRequest[] = [] const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_parent", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_parent", inboxID: id })) send( durableEvent("session.created", { sessionID: "ses_child", @@ -219,7 +219,7 @@ describe("acp permission behavior", () => { const writes: Parameters[0][] = [] const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_edit", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_edit", inboxID: id })) send( durableEvent("session.tool.input.started", { sessionID: "ses_edit", @@ -309,7 +309,7 @@ describe("acp permission behavior", () => { const writes: Parameters[0][] = [] const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_patch", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_patch", inboxID: id })) send( durableEvent("session.tool.input.started", { sessionID: "ses_patch", @@ -389,7 +389,7 @@ describe("acp permission behavior", () => { test("rejects explicit rejection, cancellation, and permission UI failure", async () => { const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_reject", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_reject", inboxID: id })) send(permissionAsked("ses_reject", "perm_selected_reject")) send(permissionAsked("ses_reject", "perm_cancelled")) send(permissionAsked("ses_reject", "perm_failed")) @@ -426,7 +426,7 @@ describe("acp permission behavior", () => { const permissionRequests: RequestPermissionRequest[] = [] const fixture = createSseFixture({ onPrompt({ id, send }) { - send(durableEvent("session.input.promoted", { sessionID: "ses_serial", inputID: id })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_serial", inboxID: id })) send(permissionAsked("ses_serial", "perm_1")) send(permissionAsked("ses_serial", "perm_2")) send(durableEvent("session.execution.succeeded", { sessionID: "ses_serial" })) @@ -477,8 +477,8 @@ describe("acp permission behavior", () => { const blockedID = promptIDs.get("ses_blocked") const freeID = promptIDs.get("ses_free") if (!blockedID || !freeID) throw new Error("both permission test prompts must be registered") - send(durableEvent("session.input.promoted", { sessionID: "ses_blocked", inputID: blockedID })) - send(durableEvent("session.input.promoted", { sessionID: "ses_free", inputID: freeID })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_blocked", inboxID: blockedID })) + send(durableEvent("session.inbox.delivered", { sessionID: "ses_free", inboxID: freeID })) send(permissionAsked("ses_blocked", "perm_blocked")) send( ephemeralEvent("session.text.delta", { @@ -538,16 +538,16 @@ describe("acp permission behavior", () => { }) }) -function startTurn(fixture: Fixture, connection: Connection, sessionID: string, inputID: string, cwd = "/workspace") { +function startTurn(fixture: Fixture, connection: Connection, sessionID: string, inboxID: string, cwd = "/workspace") { return streamTurn({ client: fixture.client, connection, sessionID, cwd, - start: { type: "input", id: inputID }, + start: { type: "input", id: inboxID }, writeTextFile: true, control: { cancelled: false, admission: new AbortController() }, - submit: (signal) => fixture.client.session.prompt({ sessionID, id: inputID, text: "hello" }, { signal }), + submit: (signal) => fixture.client.session.prompt({ sessionID, id: inboxID, text: "hello" }, { signal }), }) } diff --git a/packages/cli/test/acp/service-usage.test.ts b/packages/cli/test/acp/service-usage.test.ts index e7abb74073c..be6e4aee3e1 100644 --- a/packages/cli/test/acp/service-usage.test.ts +++ b/packages/cli/test/acp/service-usage.test.ts @@ -15,8 +15,8 @@ describe("acp service prompt routing and usage", () => { const id = requestID(request) completeTurn(context, "ses_routes", { id: `evt_${id}`, - type: "session.input.promoted", - data: { sessionID: "ses_routes", inputID: id }, + type: "session.inbox.delivered", + data: { sessionID: "ses_routes", inboxID: id }, }) return Response.json({ data: {} }) } @@ -33,8 +33,8 @@ describe("acp service prompt routing and usage", () => { const id = requestID(request) completeTurn(context, "ses_routes", { id: `evt_${id}`, - type: "session.compaction.admitted", - data: { sessionID: "ses_routes", inputID: id }, + type: "session.inbox.delivered", + data: { sessionID: "ses_routes", inboxID: id }, }) return Response.json({ data: {} }) } @@ -95,8 +95,8 @@ describe("acp service prompt routing and usage", () => { const id = requestID(request) context.send({ id: `evt_${id}`, - type: "session.input.promoted", - data: { sessionID: "ses_usage", inputID: id }, + type: "session.inbox.delivered", + data: { sessionID: "ses_usage", inboxID: id }, }) context.send({ id: "evt_step", @@ -189,8 +189,8 @@ describe("acp service prompt routing and usage", () => { const id = requestID(request) context.send({ id: `evt_${id}`, - type: "session.input.promoted", - data: { sessionID: "ses_usage_failure", inputID: id }, + type: "session.inbox.delivered", + data: { sessionID: "ses_usage_failure", inboxID: id }, }) context.send({ id: "evt_step_failure", diff --git a/packages/cli/test/config.test.ts b/packages/cli/test/config.test.ts index 3c5865b8afb..ef0163f350c 100644 --- a/packages/cli/test/config.test.ts +++ b/packages/cli/test/config.test.ts @@ -1,7 +1,9 @@ import { NodeFileSystem } from "@effect/platform-node" +import { Flock } from "@opencode-ai/util/flock" import { Global } from "@opencode-ai/util/global" -import { Effect } from "effect" +import { Effect, FileSystem, Option } from "effect" import { expect, test } from "bun:test" +import { parse } from "jsonc-parser" import path from "path" import { Config } from "../src/config" @@ -21,7 +23,14 @@ test("migrates tui and kv config into cli.json", async () => { path.join(directory, "tui.json"), JSON.stringify({ theme: "legacy", - keybinds: { leader: "ctrl+o" }, + keybinds: { + leader: "ctrl+o", + app_exit: "ctrl+q", + app_heap_snapshot: "ctrl+h", + input_paste: { key: "ctrl+v", preventDefault: false }, + session_delete: false, + "dialog.select.next": "ctrl+n", + }, plugin: [["example", { mode: "safe" }]], plugin_enabled: { disabled: false }, leader_timeout: 500, @@ -65,7 +74,13 @@ test("migrates tui and kv config into cli.json", async () => { expect(config).toMatchObject({ theme: { name: "legacy", mode: "light" }, - keybinds: { leader: "ctrl+o" }, + keybinds: { + leader: "ctrl+o", + "app.exit": "ctrl+q", + "prompt.paste": { key: "ctrl+v", preventDefault: false }, + "session.delete": false, + "dialog.select.next": "ctrl+n", + }, plugins: [{ package: "example", options: { mode: "safe" } }, "-disabled"], leader: { timeout: 500 }, scroll: { speed: 2, acceleration: true }, @@ -80,7 +95,13 @@ test("migrates tui and kv config into cli.json", async () => { expect(config).not.toHaveProperty("skipped_version") expect(config).not.toHaveProperty("which_key") expect(config).not.toHaveProperty("hints") - expect((await Bun.file(path.join(directory, "cli.json")).json()).keybinds).toEqual({ leader: "ctrl+o" }) + expect((await Bun.file(path.join(directory, "cli.json")).json()).keybinds).toEqual({ + leader: "ctrl+o", + "app.exit": "ctrl+q", + "prompt.paste": { key: "ctrl+v", preventDefault: false }, + "session.delete": false, + "dialog.select.next": "ctrl+n", + }) expect(await Bun.file(path.join(directory, "cli.json")).exists()).toBe(true) expect(await Bun.file(path.join(directory, "tui.json")).exists()).toBe(true) expect(await Bun.file(path.join(directory, "kv.json")).exists()).toBe(true) @@ -141,6 +162,257 @@ test("preserves legacy cursor settings", async () => { } }) +test("migrates legacy keybind names in an existing cli.json", async () => { + const directory = await Bun.$`mktemp -d`.text().then((value) => value.trim()) + const file = path.join(directory, "cli.json") + await Bun.write( + file, + `{ + // Preserve this comment + "keybinds": { + // Session list shortcut + "session_list": "ctrl+l", + "app_heap_snapshot": "ctrl+h", + // Legacy delete shortcut + "session_delete": "ctrl+d", + // Canonical delete shortcut + "session.delete": "ctrl+x", + "app.heap_snapshot": "ctrl+shift+h" + } +} +`, + ) + + try { + const config = await run( + directory, + Effect.gen(function* () { + const service = yield* Config.Service + return yield* service.get() + }), + ) + + expect(config.keybinds).toEqual({ + "session.list": "ctrl+l", + "session.delete": "ctrl+x", + }) + const text = await Bun.file(file).text() + expect(text).toContain("// Preserve this comment") + expect(text).toContain("// Session list shortcut") + expect(text).toContain("// Legacy delete shortcut") + expect(text).toContain("// Canonical delete shortcut") + expect(parse(text).keybinds).toEqual({ + "session.list": "ctrl+l", + "session.delete": "ctrl+x", + }) + } finally { + await Bun.$`rm -rf ${directory}` + } +}) + +test("uses migrated keybinds when persistence fails", async () => { + const directory = await Bun.$`mktemp -d`.text().then((value) => value.trim()) + const file = path.join(directory, "cli.json") + await Bun.write(file, `{"keybinds":{"session_list":"ctrl+l"}}`) + const node = await Effect.runPromise(FileSystem.FileSystem.pipe(Effect.provide(NodeFileSystem.layer))) + const fs = new Proxy(node, { + get(target, property, receiver) { + if (property === "rename") return () => Effect.die(new Error("read-only config")) + return Reflect.get(target, property, receiver) + }, + }) + + try { + const config = await Effect.runPromise( + Effect.gen(function* () { + const service = yield* Config.Service + return yield* service.get() + }).pipe( + Effect.provide(Config.layer), + Effect.provide(Global.layerWith({ config: directory, state: directory })), + Effect.provideService(FileSystem.FileSystem, fs), + ), + ) + + expect(config.keybinds).toEqual({ "session.list": "ctrl+l" }) + expect(await Bun.file(file).json()).toEqual({ keybinds: { session_list: "ctrl+l" } }) + expect(await Array.fromAsync(new Bun.Glob("*.tmp").scan(directory))).toEqual([]) + } finally { + await Bun.$`rm -rf ${directory}` + } +}) + +test("preserves the effective value when migrating duplicate legacy keybinds", async () => { + const directory = await Bun.$`mktemp -d`.text().then((value) => value.trim()) + const file = path.join(directory, "cli.json") + await Bun.write(file, `{"keybinds":{"session_delete":"ctrl+a","session_delete":"ctrl+b"}}`) + + try { + const config = await run( + directory, + Effect.gen(function* () { + const service = yield* Config.Service + return yield* service.get() + }), + ) + + expect(config.keybinds).toEqual({ "session.delete": "ctrl+b" }) + expect(parse(await Bun.file(file).text()).keybinds).toEqual({ "session.delete": "ctrl+b" }) + } finally { + await Bun.$`rm -rf ${directory}` + } +}) + +test("migrates and updates the effective duplicate top-level keybinds", async () => { + const directory = await Bun.$`mktemp -d`.text().then((value) => value.trim()) + const file = path.join(directory, "cli.json") + await Bun.write(file, `{"keybinds":{"session_delete":"first"},"keybinds":{"session_delete":"last"}}`) + + try { + const config = await run( + directory, + Effect.gen(function* () { + const service = yield* Config.Service + expect((yield* service.get()).keybinds).toEqual({ "session.delete": "last" }) + return yield* service.update((draft) => { + draft.keybinds = { ...draft.keybinds, "session.delete": "changed" } + }) + }), + ) + + expect(config.keybinds).toEqual({ "session.delete": "changed" }) + expect(parse(await Bun.file(file).text()).keybinds).toEqual({ "session.delete": "changed" }) + } finally { + await Bun.$`rm -rf ${directory}` + } +}) + +test("serializes migration and updates across processes", async () => { + const directory = await Bun.$`mktemp -d`.text().then((value) => value.trim()) + const file = path.join(directory, "cli.json") + const started = path.join(directory, "started") + const release = path.join(directory, "release") + const migrateReady = path.join(directory, "migrate-ready") + const updateReady = path.join(directory, "update-ready") + await Bun.write(file, `{"keybinds":{"session_delete":"ctrl+d"}}`) + const worker = path.join(import.meta.dir, "fixture/config-concurrency.ts") + const migrate = Bun.spawn([process.execPath, worker, "migrate", directory, started, release, migrateReady], { + stdout: "ignore", + stderr: "pipe", + }) + + try { + await waitForFile(started, migrate.exited) + const update = Bun.spawn([process.execPath, worker, "update", directory, started, release, updateReady], { + stdout: "ignore", + stderr: "pipe", + }) + try { + await waitForFile(updateReady, update.exited) + expect(await Promise.race([update.exited.then(() => true), Bun.sleep(500).then(() => false)])).toBe(false) + await Bun.write(release, "") + const [migrateCode, updateCode] = await Promise.all([migrate.exited, update.exited]) + expect(await new Response(migrate.stderr).text()).toBe("") + expect(await new Response(update.stderr).text()).toBe("") + expect([migrateCode, updateCode]).toEqual([0, 0]) + expect(await Bun.file(file).json()).toEqual({ keybinds: { "session.delete": "ctrl+d" }, mouse: false }) + } finally { + update.kill() + await update.exited + } + } finally { + await Bun.write(release, "") + migrate.kill() + await migrate.exited + await Bun.$`rm -rf ${directory}` + } +}) + +test("config reads remain interruptible while waiting for the file lock", async () => { + const directory = await Bun.$`mktemp -d`.text().then((value) => value.trim()) + const file = path.join(directory, "cli.json") + const locks = path.join(directory, "locks") + const held = await Flock.acquire(file, { dir: locks }) + + try { + const service = await Effect.runPromise( + Config.Service.pipe( + Effect.provide(Config.layer), + Effect.provide(Global.layerWith({ config: directory, state: directory })), + Effect.provide(NodeFileSystem.layer), + ), + ) + const result = Effect.runPromise(service.get().pipe(Effect.timeoutOption("50 millis"))) + expect(await Promise.race([result, Bun.sleep(250).then(() => "blocked" as const)])).toEqual(Option.none()) + } finally { + await held.release() + await Bun.$`rm -rf ${directory}` + } +}) + +test("updates effective duplicate canonical keybinds", async () => { + const directory = await Bun.$`mktemp -d`.text().then((value) => value.trim()) + const file = path.join(directory, "cli.json") + await Bun.write( + file, + `{"keybinds":{"session.delete":"first","session.delete":"last","permission.mode":"off","permission.mode":"on"}}`, + ) + + try { + const config = await run( + directory, + Effect.gen(function* () { + const service = yield* Config.Service + expect((yield* service.get()).keybinds).toEqual({ "session.delete": "last", "permission.mode": "on" }) + return yield* service.update((draft) => { + draft.keybinds = { ...draft.keybinds, "session.delete": "changed", "permission.mode": "changed" } + }) + }), + ) + + expect(config.keybinds).toEqual({ "session.delete": "changed", "permission.mode": "changed" }) + expect(parse(await Bun.file(file).text()).keybinds).toEqual({ + "session.delete": "changed", + "permission.mode": "changed", + }) + } finally { + await Bun.$`rm -rf ${directory}` + } +}) + +test("removes orphaned keybinds without deleting trailing comments", async () => { + const directory = await Bun.$`mktemp -d`.text().then((value) => value.trim()) + const file = path.join(directory, "cli.json") + await Bun.write( + file, + `{ + "keybinds": { + "app_heap_snapshot": "ctrl+h" /* Keep legacy explanation */, + "app.heap_snapshot": "ctrl+shift+h" /* Keep canonical explanation */, + }, +} +`, + ) + + try { + const config = await run( + directory, + Effect.gen(function* () { + const service = yield* Config.Service + return yield* service.get() + }), + ) + + expect(config.keybinds).toEqual({}) + const text = await Bun.file(file).text() + expect(text).toContain("/* Keep legacy explanation */") + expect(text).toContain("/* Keep canonical explanation */") + expect(parse(text).keybinds).toEqual({}) + } finally { + await Bun.$`rm -rf ${directory}` + } +}) + test("updates a config draft while preserving JSONC comments", async () => { const directory = await Bun.$`mktemp -d`.text().then((value) => value.trim()) await Bun.write(path.join(directory, "cli.json"), '{\n // Keep this comment\n "animations": true\n}\n') @@ -167,3 +439,15 @@ test("updates a config draft while preserving JSONC comments", async () => { await Bun.$`rm -rf ${directory}` } }) + +async function waitForFile(file: string, exited: Promise) { + const found = await Promise.race([ + (async () => { + while (!(await Bun.file(file).exists())) await Bun.sleep(10) + return true + })(), + exited.then(() => false), + Bun.sleep(5000).then(() => false), + ]) + if (!found) throw new Error(`timed out waiting for ${file}`) +} diff --git a/packages/cli/test/fixture/config-concurrency.ts b/packages/cli/test/fixture/config-concurrency.ts new file mode 100644 index 00000000000..43e84d94eac --- /dev/null +++ b/packages/cli/test/fixture/config-concurrency.ts @@ -0,0 +1,42 @@ +import { NodeFileSystem } from "@effect/platform-node" +import { Global } from "@opencode-ai/util/global" +import { Effect, FileSystem } from "effect" +import { Config } from "../../src/config" + +const [mode, directory, started, release, ready] = process.argv.slice(2) +if (!mode || !directory || !started || !release || !ready) throw new Error("missing config concurrency arguments") +if (mode !== "migrate" && mode !== "update") throw new Error(`unknown mode: ${mode}`) + +const node = await Effect.runPromise(FileSystem.FileSystem.pipe(Effect.provide(NodeFileSystem.layer))) +const state = { writes: 0 } +const writeFileString: FileSystem.FileSystem["writeFileString"] = (target, data, options) => { + state.writes++ + if (mode !== "migrate" || state.writes !== 1) return node.writeFileString(target, data, options) + return Effect.gen(function* () { + yield* Effect.promise(() => Bun.write(started, "")) + while (!(yield* Effect.promise(() => Bun.file(release).exists()))) yield* Effect.sleep("10 millis") + yield* node.writeFileString(target, data, options) + }) +} +const fs = new Proxy(node, { + get(target, property, receiver) { + if (property === "writeFileString") return writeFileString + return Reflect.get(target, property, receiver) + }, +}) +const service = await Effect.runPromise( + Config.Service.pipe( + Effect.provide(Config.layer), + Effect.provide(Global.layerWith({ config: directory, state: directory })), + Effect.provideService(FileSystem.FileSystem, fs), + ), +) + +await Bun.write(ready, "") +if (mode === "migrate") await Effect.runPromise(service.get()) +if (mode === "update") + await Effect.runPromise( + service.update((draft) => { + draft.mouse = false + }), + ) diff --git a/packages/cli/test/mini-config.test.ts b/packages/cli/test/mini-config.test.ts new file mode 100644 index 00000000000..a93990d0334 --- /dev/null +++ b/packages/cli/test/mini-config.test.ts @@ -0,0 +1,69 @@ +import { NodeFileSystem } from "@effect/platform-node" +import { Global } from "@opencode-ai/util/global" +import { Effect, Option } from "effect" +import { expect, mock, test } from "bun:test" +import { mkdir, rm } from "node:fs/promises" +import path from "node:path" +import { Config } from "../src/config" +import type { MiniCommandInput } from "../src/mini" +import { OPENCODE_VERSION } from "../src/version" + +test("mini handler passes resolved CLI keybinds to the runtime", async () => { + const root = await Bun.$`mktemp -d`.text().then((value) => value.trim()) + const configDirectory = path.join(root, "config") + const stateDirectory = path.join(root, "state") + await mkdir(configDirectory, { recursive: true }) + await Bun.write( + path.join(configDirectory, "cli.json"), + JSON.stringify({ + keybinds: { "composer.subagent.interrupt": "ctrl+i" }, + leader: { timeout: 321 }, + }), + ) + let received: MiniCommandInput["tuiConfig"] + const mini = await import("../src/mini") + mock.module("../src/mini", () => ({ + ...mini, + validateMiniTerminal() {}, + runMini(input: Pick) { + received = input.tuiConfig + return Promise.resolve() + }, + })) + const handler = (await import("../src/commands/handlers/mini")).default + const server = Bun.serve({ + port: 0, + fetch: () => Response.json({ healthy: true, version: OPENCODE_VERSION, pid: process.pid }), + }) + + try { + await Effect.runPromise( + handler({ + server: Option.some(server.url.toString()), + standalone: false, + continue: false, + session: Option.none(), + fork: false, + replay: true as never, + replayLimit: Option.none(), + model: Option.none(), + agent: Option.none(), + prompt: Option.none(), + demo: false, + }).pipe( + Effect.provide(Config.layer), + Effect.provide(Global.layerWith({ config: configDirectory, state: stateDirectory })), + Effect.provide(NodeFileSystem.layer), + Effect.scoped, + ), + ) + + const config = await received + expect(config?.leader.timeout).toBe(321) + expect(config?.keybinds.get("composer.subagent.interrupt")).toMatchObject([{ key: "ctrl+i" }]) + } finally { + server.stop(true) + mock.restore() + await rm(root, { recursive: true, force: true }) + } +}) diff --git a/packages/cli/test/run/noninteractive.test.ts b/packages/cli/test/run/noninteractive.test.ts index 24991fd4297..e45311e8b22 100644 --- a/packages/cli/test/run/noninteractive.test.ts +++ b/packages/cli/test/run/noninteractive.test.ts @@ -28,13 +28,13 @@ function formCreated(info: FormInfo, eventLocation = location): V2Event { return { id: `evt_${info.id}`, created: 0, type: "form.created", location: eventLocation, data: { form: info } } } -function prompted(inputID: string): V2Event { +function prompted(inboxID: string): V2Event { return { id: "evt_prompted", created: 0, - type: "session.input.promoted", + type: "session.inbox.delivered", durable: { aggregateID: "ses_1", seq: 0, version: 1 }, - data: { sessionID: "ses_1", inputID }, + data: { sessionID: "ses_1", inboxID }, } } @@ -98,9 +98,9 @@ function executionFailed(message: string): V2Event { } } -function failedTool(inputID: string): V2Event[] { +function failedTool(inboxID: string): V2Event[] { return [ - prompted(inputID), + prompted(inboxID), { id: "evt_failed_tool_input", created: 1, @@ -156,10 +156,10 @@ function failedTool(inputID: string): V2Event[] { ] } -function successfulGrep(inputID: string): V2Event[] { +function successfulGrep(inboxID: string): V2Event[] { const text = "Found 2 matches\n/src/a.ts:\n Line 1: needle\n/src/b.ts:\n Line 2: needle" return [ - prompted(inputID), + prompted(inboxID), { id: "evt_grep_input", created: 1, @@ -206,7 +206,7 @@ function successfulGrep(inputID: string): V2Event[] { // Runs one non-interactive prompt against a mocked SDK. `turn` produces the // live events the prompt admission triggers, keyed by the generated message ID. async function run(input: { - turn: (inputID: string) => V2Event[] + turn: (inboxID: string) => V2Event[] pendingForms?: FormInfo[] attached?: boolean format?: "default" | "json" @@ -214,7 +214,7 @@ async function run(input: { cancel?: (input: { sessionID: string; formID: string }) => Promise renderTool?: (part: SessionMessageAssistantTool) => Promise renderToolError?: (part: SessionMessageAssistantTool) => Promise - messages?: (inputID: string) => SessionMessageInfo[] + messages?: (inboxID: string) => SessionMessageInfo[] wait?: () => Promise terminalDelay?: number }) { @@ -515,7 +515,7 @@ describe("runNonInteractivePrompt", () => { const rendered: SessionMessageAssistantTool[] = [] const failed: SessionMessageAssistantTool[] = [] await capture({ - turn: (inputID) => failedTool(inputID).filter((event) => event.type !== "session.tool.progress"), + turn: (inboxID) => failedTool(inboxID).filter((event) => event.type !== "session.tool.progress"), renderTool: (part) => { rendered.push(part) return Promise.resolve() diff --git a/packages/client/script/build.ts b/packages/client/script/build.ts index 0949bc6b2b4..005721ec47c 100644 --- a/packages/client/script/build.ts +++ b/packages/client/script/build.ts @@ -30,7 +30,7 @@ import { Reference } from "@opencode-ai/schema/reference" import { AbsolutePath, PositiveInt, RelativePath } from "@opencode-ai/schema/schema" import { Session } from "@opencode-ai/schema/session" import { SessionMessage } from "@opencode-ai/schema/session-message" -import { SessionPending } from "@opencode-ai/schema/session-pending" +import { SessionInbox } from "@opencode-ai/schema/session-inbox" import { Shell } from "@opencode-ai/schema/shell" import { Skill } from "@opencode-ai/schema/skill" import { Vcs } from "@opencode-ai/schema/vcs" @@ -69,7 +69,7 @@ const effectTypeReferences = [ ...namespaceTypes("Reference", "@opencode-ai/schema/reference", Reference), ...namespaceTypes("Session", "@opencode-ai/schema/session", Session), ...namespaceTypes("SessionMessage", "@opencode-ai/schema/session-message", SessionMessage), - ...namespaceTypes("SessionPending", "@opencode-ai/schema/session-pending", SessionPending), + ...namespaceTypes("SessionInbox", "@opencode-ai/schema/session-inbox", SessionInbox), ...namespaceTypes("Shell", "@opencode-ai/schema/shell", Shell), ...namespaceTypes("Skill", "@opencode-ai/schema/skill", Skill), ...namespaceTypes("Vcs", "@opencode-ai/schema/vcs", Vcs), diff --git a/packages/client/src/effect/api/api.ts b/packages/client/src/effect/api/api.ts index 43c52806a33..cb116cfcaf3 100644 --- a/packages/client/src/effect/api/api.ts +++ b/packages/client/src/effect/api/api.ts @@ -11,9 +11,9 @@ import type { RelativePath } from "@opencode-ai/schema/schema" import type { Brand } from "effect" import type { Model } from "@opencode-ai/schema/model" import type { SessionMessage } from "@opencode-ai/schema/session-message" +import type { SessionInbox } from "@opencode-ai/schema/session-inbox" import type { PromptInput } from "@opencode-ai/schema/prompt-input" import type { AgentAttachment } from "@opencode-ai/schema/prompt" -import type { SessionPending } from "@opencode-ai/schema/session-pending" import type { Skill } from "@opencode-ai/schema/skill" import type { Event } from "@opencode-ai/schema/event" import type { InstructionEntry } from "@opencode-ai/schema/instruction-entry" @@ -170,6 +170,7 @@ export type Endpoint5_11Input = { readonly sessionID: Session.ID readonly directory: AbsolutePath readonly workspaceID?: Workspace.ID | undefined + readonly delivery?: SessionInbox.Delivery | undefined } export type Endpoint5_11Output = void export type SessionMoveOperation = (input: Endpoint5_11Input) => Effect.Effect @@ -182,10 +183,10 @@ export type Endpoint5_12Input = { readonly agents?: ReadonlyArray | undefined readonly skills?: ReadonlyArray | undefined readonly metadata?: { readonly [x: string]: unknown } | undefined - readonly delivery?: "steer" | "queue" | undefined + readonly delivery?: SessionInbox.Delivery | undefined readonly resume?: boolean | undefined } -export type Endpoint5_12Output = SessionPending.User +export type Endpoint5_12Output = SessionInbox.User export type SessionPromptOperation = (input: Endpoint5_12Input) => Effect.Effect export type Endpoint5_13Input = { @@ -198,10 +199,10 @@ export type Endpoint5_13Input = { readonly files?: ReadonlyArray | undefined readonly agents?: ReadonlyArray | undefined readonly skills?: ReadonlyArray | undefined - readonly delivery?: "steer" | "queue" | undefined + readonly delivery?: SessionInbox.Delivery | undefined readonly resume?: boolean | undefined } -export type Endpoint5_13Output = SessionPending.User +export type Endpoint5_13Output = SessionInbox.User export type SessionCommandOperation = (input: Endpoint5_13Input) => Effect.Effect export type Endpoint5_14Input = { @@ -219,10 +220,10 @@ export type Endpoint5_15Input = { readonly text: string readonly description?: string | undefined readonly metadata?: { readonly [x: string]: unknown } | undefined - readonly delivery?: "steer" | "queue" | undefined + readonly delivery?: SessionInbox.Delivery | undefined readonly resume?: boolean | undefined } -export type Endpoint5_15Output = SessionPending.Synthetic +export type Endpoint5_15Output = SessionInbox.Synthetic export type SessionSyntheticOperation = (input: Endpoint5_15Input) => Effect.Effect export type Endpoint5_16Input = { @@ -233,8 +234,12 @@ export type Endpoint5_16Input = { export type Endpoint5_16Output = void export type SessionShellOperation = (input: Endpoint5_16Input) => Effect.Effect -export type Endpoint5_17Input = { readonly sessionID: Session.ID; readonly id?: SessionMessage.ID | undefined } -export type Endpoint5_17Output = SessionPending.Compaction +export type Endpoint5_17Input = { + readonly sessionID: Session.ID + readonly id?: SessionMessage.ID | undefined + readonly delivery?: SessionInbox.Delivery | undefined +} +export type Endpoint5_17Output = SessionInbox.Compaction export type SessionCompactOperation = (input: Endpoint5_17Input) => Effect.Effect export type Endpoint5_18Input = { readonly sessionID: Session.ID } @@ -262,22 +267,20 @@ export type Endpoint5_22Output = ReadonlyArray export type SessionContextOperation = (input: Endpoint5_22Input) => Effect.Effect export type Endpoint5_23Input = { readonly sessionID: Session.ID } -export type Endpoint5_23Output = ReadonlyArray -export type SessionPendingListOperation = (input: Endpoint5_23Input) => Effect.Effect +export type Endpoint5_23Output = ReadonlyArray +export type SessionInboxListOperation = (input: Endpoint5_23Input) => Effect.Effect -export type Endpoint5_24Input = { readonly sessionID: Session.ID; readonly inputID: SessionMessage.ID } +export type Endpoint5_24Input = { readonly sessionID: Session.ID; readonly inboxID: SessionMessage.ID } export type Endpoint5_24Output = void -export type SessionPendingCancelOperation = ( - input: Endpoint5_24Input, -) => Effect.Effect +export type SessionInboxCancelOperation = (input: Endpoint5_24Input) => Effect.Effect -export type Endpoint5_25Input = { readonly sessionID: Session.ID; readonly inputID: SessionMessage.ID } +export type Endpoint5_25Input = { readonly sessionID: Session.ID; readonly inboxID: SessionMessage.ID } export type Endpoint5_25Output = void -export type SessionPendingSteerOperation = (input: Endpoint5_25Input) => Effect.Effect +export type SessionInboxSteerOperation = (input: Endpoint5_25Input) => Effect.Effect -export type Endpoint5_26Input = { readonly sessionID: Session.ID; readonly inputID: SessionMessage.ID } +export type Endpoint5_26Input = { readonly sessionID: Session.ID; readonly inboxID: SessionMessage.ID } export type Endpoint5_26Output = void -export type SessionPendingQueueOperation = (input: Endpoint5_26Input) => Effect.Effect +export type SessionInboxQueueOperation = (input: Endpoint5_26Input) => Effect.Effect export type Endpoint5_27Input = { readonly sessionID: Session.ID } export type Endpoint5_27Output = ReadonlyArray @@ -368,7 +371,7 @@ export type Endpoint5_31Output = readonly data: { readonly sessionID: Session.ID readonly location: Location.Ref - readonly projectID?: Project.ID | undefined + readonly projectID: Project.ID readonly subpath?: RelativePath | undefined } } @@ -410,50 +413,45 @@ export type Endpoint5_31Output = readonly id: Event.ID readonly created: DateTime.Utc readonly metadata?: { readonly [x: string]: unknown } | undefined - readonly type: "session.input.promoted" + readonly type: "session.inbox.delivered" readonly durable: { readonly aggregateID: string; readonly seq: Event.Seq; readonly version: Event.Version } readonly location?: Location.Ref | undefined - readonly data: { readonly sessionID: Session.ID; readonly inputID: SessionMessage.ID } + readonly data: { readonly sessionID: Session.ID; readonly inboxID: SessionMessage.ID } } | { readonly id: Event.ID readonly created: DateTime.Utc readonly metadata?: { readonly [x: string]: unknown } | undefined - readonly type: "session.input.admitted" + readonly type: "session.inbox.enqueued" readonly durable: { readonly aggregateID: string; readonly seq: Event.Seq; readonly version: Event.Version } readonly location?: Location.Ref | undefined readonly data: { readonly sessionID: Session.ID - readonly inputID: SessionMessage.ID - readonly input: SessionPending.Message + readonly inboxID: SessionMessage.ID + readonly item: SessionInbox.Item } } | { readonly id: Event.ID readonly created: DateTime.Utc readonly metadata?: { readonly [x: string]: unknown } | undefined - readonly type: "session.input.cancelled" + readonly type: "session.inbox.cancelled" readonly durable: { readonly aggregateID: string; readonly seq: Event.Seq; readonly version: Event.Version } readonly location?: Location.Ref | undefined - readonly data: { readonly sessionID: Session.ID; readonly inputID: SessionMessage.ID } + readonly data: { readonly sessionID: Session.ID; readonly inboxID: SessionMessage.ID } } | { readonly id: Event.ID readonly created: DateTime.Utc readonly metadata?: { readonly [x: string]: unknown } | undefined - readonly type: "session.input.steered" + readonly type: "session.inbox.delivery.changed" readonly durable: { readonly aggregateID: string; readonly seq: Event.Seq; readonly version: Event.Version } readonly location?: Location.Ref | undefined - readonly data: { readonly sessionID: Session.ID; readonly inputID: SessionMessage.ID } - } - | { - readonly id: Event.ID - readonly created: DateTime.Utc - readonly metadata?: { readonly [x: string]: unknown } | undefined - readonly type: "session.input.queued" - readonly durable: { readonly aggregateID: string; readonly seq: Event.Seq; readonly version: Event.Version } - readonly location?: Location.Ref | undefined - readonly data: { readonly sessionID: Session.ID; readonly inputID: SessionMessage.ID } + readonly data: { + readonly sessionID: Session.ID + readonly inboxID: SessionMessage.ID + readonly delivery: SessionInbox.Delivery + } } | { readonly id: Event.ID @@ -814,15 +812,6 @@ export type Endpoint5_31Output = readonly error: { readonly type: string; readonly message: string; readonly status?: number | undefined } } } - | { - readonly id: Event.ID - readonly created: DateTime.Utc - readonly metadata?: { readonly [x: string]: unknown } | undefined - readonly type: "session.compaction.admitted" - readonly durable: { readonly aggregateID: string; readonly seq: Event.Seq; readonly version: Event.Version } - readonly location?: Location.Ref | undefined - readonly data: { readonly sessionID: Session.ID; readonly inputID: SessionMessage.ID } - } | { readonly id: Event.ID readonly created: DateTime.Utc @@ -953,11 +942,11 @@ export interface SessionApi { readonly commit: SessionRevertCommitOperation } readonly context: SessionContextOperation - readonly pending: { - readonly list: SessionPendingListOperation - readonly cancel: SessionPendingCancelOperation - readonly steer: SessionPendingSteerOperation - readonly queue: SessionPendingQueueOperation + readonly inbox: { + readonly list: SessionInboxListOperation + readonly cancel: SessionInboxCancelOperation + readonly steer: SessionInboxSteerOperation + readonly queue: SessionInboxQueueOperation } readonly instructions: { readonly entry: { diff --git a/packages/client/src/effect/generated/client.ts b/packages/client/src/effect/generated/client.ts index ca1d6e74dcf..33df187ba1a 100644 --- a/packages/client/src/effect/generated/client.ts +++ b/packages/client/src/effect/generated/client.ts @@ -399,7 +399,7 @@ const Endpoint5_11 = (raw: RawClient["server.session"]) => (input: Endpoint5_11I preserveEffect()( raw["session.move"]({ params: { sessionID: input["sessionID"] }, - payload: { directory: input["directory"], workspaceID: input["workspaceID"] }, + payload: { directory: input["directory"], workspaceID: input["workspaceID"], delivery: input["delivery"] }, }).pipe(Effect.mapError(mapClientError)), ) @@ -481,7 +481,10 @@ const Endpoint5_16 = (raw: RawClient["server.session"]) => (input: Endpoint5_16I const Endpoint5_17 = (raw: RawClient["server.session"]) => (input: Endpoint5_17Input) => preserveEffect()( - raw["session.compact"]({ params: { sessionID: input["sessionID"] }, payload: { id: input["id"] } }).pipe( + raw["session.compact"]({ + params: { sessionID: input["sessionID"] }, + payload: { id: input["id"], delivery: input["delivery"] }, + }).pipe( Effect.mapError(mapClientError), Effect.map((value) => value.data), ), @@ -523,7 +526,7 @@ const Endpoint5_22 = (raw: RawClient["server.session"]) => (input: Endpoint5_22I const Endpoint5_23 = (raw: RawClient["server.session"]) => (input: Endpoint5_23Input) => preserveEffect()( - raw["session.pending.list"]({ params: { sessionID: input["sessionID"] } }).pipe( + raw["session.inbox.list"]({ params: { sessionID: input["sessionID"] } }).pipe( Effect.mapError(mapClientError), Effect.map((value) => value.data), ), @@ -531,21 +534,21 @@ const Endpoint5_23 = (raw: RawClient["server.session"]) => (input: Endpoint5_23I const Endpoint5_24 = (raw: RawClient["server.session"]) => (input: Endpoint5_24Input) => preserveEffect()( - raw["session.pending.cancel"]({ params: { sessionID: input["sessionID"], inputID: input["inputID"] } }).pipe( + raw["session.inbox.cancel"]({ params: { sessionID: input["sessionID"], inboxID: input["inboxID"] } }).pipe( Effect.mapError(mapClientError), ), ) const Endpoint5_25 = (raw: RawClient["server.session"]) => (input: Endpoint5_25Input) => preserveEffect()( - raw["session.pending.steer"]({ params: { sessionID: input["sessionID"], inputID: input["inputID"] } }).pipe( + raw["session.inbox.steer"]({ params: { sessionID: input["sessionID"], inboxID: input["inboxID"] } }).pipe( Effect.mapError(mapClientError), ), ) const Endpoint5_26 = (raw: RawClient["server.session"]) => (input: Endpoint5_26Input) => preserveEffect()( - raw["session.pending.queue"]({ params: { sessionID: input["sessionID"], inputID: input["inputID"] } }).pipe( + raw["session.inbox.queue"]({ params: { sessionID: input["sessionID"], inboxID: input["inboxID"] } }).pipe( Effect.mapError(mapClientError), ), ) @@ -637,7 +640,7 @@ const adaptGroup5 = (raw: RawClient["server.session"]) => ({ wait: Endpoint5_18(raw), revert: { stage: Endpoint5_19(raw), clear: Endpoint5_20(raw), commit: Endpoint5_21(raw) }, context: Endpoint5_22(raw), - pending: { list: Endpoint5_23(raw), cancel: Endpoint5_24(raw), steer: Endpoint5_25(raw), queue: Endpoint5_26(raw) }, + inbox: { list: Endpoint5_23(raw), cancel: Endpoint5_24(raw), steer: Endpoint5_25(raw), queue: Endpoint5_26(raw) }, instructions: { entry: { list: Endpoint5_27(raw), put: Endpoint5_28(raw), remove: Endpoint5_29(raw) } }, generate: Endpoint5_30(raw), log: Endpoint5_31(raw), diff --git a/packages/client/src/effect/index.ts b/packages/client/src/effect/index.ts index 7ae5c8ca43d..b632e52655e 100644 --- a/packages/client/src/effect/index.ts +++ b/packages/client/src/effect/index.ts @@ -41,7 +41,7 @@ export { Reference } from "@opencode-ai/schema/reference" export { WebSearch } from "@opencode-ai/schema/websearch" export { AbsolutePath, RelativePath } from "@opencode-ai/schema/schema" export { Session } from "@opencode-ai/schema/session" -export { SessionPending } from "@opencode-ai/schema/session-pending" +export { SessionInbox } from "@opencode-ai/schema/session-inbox" export { SessionMessage } from "@opencode-ai/schema/session-message" export { Skill } from "@opencode-ai/schema/skill" export { Prompt } from "@opencode-ai/schema/prompt" diff --git a/packages/client/src/effect/service.ts b/packages/client/src/effect/service.ts index 7797a3f3a03..733bbf8a7a6 100644 --- a/packages/client/src/effect/service.ts +++ b/packages/client/src/effect/service.ts @@ -10,6 +10,7 @@ import { spawnServiceContender, } from "../service-contender.js" import { defaultEnsureTiming, ensureTiming, type EnsureTiming } from "../service-timing.js" +import { matchesVersion } from "../service-version.js" export * from "../service.js" /** Contents of the local service registration file. */ @@ -37,14 +38,14 @@ export const incumbent = Effect.fn("service.incumbent")(function* ( const info = yield* read(options.file) const found = info === undefined ? undefined : yield* probe({ ...info, url: options.url }) if (found === undefined || found.legacy) return undefined - if (options.version !== undefined && found.version !== options.version) return undefined + if (!matchesVersion(found.version, options)) return undefined return { endpoint: found.endpoint, state: found.state } }) const discoverLocal = Effect.fnUntraced(function* (options: DiscoverOptions) { const found = (yield* registered(options.file)).service if (found?.state !== "ready") return undefined - if (options.version !== undefined && found.version !== options.version) return undefined + if (!matchesVersion(found.version, options)) return undefined return found }) @@ -93,7 +94,7 @@ export const ensure = Effect.fn("service.ensure")(function* (options: EnsureOpti } else timeouts = undefined if (service !== undefined) { spawnDelay = timing.spawnDelay - const compatible = !service.legacy && (options.version === undefined || service.version === options.version) + const compatible = !service.legacy && matchesVersion(service.version, options) if (compatible && service.state === "ready") return Option.some(service) if (compatible && service.state === "failed") return yield* Effect.fail(new Error("Background service failed to start")) diff --git a/packages/client/src/promise/generated/client.ts b/packages/client/src/promise/generated/client.ts index 497c605782d..3a15218da5d 100644 --- a/packages/client/src/promise/generated/client.ts +++ b/packages/client/src/promise/generated/client.ts @@ -56,14 +56,14 @@ import type { SessionRevertCommitOutput, SessionContextInput, SessionContextOutput, - SessionPendingListInput, - SessionPendingListOutput, - SessionPendingCancelInput, - SessionPendingCancelOutput, - SessionPendingSteerInput, - SessionPendingSteerOutput, - SessionPendingQueueInput, - SessionPendingQueueOutput, + SessionInboxListInput, + SessionInboxListOutput, + SessionInboxCancelInput, + SessionInboxCancelOutput, + SessionInboxSteerInput, + SessionInboxSteerOutput, + SessionInboxQueueInput, + SessionInboxQueueOutput, SessionInstructionsEntryListInput, SessionInstructionsEntryListOutput, SessionInstructionsEntryPutInput, @@ -598,7 +598,7 @@ export function make(options: ClientOptions) { { method: "POST", path: `/api/session/${encodeURIComponent(input.sessionID)}/move`, - body: { directory: input["directory"], workspaceID: input["workspaceID"] }, + body: { directory: input["directory"], workspaceID: input["workspaceID"], delivery: input["delivery"] }, successStatus: 204, declaredStatuses: [404, 400, 401], empty: true, @@ -697,7 +697,7 @@ export function make(options: ClientOptions) { { method: "POST", path: `/api/session/${encodeURIComponent(input.sessionID)}/compact`, - body: { id: input["id"] }, + body: { id: input["id"], delivery: input["delivery"] }, successStatus: 200, declaredStatuses: [409, 404, 400, 401], empty: false, @@ -762,45 +762,45 @@ export function make(options: ClientOptions) { }, requestOptions, ).then((value) => value.data), - pending: { - list: (input: SessionPendingListInput, requestOptions?: RequestOptions) => - request<{ readonly data: SessionPendingListOutput }>( + inbox: { + list: (input: SessionInboxListInput, requestOptions?: RequestOptions) => + request<{ readonly data: SessionInboxListOutput }>( { method: "GET", - path: `/api/session/${encodeURIComponent(input.sessionID)}/pending`, + path: `/api/session/${encodeURIComponent(input.sessionID)}/inbox`, successStatus: 200, declaredStatuses: [404, 401, 400], empty: false, }, requestOptions, ).then((value) => value.data), - cancel: (input: SessionPendingCancelInput, requestOptions?: RequestOptions) => - request( + cancel: (input: SessionInboxCancelInput, requestOptions?: RequestOptions) => + request( { method: "DELETE", - path: `/api/session/${encodeURIComponent(input.sessionID)}/pending/${encodeURIComponent(input.inputID)}`, + path: `/api/session/${encodeURIComponent(input.sessionID)}/inbox/${encodeURIComponent(input.inboxID)}`, successStatus: 204, declaredStatuses: [409, 404, 401, 400], empty: true, }, requestOptions, ), - steer: (input: SessionPendingSteerInput, requestOptions?: RequestOptions) => - request( + steer: (input: SessionInboxSteerInput, requestOptions?: RequestOptions) => + request( { method: "POST", - path: `/api/session/${encodeURIComponent(input.sessionID)}/pending/${encodeURIComponent(input.inputID)}/steer`, + path: `/api/session/${encodeURIComponent(input.sessionID)}/inbox/${encodeURIComponent(input.inboxID)}/steer`, successStatus: 204, declaredStatuses: [409, 404, 401, 400], empty: true, }, requestOptions, ), - queue: (input: SessionPendingQueueInput, requestOptions?: RequestOptions) => - request( + queue: (input: SessionInboxQueueInput, requestOptions?: RequestOptions) => + request( { method: "POST", - path: `/api/session/${encodeURIComponent(input.sessionID)}/pending/${encodeURIComponent(input.inputID)}/queue`, + path: `/api/session/${encodeURIComponent(input.sessionID)}/inbox/${encodeURIComponent(input.inboxID)}/queue`, successStatus: 204, declaredStatuses: [409, 404, 401, 400], empty: true, diff --git a/packages/client/src/promise/generated/types.ts b/packages/client/src/promise/generated/types.ts index fffe17e4134..cdc40a123ca 100644 --- a/packages/client/src/promise/generated/types.ts +++ b/packages/client/src/promise/generated/types.ts @@ -130,15 +130,17 @@ export type SessionMessageCompactionCompleted = { export type SessionActive = { type: "running" } -export type SessionPendingSyntheticData = { text: string; description?: string; metadata?: { [x: string]: JsonValue } } +export type SessionInboxDelivery = "steer" | "queue" -export type SessionPendingCompaction = { id: string; sessionID: string; timeCreated: number; type: "compaction" } +export type SessionInboxSyntheticPayload = { text: string; description?: string; metadata?: { [x: string]: JsonValue } } + +export type SessionInboxCompactionPayload = {} export type InstructionEntryKey = string export type SessionGenerateResponse = { data: { text: string } } -export type SessionPendingSyntheticData1 = { text: string; description?: string; metadata?: { [x: string]: any } } +export type SessionInboxSyntheticPayload1 = { text: string; description?: string; metadata?: { [x: string]: any } } export type ShellInfo = { id: string @@ -420,6 +422,8 @@ export type SessionMessageLocationSwitched = { previous?: { location: LocationRef; projectID?: string; subpath?: string } } +export type SessionInboxMovePayload = { location: LocationRef; projectID: string; subpath?: string } + export type SessionCreated = { id: string created: number @@ -468,7 +472,7 @@ export type SessionMoved = { type: "session.moved" durable: { aggregateID: string; seq: number; version: 1 } location?: LocationRef - data: { sessionID: string; location: LocationRef; projectID?: string; subpath?: string } + data: { sessionID: string; location: LocationRef; projectID: string; subpath?: string } } export type SessionRenamed = { @@ -501,44 +505,24 @@ export type SessionForked = { data: { sessionID: string; parentID: string; boundary: SessionForkBoundary; instructions?: { [x: string]: string } } } -export type SessionInputPromoted = { +export type SessionInboxDelivered = { id: string created: number metadata?: { [x: string]: any } - type: "session.input.promoted" + type: "session.inbox.delivered" durable: { aggregateID: string; seq: number; version: 1 } location?: LocationRef - data: { sessionID: string; inputID: string } + data: { sessionID: string; inboxID: string } } -export type SessionInputCancelled = { +export type SessionInboxCancelled = { id: string created: number metadata?: { [x: string]: any } - type: "session.input.cancelled" + type: "session.inbox.cancelled" durable: { aggregateID: string; seq: number; version: 1 } location?: LocationRef - data: { sessionID: string; inputID: string } -} - -export type SessionInputSteered = { - id: string - created: number - metadata?: { [x: string]: any } - type: "session.input.steered" - durable: { aggregateID: string; seq: number; version: 1 } - location?: LocationRef - data: { sessionID: string; inputID: string } -} - -export type SessionInputQueued = { - id: string - created: number - metadata?: { [x: string]: any } - type: "session.input.queued" - durable: { aggregateID: string; seq: number; version: 1 } - location?: LocationRef - data: { sessionID: string; inputID: string } + data: { sessionID: string; inboxID: string } } export type SessionExecutionStarted = { @@ -659,16 +643,6 @@ export type SessionToolInputEnded = { data: { sessionID: string; assistantMessageID: string; id: string; text: string } } -export type SessionCompactionAdmitted = { - id: string - created: number - metadata?: { [x: string]: any } - type: "session.compaction.admitted" - durable: { aggregateID: string; seq: number; version: 1 } - location?: LocationRef - data: { sessionID: string; inputID: string } -} - export type SessionCompactionStarted = { id: string created: number @@ -863,6 +837,16 @@ export type ProjectDirectoriesUpdated = { data: { projectID: string } } +export type ProjectDirectoryResolved = { + id: string + created: number + metadata?: { [x: string]: any } + type: "project.directory.resolved" + durable: { aggregateID: string; seq: number; version: 1 } + location?: LocationRef + data: { projectID: string; directory: string; previous: string } +} + export type CommandUpdated = { id: string created: number @@ -1162,23 +1146,36 @@ export type SessionCompactionFailed = { data: { sessionID: string; reason: "auto" | "manual"; error: SessionStructuredError; inputID?: string } } -export type SessionPendingSynthetic = { +export type SessionInboxDeliveryChanged = { + id: string + created: number + metadata?: { [x: string]: any } + type: "session.inbox.delivery.changed" + durable: { aggregateID: string; seq: number; version: 1 } + location?: LocationRef + data: { sessionID: string; inboxID: string; delivery: SessionInboxDelivery } +} + +export type SessionInboxSynthetic = { id: string sessionID: string timeCreated: number type: "synthetic" - data: SessionPendingSyntheticData - delivery: "steer" | "queue" + payload: SessionInboxSyntheticPayload + delivery: SessionInboxDelivery +} + +export type SessionInboxCompaction = { + id: string + sessionID: string + timeCreated: number + type: "compaction" + payload: SessionInboxCompactionPayload + delivery: SessionInboxDelivery } export type InstructionEntryInfo = { key: InstructionEntryKey; value: JsonValue } -export type SessionPendingSyntheticMessage = { - type: "synthetic" - data: SessionPendingSyntheticData1 - delivery: "steer" | "queue" -} - export type SessionShellStarted = { id: string created: number @@ -1527,6 +1524,15 @@ export type VcsInfo = { branch: VcsBranch } export type PermissionRuleset = Array +export type SessionInboxMove = { + id: string + sessionID: string + timeCreated: number + type: "move" + payload: SessionInboxMovePayload + delivery: SessionInboxDelivery +} + export type SessionInfo = { id: string parentID?: string @@ -1564,7 +1570,7 @@ export type SessionMessageUser = { type: "user" } -export type SessionPendingUserData = { +export type SessionInboxUserPayload = { text: string files?: Array agents?: Array @@ -1572,7 +1578,7 @@ export type SessionPendingUserData = { metadata?: { [x: string]: JsonValue } } -export type SessionPendingUserData1 = { +export type SessionInboxUserPayload1 = { text: string files?: Array agents?: Array @@ -1884,16 +1890,20 @@ export type ConfigEntry = export type SessionsResponse = { data: Array; cursor: { previous?: string | null; next?: string | null } } -export type SessionPendingUser = { +export type SessionInboxUser = { id: string sessionID: string timeCreated: number type: "user" - data: SessionPendingUserData - delivery: "steer" | "queue" + payload: SessionInboxUserPayload + delivery: SessionInboxDelivery } -export type SessionPendingUserMessage = { type: "user"; data: SessionPendingUserData1; delivery: "steer" | "queue" } +export type SessionInboxItem = + | { type: "user"; payload: SessionInboxUserPayload1; delivery: SessionInboxDelivery } + | { type: "synthetic"; payload: SessionInboxSyntheticPayload1; delivery: SessionInboxDelivery } + | { type: "compaction"; payload: SessionInboxCompactionPayload; delivery: SessionInboxDelivery } + | { type: "move"; payload: SessionInboxMovePayload; delivery: SessionInboxDelivery } export type SessionMessageAssistantTool = { type: "tool" @@ -1914,9 +1924,17 @@ export type FormFields = [FormField, ...Array] export type FormFields3 = [FormField1, ...Array] -export type SessionPendingInfo = SessionPendingUser | SessionPendingSynthetic | SessionPendingCompaction +export type SessionInboxInfo = SessionInboxUser | SessionInboxSynthetic | SessionInboxCompaction | SessionInboxMove -export type SessionPendingMessage = SessionPendingUserMessage | SessionPendingSyntheticMessage +export type SessionInboxEnqueued = { + id: string + created: number + metadata?: { [x: string]: any } + type: "session.inbox.enqueued" + durable: { aggregateID: string; seq: number; version: 1 } + location?: LocationRef + data: { sessionID: string; inboxID: string; item: SessionInboxItem } +} export type SessionMessageAssistant = { id: string @@ -1942,15 +1960,47 @@ export type FormInfo = { id: string; sessionID: string; title: string; metadata? export type FormInfo1 = { id: string; sessionID: string; title: string; metadata?: FormMetadata1; fields: FormFields3 } -export type SessionInputAdmitted = { - id: string - created: number - metadata?: { [x: string]: any } - type: "session.input.admitted" - durable: { aggregateID: string; seq: number; version: 1 } - location?: LocationRef - data: { sessionID: string; inputID: string; input: SessionPendingMessage } -} +export type SessionEventDurable = + | SessionCreated + | SessionAgentSelected + | SessionModelSelected + | SessionMoved + | SessionRenamed + | SessionDeleted + | SessionForked + | SessionInboxDelivered + | SessionInboxEnqueued + | SessionInboxCancelled + | SessionInboxDeliveryChanged + | SessionExecutionStarted + | SessionExecutionSucceeded + | SessionExecutionFailed + | SessionExecutionInterrupted + | SessionInstructionsUpdated + | SessionSynthetic + | SessionSkillActivated + | SessionShellStarted + | SessionShellEnded + | SessionStepStarted + | SessionStepEnded + | SessionStepFailed + | SessionTextStarted + | SessionTextEnded + | SessionReasoningStarted + | SessionReasoningEnded + | SessionToolInputStarted + | SessionToolInputEnded + | SessionToolCalled + | SessionToolSuccess + | SessionToolFailed + | SessionRetryScheduled + | SessionCompactionStarted + | SessionCompactionEnded + | SessionCompactionFailed + | SessionRevertStaged + | SessionRevertCleared + | SessionRevertCommitted + | SessionUsageRecorded export type SessionMessageInfo = | SessionMessageAgentSelected @@ -1979,49 +2029,7 @@ export type FormCreated = { data: { form: FormInfo1 } } -export type SessionEventDurable = - | SessionCreated - | SessionAgentSelected - | SessionModelSelected - | SessionMoved - | SessionRenamed - | SessionDeleted - | SessionForked - | SessionInputPromoted - | SessionInputAdmitted - | SessionInputCancelled - | SessionInputSteered - | SessionInputQueued - | SessionExecutionStarted - | SessionExecutionSucceeded - | SessionExecutionFailed - | SessionExecutionInterrupted - | SessionInstructionsUpdated - | SessionSynthetic - | SessionSkillActivated - | SessionShellStarted - | SessionShellEnded - | SessionStepStarted - | SessionStepEnded - | SessionStepFailed - | SessionTextStarted - | SessionTextEnded - | SessionReasoningStarted - | SessionReasoningEnded - | SessionToolInputStarted - | SessionToolInputEnded - | SessionToolCalled - | SessionToolSuccess - | SessionToolFailed - | SessionRetryScheduled - | SessionCompactionAdmitted - | SessionCompactionStarted - | SessionCompactionEnded - | SessionCompactionFailed - | SessionRevertStaged - | SessionRevertCleared - | SessionRevertCommitted - | SessionUsageRecorded +export type SessionLogItem = SessionEventDurable | EventLogSynced export type SessionTransferData = { info: SessionInfo; messages: Array } @@ -2051,11 +2059,10 @@ export type V2Event = | SessionUsageUpdated | SessionDeleted | SessionForked - | SessionInputPromoted - | SessionInputAdmitted - | SessionInputCancelled - | SessionInputSteered - | SessionInputQueued + | SessionInboxDelivered + | SessionInboxEnqueued + | SessionInboxCancelled + | SessionInboxDeliveryChanged | SessionExecutionStarted | SessionExecutionSucceeded | SessionExecutionFailed @@ -2082,7 +2089,6 @@ export type V2Event = | SessionToolSuccess | SessionToolFailed | SessionRetryScheduled - | SessionCompactionAdmitted | SessionCompactionStarted | SessionCompactionDelta | SessionCompactionEnded @@ -2097,6 +2103,7 @@ export type V2Event = | PluginAdded | PluginUpdated | ProjectDirectoriesUpdated + | ProjectDirectoryResolved | CommandUpdated | ConfigUpdated | SkillUpdated @@ -2127,8 +2134,6 @@ export type V2Event = | McpResourcesChanged | V2EventServerConnected -export type SessionLogItem = SessionEventDurable | EventLogSynced - export type UnauthorizedError = { readonly _tag: "UnauthorizedError"; readonly message: string } export const isUnauthorizedError = (value: unknown): value is UnauthorizedError => typeof value === "object" && value !== null && "_tag" in value && value["_tag"] === "UnauthorizedError" @@ -3361,8 +3366,21 @@ export type SessionRenameOutput = void export type SessionMoveInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] - readonly directory: { readonly directory: string; readonly workspaceID?: string }["directory"] - readonly workspaceID?: { readonly directory: string; readonly workspaceID?: string }["workspaceID"] + readonly directory: { + readonly directory: string + readonly workspaceID?: string + readonly delivery?: ("steer" | "queue") | null + }["directory"] + readonly workspaceID?: { + readonly directory: string + readonly workspaceID?: string + readonly delivery?: ("steer" | "queue") | null + }["workspaceID"] + readonly delivery?: { + readonly directory: string + readonly workspaceID?: string + readonly delivery?: ("steer" | "queue") | null + }["delivery"] } export type SessionMoveOutput = void @@ -3387,7 +3405,7 @@ export type SessionPromptInput = { readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["id"] readonly text: { @@ -3408,7 +3426,7 @@ export type SessionPromptInput = { readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["text"] readonly files?: { @@ -3429,7 +3447,7 @@ export type SessionPromptInput = { readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["files"] readonly agents?: { @@ -3450,7 +3468,7 @@ export type SessionPromptInput = { readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["agents"] readonly skills?: { @@ -3471,7 +3489,7 @@ export type SessionPromptInput = { readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["skills"] readonly metadata?: { @@ -3492,7 +3510,7 @@ export type SessionPromptInput = { readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["metadata"] readonly delivery?: { @@ -3513,7 +3531,7 @@ export type SessionPromptInput = { readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["delivery"] readonly resume?: { @@ -3534,12 +3552,12 @@ export type SessionPromptInput = { readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["resume"] } -export type SessionPromptOutput = { data: SessionPendingUser }["data"] +export type SessionPromptOutput = { data: SessionInboxUser }["data"] export type SessionCommandInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] @@ -3563,7 +3581,7 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["id"] readonly command: { @@ -3586,7 +3604,7 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["command"] readonly arguments?: { @@ -3609,7 +3627,7 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["arguments"] readonly agent?: { @@ -3632,7 +3650,7 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["agent"] readonly model?: { @@ -3655,7 +3673,7 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["model"] readonly files?: { @@ -3678,7 +3696,7 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["files"] readonly agents?: { @@ -3701,7 +3719,7 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["agents"] readonly skills?: { @@ -3724,7 +3742,7 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["skills"] readonly delivery?: { @@ -3747,7 +3765,7 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["delivery"] readonly resume?: { @@ -3770,12 +3788,12 @@ export type SessionCommandInput = { readonly id: string readonly mention?: { readonly start: number; readonly end: number; readonly text: string } }> - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["resume"] } -export type SessionCommandOutput = { data: SessionPendingUser }["data"] +export type SessionCommandOutput = { data: SessionInboxUser }["data"] export type SessionSkillInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] @@ -3805,7 +3823,7 @@ export type SessionSyntheticInput = { readonly text: string readonly description?: string | null readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["id"] readonly text: { @@ -3813,7 +3831,7 @@ export type SessionSyntheticInput = { readonly text: string readonly description?: string | null readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["text"] readonly description?: { @@ -3821,7 +3839,7 @@ export type SessionSyntheticInput = { readonly text: string readonly description?: string | null readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["description"] readonly metadata?: { @@ -3829,7 +3847,7 @@ export type SessionSyntheticInput = { readonly text: string readonly description?: string | null readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["metadata"] readonly delivery?: { @@ -3837,7 +3855,7 @@ export type SessionSyntheticInput = { readonly text: string readonly description?: string | null readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["delivery"] readonly resume?: { @@ -3845,12 +3863,12 @@ export type SessionSyntheticInput = { readonly text: string readonly description?: string | null readonly metadata?: { readonly [x: string]: JsonValue } - readonly delivery?: "steer" | "queue" | null + readonly delivery?: ("steer" | "queue") | null readonly resume?: boolean | null }["resume"] } -export type SessionSyntheticOutput = { data: SessionPendingSynthetic }["data"] +export type SessionSyntheticOutput = { data: SessionInboxSynthetic }["data"] export type SessionShellInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] @@ -3862,10 +3880,14 @@ export type SessionShellOutput = void export type SessionCompactInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] - readonly id?: { readonly id?: string | undefined }["id"] + readonly id?: { readonly id?: string | undefined; readonly delivery?: ("steer" | "queue") | undefined }["id"] + readonly delivery?: { + readonly id?: string | undefined + readonly delivery?: ("steer" | "queue") | undefined + }["delivery"] } -export type SessionCompactOutput = { data: SessionPendingCompaction }["data"] +export type SessionCompactOutput = { data: SessionInboxCompaction }["data"] export type SessionWaitInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] } @@ -3891,30 +3913,30 @@ export type SessionContextInput = { readonly sessionID: { readonly sessionID: st export type SessionContextOutput = { data: Array }["data"] -export type SessionPendingListInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] } +export type SessionInboxListInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] } -export type SessionPendingListOutput = { data: Array }["data"] +export type SessionInboxListOutput = { data: Array }["data"] -export type SessionPendingCancelInput = { - readonly sessionID: { readonly sessionID: string; readonly inputID: string }["sessionID"] - readonly inputID: { readonly sessionID: string; readonly inputID: string }["inputID"] +export type SessionInboxCancelInput = { + readonly sessionID: { readonly sessionID: string; readonly inboxID: string }["sessionID"] + readonly inboxID: { readonly sessionID: string; readonly inboxID: string }["inboxID"] } -export type SessionPendingCancelOutput = void +export type SessionInboxCancelOutput = void -export type SessionPendingSteerInput = { - readonly sessionID: { readonly sessionID: string; readonly inputID: string }["sessionID"] - readonly inputID: { readonly sessionID: string; readonly inputID: string }["inputID"] +export type SessionInboxSteerInput = { + readonly sessionID: { readonly sessionID: string; readonly inboxID: string }["sessionID"] + readonly inboxID: { readonly sessionID: string; readonly inboxID: string }["inboxID"] } -export type SessionPendingSteerOutput = void +export type SessionInboxSteerOutput = void -export type SessionPendingQueueInput = { - readonly sessionID: { readonly sessionID: string; readonly inputID: string }["sessionID"] - readonly inputID: { readonly sessionID: string; readonly inputID: string }["inputID"] +export type SessionInboxQueueInput = { + readonly sessionID: { readonly sessionID: string; readonly inboxID: string }["sessionID"] + readonly inboxID: { readonly sessionID: string; readonly inboxID: string }["inboxID"] } -export type SessionPendingQueueOutput = void +export type SessionInboxQueueOutput = void export type SessionInstructionsEntryListInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] } diff --git a/packages/client/src/promise/service.ts b/packages/client/src/promise/service.ts index 4a44c42a4d4..d54da6c4e90 100644 --- a/packages/client/src/promise/service.ts +++ b/packages/client/src/promise/service.ts @@ -9,6 +9,7 @@ import { spawnServiceContender, } from "../service-contender.js" import { defaultEnsureTiming, ensureTiming, type EnsureTiming } from "../service-timing.js" +import { matchesVersion } from "../service-version.js" import type { ServiceHealth, ServiceStopResponse } from "./generated/types.js" export * from "../service.js" @@ -27,7 +28,7 @@ export async function discover(options: DiscoverOptions = {}) { async function discoverLocal(options: DiscoverOptions) { const found = (await registered(options.file)).service if (found?.state !== "ready") return undefined - if (options.version !== undefined && found.version !== options.version) return undefined + if (!matchesVersion(found.version, options)) return undefined return found } @@ -76,7 +77,7 @@ export async function ensure(options: EnsureOptions = {}): Promise { if (registration.service !== undefined) { spawnDelay = timing.spawnDelay const service = registration.service - const compatible = !service.legacy && (options.version === undefined || service.version === options.version) + const compatible = !service.legacy && matchesVersion(service.version, options) if (compatible && service.state === "ready") return service.endpoint if (compatible && service.state === "failed") throw new Error("Background service failed to start") if (!compatible) { diff --git a/packages/client/src/service-version.ts b/packages/client/src/service-version.ts new file mode 100644 index 00000000000..5586f111a9c --- /dev/null +++ b/packages/client/src/service-version.ts @@ -0,0 +1,8 @@ +import type { DiscoverOptions } from "./service.js" + +export function matchesVersion(version: string | undefined, options: DiscoverOptions) { + if (options.version === undefined) return true + if (version === undefined) return false + if (typeof options.version === "function") return options.version(version) + return version === options.version +} diff --git a/packages/client/src/service.ts b/packages/client/src/service.ts index 96d54871f60..65c32266430 100644 --- a/packages/client/src/service.ts +++ b/packages/client/src/service.ts @@ -17,8 +17,8 @@ export type Endpoint = { export type DiscoverOptions = { /** Absolute registration file path. Defaults to the XDG state directory. */ readonly file?: string - /** Required service version. */ - readonly version?: string + /** Required exact service version or compatibility predicate. */ + readonly version?: string | ((version: string) => boolean) } /** Reason ensuring the service requires a new process. */ diff --git a/packages/client/test/api.types.ts b/packages/client/test/api.types.ts index a4c3f0f0036..1cb35e5dcae 100644 --- a/packages/client/test/api.types.ts +++ b/packages/client/test/api.types.ts @@ -1,6 +1,7 @@ import { Effect } from "effect" import { OpenCode as EffectOpenCode, type AppApi as EffectApi } from "../src/effect" import type { Session } from "@opencode-ai/schema/session" +import type { DiscoverOptions } from "../src/service" type EffectClient = Effect.Success> type PromiseClient = ReturnType @@ -8,6 +9,9 @@ type PromiseClient = ReturnType declare const effectClient: EffectClient declare const promiseClient: PromiseClient +const exactVersion: DiscoverOptions = { version: "2.0.0" } +const compatibleVersion: DiscoverOptions = { version: (version) => version.startsWith("2.") } + const effectApi: EffectApi = effectClient const effectSession: Effect.Effect = effectClient.session.get({ @@ -42,4 +46,14 @@ const promiseRemove: Promise = promiseClient.session.instructions.entry.re key: "review-notes", }) -void [effectSession, effectList, effectPut, effectRemove, promiseList, promisePut, promiseRemove] +void [ + effectSession, + effectList, + effectPut, + effectRemove, + promiseList, + promisePut, + promiseRemove, + exactVersion, + compatibleVersion, +] diff --git a/packages/client/test/effect.test.ts b/packages/client/test/effect.test.ts index eee0d2d08af..9d7fc6c0eb9 100644 --- a/packages/client/test/effect.test.ts +++ b/packages/client/test/effect.test.ts @@ -213,7 +213,7 @@ test("session methods retain decoded Effect inputs and outputs", async () => { expect(Object.getPrototypeOf(result.created)).toBe(Object.prototype) expect(result.created.id).toBe("ses_test") expect(Object.getPrototypeOf(result.admitted)).toBe(Object.prototype) - expect(Object.getPrototypeOf(result.admitted.data)).toBe(Object.prototype) + expect(Object.getPrototypeOf(result.admitted.payload)).toBe(Object.prototype) expect(DateTime.toEpochMillis(result.admitted.timeCreated)).toBe(1_717_171_717_000) expect(result.context).toEqual([]) expect(logQueries[0]).toEqual({ after: "0" }) @@ -271,7 +271,7 @@ const admission = { id: "msg_test", sessionID: "ses_test", type: "user", - data: { text: "Hello" }, + payload: { text: "Hello" }, delivery: "steer", timeCreated: 1_717_171_717_000, }, @@ -280,6 +280,8 @@ const admission = { const compactionAdmission = { data: { type: "compaction", + payload: {}, + delivery: "queue", id: "msg_compaction", sessionID: "ses_test", timeCreated: 1_717_171_717_000, diff --git a/packages/client/test/fixture/service.ts b/packages/client/test/fixture/service.ts index 0c5c9c666b6..4faf13e6931 100644 --- a/packages/client/test/fixture/service.ts +++ b/packages/client/test/fixture/service.ts @@ -27,7 +27,10 @@ if (mode === "delayed" || mode === "delayed-failed" || mode === "coordinated" || } let requests = 0 -const version = mode === "old" || mode === "reject-stop" ? "old" : "test" +let version = "test" +if (mode === "old" || mode === "reject-stop") version = "old" +if (mode === "incompatible") version = "1.9.0" +if (mode === "compatible" || mode === "delayed-compatible") version = "2.1.0-next.1" const id = crypto.randomUUID() const server = Bun.serve({ port: 0, diff --git a/packages/client/test/promise-service.test.ts b/packages/client/test/promise-service.test.ts index 75ae1b544f6..78d871ab5f6 100644 --- a/packages/client/test/promise-service.test.ts +++ b/packages/client/test/promise-service.test.ts @@ -25,6 +25,19 @@ test("discovers a registered service", async () => { expect(await Service.discover({ file: registration, version: "other" })).toBeUndefined() }) +test("discovers a compatible registered service", async () => { + const registration = await setup("compatible") + + expect(await Service.discover({ file: registration, version: "2.1.0" })).toBeUndefined() + expect(await Service.discover({ file: registration, version: "2.1.0-next.1" })).toEqual( + expect.objectContaining({ url: expect.stringMatching(/^http:\/\//) }), + ) + expect(await Service.discover({ file: registration, version: (version) => version.startsWith("2.") })).toEqual( + expect.objectContaining({ url: expect.stringMatching(/^http:\/\//) }), + ) + expect(await Service.discover({ file: registration, version: (version) => version.startsWith("3.") })).toBeUndefined() +}) + test("ensures a missing service with native promises", async () => { const directory = await temp() const registration = join(directory, "service.json") diff --git a/packages/client/test/promise.test.ts b/packages/client/test/promise.test.ts index 82da4e9b466..ead7778e5d3 100644 --- a/packages/client/test/promise.test.ts +++ b/packages/client/test/promise.test.ts @@ -373,7 +373,7 @@ test("session instructions methods use the public HTTP contract", async () => { ]) }) -test("session.pending.list uses the public HTTP contract", async () => { +test("session.inbox.list uses the public HTTP contract", async () => { const requests: Array<{ method: string; url: string }> = [] const pending = [ { @@ -381,7 +381,7 @@ test("session.pending.list uses the public HTTP contract", async () => { sessionID: "ses_test", timeCreated: 1_717_171_717_000, type: "user", - data: { text: "Fix the failing tests" }, + payload: { text: "Fix the failing tests" }, delivery: "steer", }, ] @@ -394,13 +394,13 @@ test("session.pending.list uses the public HTTP contract", async () => { }, }) - const result = await client.session.pending.list({ sessionID: "ses_test" }) + const result = await client.session.inbox.list({ sessionID: "ses_test" }) expect(result).toEqual(pending) - expect(requests).toEqual([{ method: "GET", url: "http://localhost:3000/api/session/ses_test/pending" }]) + expect(requests).toEqual([{ method: "GET", url: "http://localhost:3000/api/session/ses_test/inbox" }]) }) -test("session.pending mutations use the public HTTP contract", async () => { +test("session.inbox mutations use the public HTTP contract", async () => { const requests: Array<{ method: string; url: string }> = [] const client = OpenCode.make({ baseUrl: "http://localhost:3000", @@ -411,14 +411,14 @@ test("session.pending mutations use the public HTTP contract", async () => { }, }) - await client.session.pending.cancel({ sessionID: "ses_test", inputID: "msg_cancel" }) - await client.session.pending.steer({ sessionID: "ses_test", inputID: "msg_steer" }) - await client.session.pending.queue({ sessionID: "ses_test", inputID: "msg_queue" }) + await client.session.inbox.cancel({ sessionID: "ses_test", inboxID: "msg_cancel" }) + await client.session.inbox.steer({ sessionID: "ses_test", inboxID: "msg_steer" }) + await client.session.inbox.queue({ sessionID: "ses_test", inboxID: "msg_queue" }) expect(requests).toEqual([ - { method: "DELETE", url: "http://localhost:3000/api/session/ses_test/pending/msg_cancel" }, - { method: "POST", url: "http://localhost:3000/api/session/ses_test/pending/msg_steer/steer" }, - { method: "POST", url: "http://localhost:3000/api/session/ses_test/pending/msg_queue/queue" }, + { method: "DELETE", url: "http://localhost:3000/api/session/ses_test/inbox/msg_cancel" }, + { method: "POST", url: "http://localhost:3000/api/session/ses_test/inbox/msg_steer/steer" }, + { method: "POST", url: "http://localhost:3000/api/session/ses_test/inbox/msg_queue/queue" }, ]) }) diff --git a/packages/client/test/service.test.ts b/packages/client/test/service.test.ts index 3b3e94b3edf..152f6cd15e1 100644 --- a/packages/client/test/service.test.ts +++ b/packages/client/test/service.test.ts @@ -47,6 +47,52 @@ test("a concurrent same-version start cannot invalidate a resolved endpoint", as expect(await health(resolved.url)).toEqual({ healthy: true, version: "test", pid: original.pid }) }) +test("reuses a compatible registered service", async () => { + const directory = await temp() + const registration = join(directory, "service.json") + const existing = spawn(registration, "compatible") + await waitForFile(registration) + + const starts: EnsureReason[] = [] + const endpoint = await run( + ensure({ + file: registration, + version: (version) => version.startsWith("2."), + command: [], + onStart: (reason) => starts.push(reason), + }), + ) + + expect(endpoint.url).toBe((await Bun.file(registration).json()).url) + expect(starts).toEqual([]) + expect(existing.exitCode).toBe(null) +}) + +test("replaces an incompatible registered service", async () => { + const directory = await temp() + const registration = join(directory, "service.json") + const existing = spawn(registration, "incompatible") + await waitForFile(registration) + + const starts: EnsureReason[] = [] + const endpoint = await run( + ensure({ + file: registration, + version: (version) => version.startsWith("2."), + command: [process.execPath, fixture, registration, "delayed-compatible", "10"], + onStart: (reason) => starts.push(reason), + }), + ) + const replacement = await Bun.file(registration).json() + + expect(await existing.exited).toBe(0) + expect(replacement.version).toBe("2.1.0-next.1") + expect(endpoint.url).toBe(replacement.url) + expect(starts).toEqual(["version-mismatch"]) + process.kill(replacement.pid, "SIGTERM") + await waitForExit(replacement.pid) +}) + test("waits for a registered service to finish starting", async () => { const directory = await temp() const registration = join(directory, "service.json") diff --git a/packages/codemode/package.json b/packages/codemode/package.json index dbad37c959f..721a068e882 100644 --- a/packages/codemode/package.json +++ b/packages/codemode/package.json @@ -19,6 +19,12 @@ "exports": { ".": "./src/index.ts" }, + "imports": { + "#transpile": { + "workerd": "./src/interpreter/transpile.workerd.ts", + "default": "./src/interpreter/transpile.node.ts" + } + }, "scripts": { "build": "bun run script/build.ts", "typecheck": "tsgo --noEmit", diff --git a/packages/codemode/src/interpreter/execute.ts b/packages/codemode/src/interpreter/execute.ts index a3f789868ef..7763b3aa00e 100644 --- a/packages/codemode/src/interpreter/execute.ts +++ b/packages/codemode/src/interpreter/execute.ts @@ -1,6 +1,8 @@ import { parse } from "acorn" import { Cause, Effect, Scope } from "effect" -import { DiagnosticCategory, ModuleKind, ScriptTarget, flattenDiagnosticMessageText, transpileModule } from "typescript" +// #transpile: conditional import — full typescript on node/bun, an identity +// pass-through on workerd (the compiler is ~11 MiB and can't init there). +import { transpile } from "#transpile" import type { DataValue, Diagnostic, ExecuteOptions, ResolvedExecutionLimits, Result } from "../codemode.js" import { copyIn, copyOut, ToolRuntime, type Services } from "../tool-runtime.js" import type { Tools } from "../tools.js" @@ -119,21 +121,10 @@ export const executeWithLimits = } const parseProgram = (code: string): ProgramNode => { - const transpiled = transpileModule(`async function __codemode__() {\n${code}\n}`, { - reportDiagnostics: true, - compilerOptions: { - target: ScriptTarget.ESNext, - module: ModuleKind.ESNext, - }, - }) - const diagnostic = transpiled.diagnostics?.find((item) => item.category === DiagnosticCategory.Error) + const transpiled = transpile(`async function __codemode__() {\n${code}\n}`) - if (diagnostic) { - throw new InterpreterRuntimeError( - `Failed to parse TypeScript: ${flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`, - undefined, - "ParseError", - ) + if (transpiled.error !== undefined) { + throw new InterpreterRuntimeError(`Failed to parse TypeScript: ${transpiled.error}`, undefined, "ParseError") } const bodyStart = transpiled.outputText.indexOf("{") + 1 diff --git a/packages/codemode/src/interpreter/transpile.node.ts b/packages/codemode/src/interpreter/transpile.node.ts new file mode 100644 index 00000000000..95d0989af20 --- /dev/null +++ b/packages/codemode/src/interpreter/transpile.node.ts @@ -0,0 +1,25 @@ +import { DiagnosticCategory, ModuleKind, ScriptTarget, flattenDiagnosticMessageText, transpileModule } from "typescript" + +export interface TranspileResult { + readonly outputText: string + readonly error?: string +} + +// Full TypeScript transpilation on node/bun runtimes. +export const transpile = (source: string): TranspileResult => { + const transpiled = transpileModule(source, { + reportDiagnostics: true, + compilerOptions: { + target: ScriptTarget.ESNext, + module: ModuleKind.ESNext, + }, + }) + const diagnostic = transpiled.diagnostics?.find((item) => item.category === DiagnosticCategory.Error) + if (diagnostic) { + return { + outputText: transpiled.outputText, + error: flattenDiagnosticMessageText(diagnostic.messageText, "\n"), + } + } + return { outputText: transpiled.outputText } +} diff --git a/packages/codemode/src/interpreter/transpile.workerd.ts b/packages/codemode/src/interpreter/transpile.workerd.ts new file mode 100644 index 00000000000..6574a5bd348 --- /dev/null +++ b/packages/codemode/src/interpreter/transpile.workerd.ts @@ -0,0 +1,11 @@ +export interface TranspileResult { + readonly outputText: string + readonly error?: string +} + +// workerd profile: the typescript compiler is ~11 MiB and probes node +// internals at module init, so codemode programs are passed through +// untranspiled. Plain-JS programs (the overwhelmingly common case) parse +// fine downstream via acorn; TypeScript-only syntax surfaces as a parse +// error from the interpreter instead of a transpile diagnostic. +export const transpile = (source: string): TranspileResult => ({ outputText: source }) diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 00000000000..6c80690fc07 --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,3 @@ +# @opencode-ai/core + +Core runtime services for OpenCode. diff --git a/packages/core/package.json b/packages/core/package.json index 9844abe63d1..719f449bd80 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -4,24 +4,28 @@ "name": "@opencode-ai/core", "type": "module", "license": "MIT", - "private": true, + "repository": { + "type": "git", + "url": "git+https://github.com/anomalyco/opencode.git", + "directory": "packages/core" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + "dist" + ], "scripts": { "db": "bun drizzle-kit", "migration": "bun run script/migration.ts", "fix-node-pty": "bun run script/fix-node-pty.ts", "benchmark:location": "bun run script/benchmark-location.ts", + "build": "bun run script/build.ts", "update-models-snapshot": "bun run script/update-models-snapshot.ts", "test": "bun test --only-failures", "typecheck": "tsgo -b tsconfig.json tsconfig.tests.json" }, - "bin": { - "opencode": "./bin/opencode" - }, "exports": { - "./environment": "./src/environment/index.ts", - "./testing/environment-conformance": "./test/lib/environment-conformance.ts", - "./session/runner": "./src/session/runner/index.ts", - "./instructions": "./src/instructions/index.ts", "./*": "./src/*.ts" }, "imports": { @@ -32,32 +36,46 @@ "default": "./src/database/sqlite.node.ts" }, "#pty": { + "workerd": "./src/pty/pty.workerd.ts", "bun": "./src/pty/pty.bun.ts", "node": "./src/pty/pty.node.ts", "default": "./src/pty/pty.bun.ts" }, "#fff": { + "workerd": "./src/filesystem/fff.workerd.ts", "bun": "./src/filesystem/fff.bun.ts", "node": "./src/filesystem/fff.node.ts", "default": "./src/filesystem/fff.bun.ts" }, "#photon-wasm": { + "workerd": "./src/image/photon-wasm.workerd.ts", "bun": "./src/image/photon-wasm.bun.ts", "node": "./src/image/photon-wasm.node.ts", "default": "./src/image/photon-wasm.bun.ts" }, "#shell-parser-wasm": { + "workerd": "./src/shell/parser-wasm.workerd.ts", "bun": "./src/shell/parser-wasm.bun.ts", "node": "./src/shell/parser-wasm.node.ts", "default": "./src/shell/parser-wasm.bun.ts" }, "#process-lock-ffi": { + "workerd": "./src/util/process-lock-ffi.workerd.ts", "bun": "./src/util/process-lock-ffi.bun.ts", "node": "./src/util/process-lock-ffi.node.ts", "default": "./src/util/process-lock-ffi.bun.ts" + }, + "#v1-migration": { + "types": "./src/database/v1-migration.bun.ts", + "bun": "./src/database/v1-migration.bun.ts", + "node": "./src/database/v1-migration.noop.ts", + "workerd": "./src/database/v1-migration.noop.ts", + "default": "./src/database/v1-migration.noop.ts" } }, "devDependencies": { + "@effect/platform-node": "catalog:", + "@effect/sql-sqlite-bun": "catalog:", "@tsconfig/bun": "catalog:", "@types/bun": "catalog:", "@types/node": "catalog:", @@ -93,8 +111,6 @@ "@ai-sdk/togetherai": "2.0.41", "@ai-sdk/vercel": "2.0.39", "@aws-sdk/credential-providers": "3.1057.0", - "@effect/platform-node": "catalog:", - "@effect/sql-sqlite-bun": "catalog:", "@lydell/node-pty": "catalog:", "@modelcontextprotocol/sdk": "1.29.0", "@ff-labs/fff-bun": "0.10.1", @@ -128,8 +144,5 @@ "web-tree-sitter": "0.25.10", "which": "6.0.1", "zod": "catalog:" - }, - "overrides": { - "drizzle-orm": "catalog:" } } diff --git a/packages/core/schema.json b/packages/core/schema.json index 8388ce9cd2b..0bfde100e16 100644 --- a/packages/core/schema.json +++ b/packages/core/schema.json @@ -1,8 +1,8 @@ { "version": "7", "dialect": "sqlite", - "id": "00924d88-1842-4d71-ac74-5682ddc47e1c", - "prevIds": ["15060ec5-05f7-4b86-b2a5-9108609432b3"], + "id": "5c1aa56b-c3ee-4283-9a84-c0bf626dc604", + "prevIds": ["00924d88-1842-4d71-ac74-5682ddc47e1c"], "ddl": [ { "name": "account_state", @@ -56,6 +56,10 @@ "name": "instruction_state", "entityType": "tables" }, + { + "name": "session_inbox", + "entityType": "tables" + }, { "name": "session_message", "entityType": "tables" @@ -842,6 +846,76 @@ "entityType": "columns", "table": "instruction_state" }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "session_inbox" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "session_inbox" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "type", + "entityType": "columns", + "table": "session_inbox" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "payload", + "entityType": "columns", + "table": "session_inbox" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "delivery", + "entityType": "columns", + "table": "session_inbox" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "enqueued_seq", + "entityType": "columns", + "table": "session_inbox" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "time_created", + "entityType": "columns", + "table": "session_inbox" + }, { "type": "text", "notNull": false, @@ -1428,6 +1502,17 @@ "entityType": "fks", "table": "instruction_state" }, + { + "columns": ["session_id"], + "tableTo": "session_v2", + "columnsTo": ["id"], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "nameExplicit": false, + "name": "fk_session_inbox_session_id_session_v2_id_fk", + "entityType": "fks", + "table": "session_inbox" + }, { "columns": ["session_id"], "tableTo": "session_v2", @@ -1552,6 +1637,13 @@ "table": "instruction_state", "entityType": "pks" }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "session_inbox_pk", + "table": "session_inbox", + "entityType": "pks" + }, { "columns": ["id"], "nameExplicit": false, @@ -1642,6 +1734,46 @@ "entityType": "indexes", "table": "permission" }, + { + "columns": [ + { + "value": "session_id", + "isExpression": false + }, + { + "value": "delivery", + "isExpression": false + }, + { + "value": "enqueued_seq", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "session_inbox_session_delivery_seq_idx", + "entityType": "indexes", + "table": "session_inbox" + }, + { + "columns": [ + { + "value": "session_id", + "isExpression": false + }, + { + "value": "enqueued_seq", + "isExpression": false + } + ], + "isUnique": true, + "where": null, + "origin": "manual", + "name": "session_inbox_session_enqueued_seq_idx", + "entityType": "indexes", + "table": "session_inbox" + }, { "columns": [ { diff --git a/packages/core/script/build.ts b/packages/core/script/build.ts new file mode 100644 index 00000000000..bf8eec926e4 --- /dev/null +++ b/packages/core/script/build.ts @@ -0,0 +1,34 @@ +#!/usr/bin/env bun + +import { $ } from "bun" +import { rm } from "node:fs/promises" +import path from "node:path" +import { fileURLToPath } from "node:url" + +process.chdir(fileURLToPath(new URL("..", import.meta.url))) + +await rm("dist", { recursive: true, force: true }) +await $`bun tsc -p tsconfig.build.json` + +const root = path.resolve("src") +const files = await Array.fromAsync(new Bun.Glob("**/*.ts").scan({ cwd: root, absolute: true })) +const result = await Bun.build({ + entrypoints: files.filter((file) => !file.endsWith(".d.ts")), + root, + outdir: "dist", + target: "node", + format: "esm", + packages: "external", + external: ["#sqlite", "#pty", "#fff", "#photon-wasm", "#shell-parser-wasm", "#process-lock-ffi", "#v1-migration"], + splitting: true, + loader: { + ".txt": "text", + ".md": "text", + }, + naming: { + entry: "[dir]/[name].[ext]", + chunk: "chunks/[name]-[hash].[ext]", + asset: "assets/[name]-[hash].[ext]", + }, +}) +if (!result.success) throw new AggregateError(result.logs, "Failed to build Core") diff --git a/packages/core/script/publish.ts b/packages/core/script/publish.ts new file mode 100644 index 00000000000..39c65f086a4 --- /dev/null +++ b/packages/core/script/publish.ts @@ -0,0 +1,50 @@ +#!/usr/bin/env bun + +import { Script } from "@opencode-ai/script" +import { $ } from "bun" +import { rm } from "node:fs/promises" +import { fileURLToPath } from "node:url" + +process.chdir(fileURLToPath(new URL("..", import.meta.url))) + +const originalText = await Bun.file("package.json").text() +const pkg = JSON.parse(originalText) as { + name: string + version: string + exports: Record + imports: Record> +} +const tarball = `${pkg.name.replace("@", "").replace("/", "-")}-${pkg.version}.tgz` +const output = (value: string, types = false) => + value.replace("./src/", types ? "./dist/types/" : "./dist/").replace(/\.ts$/, types ? ".d.ts" : ".js") + +if ((await $`npm view ${pkg.name}@${pkg.version} version`.nothrow()).exitCode === 0) { + console.log(`already published ${pkg.name}@${pkg.version}`) + process.exit(0) +} + +try { + await $`bun run typecheck` + await $`bun run build` + pkg.exports = Object.fromEntries( + Object.entries(pkg.exports).map(([key, value]) => { + if (typeof value !== "string") return [key, value] + return [key, { import: output(value), types: output(value, true) }] + }), + ) + pkg.imports = Object.fromEntries( + Object.entries(pkg.imports).map(([key, conditions]) => [ + key, + Object.fromEntries( + Object.entries(conditions).map(([condition, value]) => [condition, output(value, condition === "types")]), + ), + ]), + ) + await Bun.write("package.json", JSON.stringify(pkg, null, 2) + "\n") + await rm(tarball, { force: true }) + await $`bun pm pack` + await $`npm publish ${tarball} --tag ${Script.channel} --access public` +} finally { + await Bun.write("package.json", originalText) + await rm(tarball, { force: true }) +} diff --git a/packages/core/src/aisdk.ts b/packages/core/src/aisdk.ts index 1234e1053b3..9652c16921a 100644 --- a/packages/core/src/aisdk.ts +++ b/packages/core/src/aisdk.ts @@ -763,7 +763,9 @@ function apiCallErrorReason(error: APICallError) { if (error.statusCode !== undefined || !error.isRetryable) return reason return new TransportReason({ message: reason.message, - kind: error.name, + transport: "http", + operation: "request", + code: error.name, url: error.url, http: "http" in reason ? reason.http : undefined, }) diff --git a/packages/core/src/bus.ts b/packages/core/src/bus.ts index 9fc7cdb6319..91846b2a427 100644 --- a/packages/core/src/bus.ts +++ b/packages/core/src/bus.ts @@ -6,7 +6,8 @@ import type { EventLog } from "@opencode-ai/schema/event-log" import { and, asc, eq, gt, lte, sql } from "drizzle-orm" import { Database } from "./database/database.js" import { EventSequenceTable, EventTable } from "./event/sql.js" -import { Location } from "./location.js" +import type { Location } from "@opencode-ai/schema/location" +import { KeyedMutex } from "./effect/keyed-mutex.js" import { makeGlobalNode } from "@opencode-ai/util/effect/app-node" import { isDeepStrictEqual } from "node:util" import { Durable } from "@opencode-ai/schema/durable-event-manifest" @@ -92,6 +93,16 @@ export interface PublishOptions { readonly commit?: (seq: number) => Effect.Effect } +export type PublishInput = readonly [ + definition: D, + data: Event.Data, + options?: PublishOptions, +] + +export type PublishResult = { + readonly [K in keyof I]: I[K] extends PublishInput ? Event.Payload : never +} + /** Marker/event union emitted by `log`. */ export type LogItem = Event.Payload | EventLog.Synced @@ -124,6 +135,9 @@ export interface Interface { data: Event.Data, options?: PublishOptions, ) => Effect.Effect> + readonly publishAll: ( + events: I, + ) => Effect.Effect> readonly subscribe: Subscribe /** * Durable, ordered per-aggregate log read. Forked aggregates may reserve an @@ -169,6 +183,9 @@ export function configured(options?: Options) { layer: Layer.effect( Service, Effect.gen(function* () { + // Deferred import: a static one would close the module cycle + // bus → location → project → bus and hit the node bindings in TDZ. + const { Location } = yield* Effect.promise(() => import("./location.js")) const pubsub = { live: yield* PubSub.unbounded(), durable: new Map>>(), @@ -176,6 +193,7 @@ export function configured(options?: Options) { } const projectors = new Map() const listeners = new Array() + const durableLocks = KeyedMutex.makeUnsafe() const { db } = yield* Database.Service const logReadPageSize = options?.logReadPageSize ?? 512 const persist = options?.persist ?? false @@ -385,15 +403,23 @@ export function configured(options?: Options) { }), ) if (definition?.durable) { - const committed = yield* commitDurableEvent(definition, event as Event.Payload, undefined, commit) - if (committed) { - event = { - ...event, - durable: envelope(committed.aggregateID, committed.seq, definition.durable.version), - } - yield* notify(event as Event.Payload, true) - return event - } + const aggregateID = (event.data as Record)[definition.durable.aggregate] + if (typeof aggregateID !== "string") + return yield* commitDurableEvent(definition, event as Event.Payload, undefined, commit).pipe( + Effect.as(event), + ) + return yield* durableLocks.withLock(aggregateID)( + Effect.gen(function* () { + const committed = yield* commitDurableEvent(definition, event as Event.Payload, undefined, commit) + if (!committed) return event + event = { + ...event, + durable: envelope(committed.aggregateID, committed.seq, definition.durable.version), + } + yield* notify(event as Event.Payload, true) + return event + }), + ) } yield* notify(event as Event.Payload, false) return event @@ -444,6 +470,144 @@ export function configured(options?: Options) { }) } + function publishAll(events: I) { + return Effect.gen(function* () { + const serviceLocation = Option.getOrUndefined(yield* Effect.serviceOption(Location.Service)) + const payloads = yield* Effect.forEach(events, ([definition, data, options]) => + Effect.gen(function* () { + const aggregateID = (data as Record)[definition.durable.aggregate] + if (typeof aggregateID !== "string") { + return yield* Effect.die( + new InvalidDurableEventError({ + type: definition.type, + message: `Expected string aggregate field ${definition.durable.aggregate}`, + }), + ) + } + const location = + options?.location ?? + (serviceLocation + ? { directory: serviceLocation.directory, workspaceID: serviceLocation.workspaceID } + : undefined) + return { + definition, + aggregateID, + commit: options?.commit, + event: { + id: options?.id ?? Event.ID.create(), + created: yield* DateTime.now, + ...(options?.metadata ? { metadata: options.metadata } : {}), + type: definition.type, + ...(location ? { location } : {}), + data, + } as Event.Payload, + } + }), + ) + const aggregateID = payloads[0].aggregateID + if (payloads.some((item) => item.aggregateID !== aggregateID)) { + return yield* Effect.die( + new InvalidDurableEventError({ + type: payloads[0].definition.type, + message: "Published events must belong to the same aggregate", + }), + ) + } + return yield* durableLocks.withLock(aggregateID)( + Effect.uninterruptible( + Effect.gen(function* () { + const committed = yield* db + .transaction( + () => + Effect.gen(function* () { + const row = yield* db + .select({ seq: EventSequenceTable.seq }) + .from(EventSequenceTable) + .where(eq(EventSequenceTable.aggregate_id, aggregateID)) + .get() + .pipe(Effect.orDie) + const firstSeq = (row?.seq ?? -1) + 1 + const finalSeq = firstSeq + payloads.length - 1 + const result = new Array() + const rows = new Array() + const ids = new Set() + for (const [index, item] of payloads.entries()) { + const seq = firstSeq + index + const encoded = Schema.encodeUnknownSync(item.definition.data)(item.event.data) as Record< + string, + unknown + > + if (persist) { + if (ids.has(item.event.id)) + yield* Effect.die( + new InvalidDurableEventError({ + type: item.event.type, + message: `Event ${item.event.id} appears more than once in the batch`, + }), + ) + ids.add(item.event.id) + const stored = yield* db + .select({ aggregateID: EventTable.aggregate_id, seq: EventTable.seq }) + .from(EventTable) + .where(eq(EventTable.id, item.event.id)) + .get() + .pipe(Effect.orDie) + if (stored) + yield* Effect.die( + new InvalidDurableEventError({ + type: item.event.type, + message: `Event ${item.event.id} already exists at aggregate ${stored.aggregateID} sequence ${stored.seq}`, + }), + ) + } + const event = { + ...item.event, + durable: envelope(aggregateID, seq, item.definition.durable.version), + } as Event.Payload + for (const projector of projectors.get( + versionedType(item.definition.type, item.definition.durable.version), + ) ?? []) { + yield* projector(event) + } + if (item.commit) yield* item.commit(seq) + if (persist) + rows.push({ + id: event.id, + aggregate_id: aggregateID, + seq, + created: DateTime.toEpochMillis(event.created), + type: versionedType(item.definition.type, item.definition.durable.version), + data: encoded, + }) + result.push(event) + } + yield* db + .insert(EventSequenceTable) + .values([{ aggregate_id: aggregateID, seq: finalSeq }]) + .onConflictDoUpdate({ target: EventSequenceTable.aggregate_id, set: { seq: finalSeq } }) + .run() + .pipe(Effect.orDie) + if (persist) yield* db.insert(EventTable).values(rows).run().pipe(Effect.orDie) + return result + }), + { behavior: "immediate" }, + ) + .pipe(Effect.orDie) + yield* Effect.forEach( + pubsub.durable.get(aggregateID) ?? [], + (wake) => PubSub.publish(wake, undefined), + { + discard: true, + }, + ) + yield* Effect.forEach(committed, (event) => notify(event, true), { discard: true }) + return committed as PublishResult + }), + ), + ) + }) + } + function replay( event: SerializedEvent, options?: { readonly publish?: boolean; readonly ownerID?: string; readonly strictOwner?: boolean }, @@ -455,27 +619,31 @@ export function configured(options?: Options) { new InvalidDurableEventError({ type: event.type, message: `Unknown durable event type ${event.type}` }), ) } else { - const payload = { - id: event.id, - created: event.created ?? DateTime.makeUnsafe(0), - type: definition.type, - data: Schema.decodeUnknownSync(definition.data)(event.data), - } as Event.Payload - const committed = yield* commitDurableEvent(definition, payload, { - seq: event.seq, - aggregateID: event.aggregateID, - ownerID: options?.ownerID, - strictOwner: options?.strictOwner, - }) - if (committed && options?.publish) { - yield* notify( - { - ...payload, - durable: envelope(committed.aggregateID, committed.seq, definition.durable.version), - }, - true, - ) - } + yield* durableLocks.withLock(event.aggregateID)( + Effect.gen(function* () { + const payload = { + id: event.id, + created: event.created ?? DateTime.makeUnsafe(0), + type: definition.type, + data: Schema.decodeUnknownSync(definition.data)(event.data), + } as Event.Payload + const committed = yield* commitDurableEvent(definition, payload, { + seq: event.seq, + aggregateID: event.aggregateID, + ownerID: options?.ownerID, + strictOwner: options?.strictOwner, + }) + if (committed && options?.publish) { + yield* notify( + { + ...payload, + durable: envelope(committed.aggregateID, committed.seq, definition.durable.version), + }, + true, + ) + } + }), + ) } }) } @@ -692,6 +860,7 @@ export function configured(options?: Options) { return Service.of({ publish, + publishAll, subscribe, log, listen, diff --git a/packages/core/src/codemode/tool.ts b/packages/core/src/codemode/tool.ts index aa7f4af73b1..23aa7a4708a 100644 --- a/packages/core/src/codemode/tool.ts +++ b/packages/core/src/codemode/tool.ts @@ -75,7 +75,9 @@ export const create = ( const outputFileParts = outputFiles(content) if (outputFileParts.length > 0) yield* Ref.update(files, (items) => [...items, { index, files: outputFileParts }]) - return executed.output + if (executed.output !== undefined) return executed.output + const text = content.flatMap((part) => (part.type === "text" ? [part.text] : [])).join("\n") + return text === "" ? null : text }), { onToolCallStart: ({ index, name, input }) => { @@ -155,7 +157,7 @@ function runtime( tools[path] = Tool.make({ description: child.description, input: child.inputSchema, - output: child.outputSchema, + output: child.outputSchema ?? Schema.NullOr(Schema.String), execute: (input) => executeTool(name, registration, input), }) } diff --git a/packages/core/src/database/database.ts b/packages/core/src/database/database.ts index 369106cde43..fb5eb276103 100644 --- a/packages/core/src/database/database.ts +++ b/packages/core/src/database/database.ts @@ -65,4 +65,13 @@ export function configured(options?: Options) { return makeGlobalNode({ service: Service, layer: layer(options), deps: [Global.node] }) } +/** `configured`, but over an injected SqlClient layer instead of a filesystem path. */ +export function configuredClient(client: Layer.Layer) { + return makeGlobalNode({ + service: Service, + layer: layerFromClient.pipe(Layer.provide(client)), + deps: [Global.node], + }) +} + export const node = configured({ path: ":memory:" }) diff --git a/packages/core/src/database/drizzle/effect-sqlite/session.ts b/packages/core/src/database/drizzle/effect-sqlite/session.ts index 7d8dc290cdd..6cfb5dabf7b 100644 --- a/packages/core/src/database/drizzle/effect-sqlite/session.ts +++ b/packages/core/src/database/drizzle/effect-sqlite/session.ts @@ -28,6 +28,20 @@ export interface EffectSQLiteQueryEffectHKT extends QueryEffectHKTBase { readonly context: never } +/** + * A SqlClient whose runtime rejects SQL transaction statements (BEGIN/COMMIT/SAVEPOINT) and + * manages transactions natively instead — Cloudflare Durable Object SQLite. Producers set + * `transactionStatements: false` (see `database/sqlite.workerd.ts`) and the session delegates + * to the client's `withTransaction` rather than issuing transaction statements. + */ +export interface NativeTransactionSqlClient extends SqlClient { + readonly transactionStatements: false +} + +export function managesTransactionsNatively(client: SqlClient): client is NativeTransactionSqlClient { + return (client as SqlClient & { readonly transactionStatements?: boolean }).transactionStatements === false +} + export type EffectSQLiteRunResult = readonly never[] export interface EffectSQLiteSessionOptions { @@ -120,6 +134,7 @@ export class EffectSQLiteSession extends SQLite } private withTransaction(effect: Effect.Effect, config: SQLiteTransactionConfig | undefined) { + if (managesTransactionsNatively(this.client)) return this.client.withTransaction(effect) return Effect.uninterruptibleMask((restore) => Effect.withFiber((fiber) => { const services = fiber.context diff --git a/packages/core/src/database/migration.gen.ts b/packages/core/src/database/migration.gen.ts index 8d1bcad1eb0..1fb55eb24c2 100644 --- a/packages/core/src/database/migration.gen.ts +++ b/packages/core/src/database/migration.gen.ts @@ -41,6 +41,7 @@ import m38 from "./migration/20260804233008_loose_psylocke.js" import m39 from "./migration/20260805200742_import_legacy_credentials.js" import m40 from "./migration/20260808023530_workspace_domain.js" import m41 from "./migration/20260811161259_execution_claim_attempts.js" +import m42 from "./migration/20260812181746_session_inbox.js" export const migrations = [ m00, @@ -85,4 +86,5 @@ export const migrations = [ m39, m40, m41, + m42, ] satisfies DatabaseMigration.Migration[] diff --git a/packages/core/src/database/migration/20260812181746_session_inbox.ts b/packages/core/src/database/migration/20260812181746_session_inbox.ts new file mode 100644 index 00000000000..434837a804e --- /dev/null +++ b/packages/core/src/database/migration/20260812181746_session_inbox.ts @@ -0,0 +1,30 @@ +import { Effect } from "effect" +import type { DatabaseMigration } from "../migration.js" + +const migration: DatabaseMigration.Migration = { + id: "20260812181746_session_inbox", + up(tx) { + return Effect.gen(function* () { + yield* tx.run(` + CREATE TABLE \`session_inbox\` ( + \`id\` text PRIMARY KEY, + \`session_id\` text NOT NULL, + \`type\` text NOT NULL, + \`payload\` text NOT NULL, + \`delivery\` text NOT NULL, + \`enqueued_seq\` integer NOT NULL, + \`time_created\` integer NOT NULL, + CONSTRAINT \`fk_session_inbox_session_id_session_v2_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session_v2\`(\`id\`) ON DELETE CASCADE + ); + `) + yield* tx.run( + `CREATE INDEX \`session_inbox_session_delivery_seq_idx\` ON \`session_inbox\` (\`session_id\`,\`delivery\`,\`enqueued_seq\`);`, + ) + yield* tx.run( + `CREATE UNIQUE INDEX \`session_inbox_session_enqueued_seq_idx\` ON \`session_inbox\` (\`session_id\`,\`enqueued_seq\`);`, + ) + }) + }, +} + +export default migration diff --git a/packages/core/src/database/schema.gen.ts b/packages/core/src/database/schema.gen.ts index c0e17437ae0..13f94e420ea 100644 --- a/packages/core/src/database/schema.gen.ts +++ b/packages/core/src/database/schema.gen.ts @@ -142,6 +142,18 @@ const schema: Omit = { CONSTRAINT \`fk_instruction_state_session_id_session_v2_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session_v2\`(\`id\`) ON DELETE CASCADE ); `) + yield* tx.run(` + CREATE TABLE \`session_inbox\` ( + \`id\` text PRIMARY KEY, + \`session_id\` text NOT NULL, + \`type\` text NOT NULL, + \`payload\` text NOT NULL, + \`delivery\` text NOT NULL, + \`enqueued_seq\` integer NOT NULL, + \`time_created\` integer NOT NULL, + CONSTRAINT \`fk_session_inbox_session_id_session_v2_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session_v2\`(\`id\`) ON DELETE CASCADE + ); + `) yield* tx.run(` CREATE TABLE \`session_message\` ( \`id\` text PRIMARY KEY, @@ -218,6 +230,12 @@ const schema: Omit = { yield* tx.run( `CREATE UNIQUE INDEX \`permission_project_action_resource_idx\` ON \`permission\` (\`project_id\`,\`action\`,\`resource\`);`, ) + yield* tx.run( + `CREATE INDEX \`session_inbox_session_delivery_seq_idx\` ON \`session_inbox\` (\`session_id\`,\`delivery\`,\`enqueued_seq\`);`, + ) + yield* tx.run( + `CREATE UNIQUE INDEX \`session_inbox_session_enqueued_seq_idx\` ON \`session_inbox\` (\`session_id\`,\`enqueued_seq\`);`, + ) yield* tx.run( `CREATE UNIQUE INDEX \`session_message_session_seq_idx\` ON \`session_message\` (\`session_id\`,\`seq\`);`, ) diff --git a/packages/core/src/database/sqlite.bun.ts b/packages/core/src/database/sqlite.bun.ts index ac8f023878f..f44e9783d24 100644 --- a/packages/core/src/database/sqlite.bun.ts +++ b/packages/core/src/database/sqlite.bun.ts @@ -1,5 +1,4 @@ import { Database, type SQLQueryBindings } from "bun:sqlite" -import { drizzle } from "drizzle-orm/bun-sqlite" import { Context, Effect, Layer } from "effect" import { Reactivity } from "effect/unstable/reactivity" import { SqlClient } from "effect/unstable/sql" @@ -98,16 +97,7 @@ const nativeLayer = (config: Config) => const clientLayer = (config: Config) => Layer.effect(SqlClient.SqlClient, make(config)) -const drizzleLayer = Layer.effect( - Sqlite.Drizzle, - Effect.gen(function* () { - return drizzle({ client: (yield* Sqlite.Native) as Database }) - }), -) - export const sqliteLayer = (config: Config) => { const native = nativeLayer(config) - return Layer.merge(native, Layer.merge(clientLayer(config), drizzleLayer).pipe(Layer.provide(native))).pipe( - Layer.provide(Reactivity.layer), - ) + return Layer.merge(native, clientLayer(config).pipe(Layer.provide(native))).pipe(Layer.provide(Reactivity.layer)) } diff --git a/packages/core/src/database/sqlite.node.ts b/packages/core/src/database/sqlite.node.ts index 49e12de3b43..837beaa1f88 100644 --- a/packages/core/src/database/sqlite.node.ts +++ b/packages/core/src/database/sqlite.node.ts @@ -1,5 +1,4 @@ import { DatabaseSync, type SQLInputValue } from "node:sqlite" -import { drizzle } from "drizzle-orm/node-sqlite" import { Context, Effect, Layer } from "effect" import { Reactivity } from "effect/unstable/reactivity" import { SqlClient } from "effect/unstable/sql" @@ -95,16 +94,7 @@ const nativeLayer = (config: Config) => const clientLayer = (config: Config) => Layer.effect(SqlClient.SqlClient, make(config)) -const drizzleLayer = Layer.effect( - Sqlite.Drizzle, - Effect.gen(function* () { - return drizzle({ client: (yield* Sqlite.Native) as DatabaseSync }) as unknown as Sqlite.DrizzleClient - }), -) - export const sqliteLayer = (config: Config) => { const native = nativeLayer(config) - return Layer.merge(native, Layer.merge(clientLayer(config), drizzleLayer).pipe(Layer.provide(native))).pipe( - Layer.provide(Reactivity.layer), - ) + return Layer.merge(native, clientLayer(config).pipe(Layer.provide(native))).pipe(Layer.provide(Reactivity.layer)) } diff --git a/packages/core/src/database/sqlite.ts b/packages/core/src/database/sqlite.ts index 1add137b10f..6ab22de8caf 100644 --- a/packages/core/src/database/sqlite.ts +++ b/packages/core/src/database/sqlite.ts @@ -5,11 +5,8 @@ import { identity } from "effect/Function" import { SqlClient, Statement } from "effect/unstable/sql" import type { Connection } from "effect/unstable/sql/SqlConnection" import type { SqlError } from "effect/unstable/sql/SqlError" -import type { drizzle } from "drizzle-orm/bun-sqlite" -export type DrizzleClient = ReturnType export class Native extends Context.Service()("@opencode-ai/core/database/SqliteNative") {} -export class Drizzle extends Context.Service()("@opencode-ai/core/database/SqliteDrizzle") {} export interface ClientConfig { readonly spanAttributes?: Record diff --git a/packages/core/src/database/sqlite.workerd.ts b/packages/core/src/database/sqlite.workerd.ts index da7a860e06e..d0f4e5d2bf8 100644 --- a/packages/core/src/database/sqlite.workerd.ts +++ b/packages/core/src/database/sqlite.workerd.ts @@ -1,10 +1,10 @@ -import { drizzle } from "drizzle-orm/durable-sqlite" import { Context, Effect, Exit, Fiber, Layer, Scope, Semaphore, Stream } from "effect" import { identity } from "effect/Function" import { Reactivity } from "effect/unstable/reactivity" import { SqlClient, Statement } from "effect/unstable/sql" import type { Connection } from "effect/unstable/sql/SqlConnection" import { classifySqliteError, SqlError, UnknownError } from "effect/unstable/sql/SqlError" +import type { NativeTransactionSqlClient } from "./drizzle/effect-sqlite/session.js" import { Sqlite } from "./sqlite.js" const ATTR_DB_SYSTEM_NAME = "db.system.name" @@ -216,10 +216,10 @@ const make = (options: Config) => config: options, withTransaction: makeWithTransaction(native, connection, semaphore), // Durable Object SQLite rejects BEGIN/COMMIT/SAVEPOINT; consumers such - // as the drizzle session must route through withTransaction instead. + // as the drizzle session detect this and route through withTransaction. transactionStatements: false, - }, - ) + } as const, + ) satisfies NativeTransactionSqlClient return client }) @@ -238,17 +238,7 @@ const nativeLayer = (config: Config) => const clientLayer = (config: Config) => Layer.effect(SqlClient.SqlClient, make(config)) -const drizzleLayer = Layer.effect( - Sqlite.Drizzle, - Effect.gen(function* () { - const native = (yield* Sqlite.Native) as DurableObjectStorage - return drizzle(native) as unknown as Sqlite.DrizzleClient - }), -) - export const sqliteLayer = (config: Config) => { const native = nativeLayer(config) - return Layer.merge(native, Layer.merge(clientLayer(config), drizzleLayer).pipe(Layer.provide(native))).pipe( - Layer.provide(Reactivity.layer), - ) + return Layer.merge(native, clientLayer(config).pipe(Layer.provide(native))).pipe(Layer.provide(Reactivity.layer)) } diff --git a/packages/core/src/database/v1-migration.bun.ts b/packages/core/src/database/v1-migration.bun.ts new file mode 100644 index 00000000000..5c3150c77c1 --- /dev/null +++ b/packages/core/src/database/v1-migration.bun.ts @@ -0,0 +1,997 @@ +export * as V1Migration from "./v1-migration.js" + +import { Cause, Effect, Layer, Option, Schema, Semaphore } from "effect" +import { Database } from "./database.js" +import { SessionMessageTable, SessionTable } from "../session/sql.js" +import { SessionV1 } from "@opencode-ai/schema/session-v1" +import { SessionMessage } from "../session/message.js" +import { SessionSchema } from "../session/schema.js" +import { KVTable } from "../kv/sql.js" +import { EventSequenceTable } from "../event/sql.js" +import { eq, sql } from "drizzle-orm" +import { Global } from "@opencode-ai/util/global" +import { existsSync } from "node:fs" +import path from "node:path" +import type { Database as SQLiteDatabase } from "bun:sqlite" +import { Project } from "@opencode-ai/schema/project" + +export type SourceMessage = { + readonly id: string + readonly session_id: string + readonly time_created: number + readonly time_updated: number + readonly data: string +} + +export type SourcePart = { + readonly id: string + readonly message_id: string + readonly session_id: string + readonly time_created: number + readonly time_updated: number + readonly data: string +} + +export type TransformInput = { + readonly session: typeof SessionTable.$inferSelect + readonly messages: ReadonlyArray + readonly parts: ReadonlyArray +} + +export type Warning = { + readonly reason: string + readonly sessionID: string + readonly messageID?: string + readonly partID?: string + readonly observedType?: string +} + +export type TransformResult = { + readonly messages: ReadonlyArray<{ + readonly id: string + readonly session_id: string + readonly type: SessionMessage.Type + readonly seq: number + readonly time_created: number + readonly time_updated: number + readonly data: Record + }> + readonly session: Pick< + typeof SessionTable.$inferInsert, + | "agent" + | "model" + | "cost" + | "tokens_input" + | "tokens_output" + | "tokens_reasoning" + | "tokens_cache_read" + | "tokens_cache_write" + | "revert" + | "time_compacting" + > + readonly watermark: number + readonly warnings: ReadonlyArray +} + +type Progress = { + readonly label: string + readonly numerator?: number + readonly denominator?: number +} + +export type Status = + | { readonly status: "required" | "completed" } + | { readonly status: "running"; readonly progress: Progress } + | { readonly status: "error"; readonly error: string } + +type RunResult = { + readonly status: "completed" +} + +type Options = { + readonly nextDatabasePath?: string +} + +type MigrationState = { readonly phase: "sessions"; readonly cursor?: string } | { readonly phase: "completed" } + +type RuntimeState = + | { readonly status: "idle" } + | { readonly status: "running"; readonly progress: Progress } + | { readonly status: "error"; readonly error: string } + +type NextProject = { + readonly id: string + readonly worktree: string + readonly vcs: string | null + readonly name: string | null + readonly icon_url: string | null + readonly icon_url_override: string | null + readonly icon_color: string | null + readonly time_created: number + readonly time_updated: number + readonly time_initialized: number | null + readonly sandboxes: string + readonly commands: string | null +} + +type NextSession = { + readonly id: string + readonly project_id: string + readonly workspace_id: string | null + readonly parent_id: string | null + readonly fork_session_id: string | null + readonly fork_boundary: string | null + readonly slug: string + readonly directory: string + readonly path: string | null + readonly title: string | null + readonly version: string + readonly share_url: string | null + readonly summary_additions: number | null + readonly summary_deletions: number | null + readonly summary_files: number | null + readonly summary_diffs: string | null + readonly metadata: string | null + readonly cost: number + readonly tokens_input: number + readonly tokens_output: number + readonly tokens_reasoning: number + readonly tokens_cache_read: number + readonly tokens_cache_write: number + readonly revert: string | null + readonly permission: string | null + readonly agent: string | null + readonly model: string | null + readonly time_created: number + readonly time_updated: number + readonly time_compacting: number | null + readonly time_archived: number | null + readonly time_suspended: number | null +} + +type NextMessage = { + readonly id: string + readonly session_id: string + readonly type: string + readonly seq: number + readonly time_created: number + readonly time_updated: number + readonly data: string +} + +const lock = Semaphore.makeUnsafe(1) +const MIGRATION_STATE_KEY = "migration.v1-v2" +const EVENT_DELETE_BATCH_SIZE = 1_000 +const decodeJson = Schema.decodeUnknownOption(Schema.UnknownFromJsonString) +const decodeMessage = Schema.decodeUnknownOption(SessionV1.Info) +const decodePart = Schema.decodeUnknownOption(SessionV1.Part) +let runtimeState: RuntimeState = { status: "idle" } + +export function transformSession(input: TransformInput): TransformResult { + const warnings: Warning[] = [] + const messages = input.messages + .map((row) => { + const value = Option.getOrUndefined(decodeJson(row.data)) + const decoded = + value && typeof value === "object" + ? Option.getOrUndefined(decodeMessage({ ...value, id: row.id, sessionID: row.session_id })) + : undefined + if (decoded) return { row, value: decoded } + warnings.push({ reason: "invalid-message", sessionID: input.session.id, messageID: row.id }) + return undefined + }) + .filter((item): item is NonNullable => item !== undefined) + .sort((a, b) => a.row.time_created - b.row.time_created || a.row.id.localeCompare(b.row.id)) + const messageIDs = new Set(input.messages.map((row) => row.id)) + const parts = input.parts + .map((row) => { + const value = Option.getOrUndefined(decodeJson(row.data)) + const observedType = value && typeof value === "object" && "type" in value ? String(value.type) : undefined + if (!messageIDs.has(row.message_id)) { + warnings.push({ + reason: "orphan-part", + sessionID: input.session.id, + messageID: row.message_id, + partID: row.id, + observedType, + }) + return undefined + } + const decoded = + value && typeof value === "object" + ? Option.getOrUndefined( + decodePart({ ...value, id: row.id, messageID: row.message_id, sessionID: row.session_id }), + ) + : undefined + if (decoded) return { row, value: decoded } + warnings.push({ + reason: "invalid-part", + sessionID: input.session.id, + messageID: row.message_id, + partID: row.id, + observedType, + }) + return undefined + }) + .filter((item): item is NonNullable => item !== undefined) + .sort((a, b) => a.row.id.localeCompare(b.row.id)) + const byMessage = Map.groupBy(parts, (item) => item.row.message_id) + const paired = new Set() + const used = new Set(messages.map((item) => item.row.id)) + const projected = messages + .flatMap((item) => { + if (paired.has(item.row.id)) return [] + const owned = byMessage.get(item.row.id)?.map((part) => part.value) ?? [] + if (item.value.role === "user") { + const compaction = owned.find((part) => part.type === "compaction") + if (compaction?.type === "compaction") { + const pairedSummary = messages.find( + (candidate) => + candidate.value.role === "assistant" && + candidate.value.parentID === item.row.id && + candidate.value.summary, + ) + if (!pairedSummary || pairedSummary.value.role !== "assistant") return [] + paired.add(pairedSummary.row.id) + if (pairedSummary.value.error || pairedSummary.value.time.completed === undefined) return [] + const summary = pairedSummary + const summaryText = (byMessage.get(summary.row.id) ?? []) + .map((part) => part.value) + .filter((part) => part.type === "text" && part.text.length > 0) + .map((part) => (part.type === "text" ? part.text : "")) + .join("\n\n") + const tailIndex = compaction.tail_start_id + ? messages.findIndex((candidate) => candidate.row.id === compaction.tail_start_id) + : -1 + const compactionIndex = messages.findIndex((candidate) => candidate.row.id === item.row.id) + const tail = tailIndex < 0 ? [] : messages.slice(tailIndex, compactionIndex) + return [ + row( + { ...item.row, time_updated: Math.max(item.row.time_updated, summary.row.time_updated) }, + { + id: item.row.id, + type: "compaction", + status: "completed", + reason: compaction.auto ? "auto" : "manual", + summary: summaryText, + recent: serializeRecent(tail, byMessage), + time: { created: item.row.time_created }, + }, + ), + ] + } + const subtasks = owned.filter((part) => part.type === "subtask") + const visible = owned.filter((part) => part.type === "text" && !part.ignored) + const files = owned.filter((part) => part.type === "file") + const agents = owned.filter((part) => part.type === "agent") + if (subtasks.length > 0 && visible.length === 0 && files.length === 0 && agents.length === 0) return [] + const ordinary = visible.filter((part) => part.type === "text" && !part.synthetic) + const synthetic = visible.filter((part) => part.type === "text" && part.synthetic) + const attachments = files.flatMap((part) => (part.type === "file" ? migrateFile(part) : [])) + const unavailable = files.flatMap((part) => + part.type === "file" && !part.url.startsWith("data:") ? [unavailableFile(part)] : [], + ) + const text = owned + .flatMap((part) => { + if (part.type === "text" && !part.ignored && !part.synthetic) return [part.text] + if (part.type === "file" && !part.url.startsWith("data:")) return [unavailableFile(part)] + return [] + }) + .join("\n\n") + const agentAttachments = agents.map((part) => + part.type === "agent" + ? { + name: part.name, + ...(part.source + ? { mention: { text: part.source.value, start: part.source.start, end: part.source.end } } + : {}), + } + : { name: "" }, + ) + if ( + ordinary.length === 0 && + unavailable.length === 0 && + synthetic.length > 0 && + attachments.length === 0 && + agentAttachments.length === 0 + ) + return [ + row(item.row, { + id: item.row.id, + type: "synthetic", + text: synthetic.map((part) => (part.type === "text" ? part.text : "")).join("\n\n"), + time: { created: item.row.time_created }, + }), + ] + const user = row(item.row, { + id: item.row.id, + type: "user", + text, + ...(attachments.length ? { files: attachments } : {}), + ...(agentAttachments.length ? { agents: agentAttachments } : {}), + time: { created: item.row.time_created }, + }) + if (synthetic.length === 0) return [user] + return [ + user, + row(item.row, { + id: syntheticID(item.row.id, used), + type: "synthetic", + text: synthetic.map((part) => (part.type === "text" ? part.text : "")).join("\n\n"), + time: { created: item.row.time_created }, + }), + ] + } + if (item.value.role !== "assistant") return [] + const assistant = item.value + const parent = messages.find((candidate) => candidate.row.id === assistant.parentID) + const parentParts = parent ? (byMessage.get(parent.row.id)?.map((part) => part.value) ?? []) : [] + if ( + parentParts.some((part) => part.type === "subtask") && + owned.some((part) => part.type === "tool" && part.tool === "task") + ) + return [] + const content = owned.flatMap((part): Array> => { + if (part.type === "text") + return [{ type: "text", text: part.text, ...(part.metadata ? { state: part.metadata } : {}) }] + if (part.type === "reasoning") + return [ + { + type: "reasoning", + text: part.text, + ...(part.metadata ? { state: part.metadata } : {}), + time: { created: part.time.start, ...(part.time.end === undefined ? {} : { completed: part.time.end }) }, + }, + ] + if (part.type !== "tool") return [] + return [migrateTool(part, item.row.time_created)] + }) + const start = + owned.flatMap((part) => (part.type === "step-start" && part.snapshot ? [part.snapshot] : []))[0] ?? + owned.flatMap((part) => (part.type === "snapshot" ? [part.snapshot] : []))[0] ?? + owned.flatMap((part) => (part.type === "patch" ? [part.hash] : []))[0] + const end = owned.flatMap((part) => (part.type === "step-finish" && part.snapshot ? [part.snapshot] : [])).at(-1) + const snapshotFiles = Array.from(new Set(owned.flatMap((part) => (part.type === "patch" ? part.files : [])))) + const finish = normalizeFinish(assistant.finish) + return [ + row(item.row, { + id: item.row.id, + type: "assistant", + agent: assistant.agent, + model: { + providerID: assistant.providerID, + id: assistant.modelID, + variant: assistant.variant ?? "default", + }, + content, + ...(start || end || snapshotFiles.length + ? { + snapshot: { + ...(start ? { start } : {}), + ...(end ? { end } : {}), + ...(snapshotFiles.length ? { files: snapshotFiles } : {}), + }, + } + : {}), + ...(finish ? { finish } : {}), + cost: assistant.cost, + tokens: { + input: assistant.tokens.input, + output: assistant.tokens.output, + reasoning: assistant.tokens.reasoning, + cache: assistant.tokens.cache, + }, + ...(assistant.error ? { error: migrateError(assistant.error) } : {}), + time: { + created: item.row.time_created, + ...(assistant.time.completed === undefined ? {} : { completed: item.row.time_updated }), + }, + }), + ] + }) + .map((item, seq) => ({ ...item, seq })) + const assistants = messages + .filter((item) => item.value.role === "assistant") + .map((item) => item.value) + .filter((item): item is SessionV1.Assistant => item.role === "assistant") + const latestUser = messages.findLast((item) => { + if (item.value.role !== "user") return false + const owned = byMessage.get(item.row.id) ?? [] + if (owned.some((part) => part.value.type === "compaction")) return false + return !owned.some((part) => part.value.type === "subtask") || !owned.every((part) => part.value.type === "subtask") + }) + return { + messages: projected, + session: { + agent: input.session.agent ?? (latestUser?.value.role === "user" ? latestUser.value.agent : null), + model: + input.session.model ?? + (latestUser?.value.role === "user" + ? { + id: latestUser.value.model.modelID, + providerID: latestUser.value.model.providerID, + variant: latestUser.value.model.variant ?? "default", + } + : null), + cost: assistants.reduce((total, item) => total + item.cost, 0), + tokens_input: assistants.reduce((total, item) => total + item.tokens.input, 0), + tokens_output: assistants.reduce((total, item) => total + item.tokens.output, 0), + tokens_reasoning: assistants.reduce((total, item) => total + item.tokens.reasoning, 0), + tokens_cache_read: assistants.reduce((total, item) => total + item.tokens.cache.read, 0), + tokens_cache_write: assistants.reduce((total, item) => total + item.tokens.cache.write, 0), + revert: null, + time_compacting: null, + }, + watermark: projected.length - 1, + warnings, + } +} + +export function status(): Effect.Effect { + return Effect.gen(function* () { + const { db } = yield* Database.Service + if (!(yield* hasLegacySessions(db))) return { status: "completed" as const } + const state = yield* readState(db) + if (runtimeState.status === "running") return runtimeState + if (runtimeState.status === "error") return runtimeState + if (state?.phase === "completed") return { status: "completed" as const } + return { status: "required" as const } + }).pipe(Effect.orDie) +} + +export const layer = Layer.effectDiscard( + Effect.gen(function* () { + runtimeState = { status: "running", progress: { label: "Clearing old events" } } + yield* run().pipe( + Effect.matchCauseEffect({ + onFailure: (cause) => + Effect.sync(() => { + runtimeState = { status: "error", error: errorText(Cause.squash(cause)) } + }).pipe(Effect.andThen(Effect.logError("V1 migration failed", { cause }))), + onSuccess: () => + Effect.sync(() => { + runtimeState = { status: "idle" } + }), + }), + Effect.forkScoped({ startImmediately: true }), + ) + }), +) + +function errorText(input: unknown): string { + if (!(input instanceof Error)) return String(input) + const cause = input.cause + return cause === undefined ? input.message : `${input.message}\nCaused by: ${errorText(cause)}` +} + +function updateProgress(progress: Progress) { + if (runtimeState.status === "running") runtimeState = { status: "running", progress } +} + +export function run(options: Options = {}): Effect.Effect { + return lock.withPermit( + Effect.gen(function* () { + const { db } = yield* Database.Service + const global = yield* Global.Service + const state = yield* readState(db) + if (state?.phase === "completed") return { status: "completed" as const } + if (!(yield* hasLegacySessions(db))) return { status: "completed" as const } + const migrate = Effect.gen(function* () { + const now = Date.now() + yield* db.run(sql` + INSERT OR IGNORE INTO project (id, worktree, time_created, time_updated, sandboxes) + VALUES (${Project.ID.global}, ${path.parse(global.data).root}, ${now}, ${now}, '[]') + `) + if (state === undefined) + yield* db + .transaction((tx) => + Effect.gen(function* () { + while (true) { + yield* tx.run(sql` + DELETE FROM event + WHERE rowid IN (SELECT rowid FROM event LIMIT ${EVENT_DELETE_BATCH_SIZE}) + `) + const deleted = (yield* tx.get<{ value: number }>(sql`SELECT changes() AS value`))?.value ?? 0 + if (deleted < EVENT_DELETE_BATCH_SIZE) break + yield* Effect.yieldNow + } + yield* tx + .insert(KVTable) + .values({ key: MIGRATION_STATE_KEY, value: { phase: "sessions" } }) + .run() + }), + ) + .pipe(Effect.orDie) + const sourceTotal = yield* countNextSessions(nextPath(options, global.data)) + const legacyTotal = (yield* db.get<{ value: number }>(sql`SELECT COUNT(*) AS value FROM session`))?.value ?? 0 + const cursor = state?.phase === "sessions" ? state.cursor : undefined + const migrated = + cursor !== undefined + ? ((yield* db.get<{ value: number }>(sql`SELECT COUNT(*) AS value FROM session WHERE id >= ${cursor}`)) + ?.value ?? 0) + : 0 + const denominator = sourceTotal + legacyTotal + updateProgress({ label: "Migrating sessions", numerator: migrated, denominator }) + yield* importNextDatabase(db, nextPath(options, global.data), (completed) => { + updateProgress({ label: "Migrating sessions", numerator: migrated + completed, denominator }) + }) + updateProgress({ label: "Migrating sessions", numerator: migrated + sourceTotal, denominator }) + const projects = new Set( + (yield* db.all<{ id: string }>(sql`SELECT id FROM project`)).map((project) => project.id), + ) + while (true) { + const state = yield* readState(db) + const cursorValue = state?.phase === "sessions" ? state.cursor : undefined + const nextID = yield* db.get<{ id: string; project_id: string }>( + cursorValue === undefined + ? sql`SELECT id, project_id FROM session ORDER BY id DESC LIMIT 1` + : sql`SELECT id, project_id FROM session WHERE id < ${cursorValue} ORDER BY id DESC LIMIT 1`, + ) + if (!nextID) break + yield* db + .transaction((tx) => + Effect.gen(function* () { + yield* tx + .insert(KVTable) + .values({ key: MIGRATION_STATE_KEY, value: { phase: "sessions", cursor: nextID.id } }) + .onConflictDoUpdate({ + target: KVTable.key, + set: { value: { phase: "sessions", cursor: nextID.id }, time_updated: Date.now() }, + }) + .run() + const projectID = projects.has(nextID.project_id) ? nextID.project_id : Project.ID.global + if (projectID !== nextID.project_id) + yield* Effect.logWarning("Reassigned V1 session with missing project", { + sessionID: nextID.id, + projectID: nextID.project_id, + }) + yield* tx.run(sql` + INSERT OR IGNORE INTO session_v2 ( + id, project_id, workspace_id, parent_id, slug, directory, path, title, version, share_url, + summary_additions, summary_deletions, summary_files, summary_diffs, metadata, cost, + tokens_input, tokens_output, tokens_reasoning, tokens_cache_read, tokens_cache_write, + revert, permission, agent, model, time_created, time_updated, time_compacting, time_archived + ) + SELECT + id, ${projectID}, workspace_id, parent_id, slug, directory, path, title, version, share_url, + summary_additions, summary_deletions, summary_files, summary_diffs, metadata, cost, + tokens_input, tokens_output, tokens_reasoning, tokens_cache_read, tokens_cache_write, + revert, permission, agent, model, time_created, time_updated, time_compacting, time_archived + FROM session + WHERE id = ${nextID.id} + `) + const next = yield* tx + .select() + .from(SessionTable) + .where(eq(SessionTable.id, SessionSchema.ID.make(nextID.id))) + .get() + if (!next) return yield* Effect.die(new Error(`Failed to copy V1 session ${nextID.id}`)) + const sourceMessages = yield* tx.all( + sql`SELECT id, session_id, time_created, time_updated, data FROM message WHERE session_id = ${next.id}`, + ) + const sourceParts = yield* tx.all( + sql`SELECT id, message_id, session_id, time_created, time_updated, data FROM part WHERE session_id = ${next.id}`, + ) + const transformed = transformSession({ session: next, messages: sourceMessages, parts: sourceParts }) + yield* Effect.forEach(transformed.warnings, (warning) => + Effect.logWarning("Skipped V1 migration row", warning), + ) + yield* tx.delete(SessionMessageTable).where(eq(SessionMessageTable.session_id, next.id)).run() + yield* Effect.forEach(transformed.messages, (message) => + tx + .insert(SessionMessageTable) + .values({ + id: SessionMessage.ID.make(message.id), + session_id: SessionSchema.ID.make(message.session_id), + type: message.type, + seq: message.seq, + time_created: message.time_created, + time_updated: message.time_updated, + data: sql`${JSON.stringify(message.data)}`, + }) + .run(), + ) + yield* tx + .update(SessionTable) + .set({ ...transformed.session, time_updated: next.time_updated }) + .where(eq(SessionTable.id, next.id)) + .run() + yield* tx + .insert(EventSequenceTable) + .values({ aggregate_id: next.id, seq: transformed.watermark }) + .onConflictDoUpdate({ + target: EventSequenceTable.aggregate_id, + set: { seq: transformed.watermark, owner_id: null }, + }) + .run() + }), + ) + .pipe(Effect.orDie) + if (runtimeState.status === "running") + runtimeState = { + status: "running", + progress: { + label: "Migrating sessions", + numerator: (runtimeState.progress.numerator ?? 0) + 1, + denominator, + }, + } + yield* Effect.yieldNow + } + yield* db + .transaction((tx) => + Effect.gen(function* () { + yield* tx + .insert(KVTable) + .values({ key: MIGRATION_STATE_KEY, value: { phase: "completed" } }) + .onConflictDoUpdate({ + target: KVTable.key, + set: { value: { phase: "completed" }, time_updated: Date.now() }, + }) + .run() + }), + ) + .pipe(Effect.orDie) + return { status: "completed" as const } + }) + return yield* migrate + }).pipe(Effect.orDie), + ) +} + +function nextPath(options: Options, data: string) { + if (options.nextDatabasePath) return options.nextDatabasePath + if (process.env.OPENCODE_DB === ":memory:") return undefined + return path.join(data, "opencode-next.db") +} + +function openNextDatabase(sourcePath: string) { + return Effect.acquireRelease( + Effect.gen(function* () { + const sqlite = yield* Effect.promise(() => import("bun:sqlite")) + return new sqlite.Database(sourcePath, { readonly: true, strict: true }) + }), + (source) => Effect.sync(() => source.close()), + ) +} + +function countNextSessions(sourcePath: string | undefined) { + if (!sourcePath || !existsSync(sourcePath)) return Effect.succeed(0) + return Effect.scoped( + Effect.gen(function* () { + const source = yield* openNextDatabase(sourcePath) + if (!isNextDatabase(source)) return 0 + return source.query<{ value: number }, []>("SELECT COUNT(*) AS value FROM session").get()?.value ?? 0 + }), + ).pipe(Effect.orElseSucceed(() => 0)) +} + +function importNextDatabase( + db: Database.Interface["db"], + sourcePath: string | undefined, + onProgress: (completed: number) => void, +): Effect.Effect { + if (!sourcePath || !existsSync(sourcePath)) return Effect.void + return Effect.scoped( + Effect.gen(function* () { + const source = yield* openNextDatabase(sourcePath) + if (!isNextDatabase(source)) { + yield* Effect.logWarning("Skipped incompatible opencode-next.db", { path: sourcePath }) + return + } + source.run("BEGIN") + yield* Effect.addFinalizer(() => + Effect.sync(() => { + if (source.inTransaction) source.run("ROLLBACK") + }), + ) + const projects = new Map( + source + .query("SELECT * FROM project") + .all() + .map((project) => [project.id, project]), + ) + const sessions = source.query("SELECT * FROM session ORDER BY id DESC").all() + for (const [index, session] of sessions.entries()) { + const project = projects.get(session.project_id) + const projectID = project ? session.project_id : Project.ID.global + if (!project) { + yield* Effect.logWarning("Reassigned previous V2 session with missing project", { + sessionID: session.id, + projectID: session.project_id, + }) + } + const messages = source + .query< + NextMessage, + [string] + >("SELECT id, session_id, type, seq, time_created, time_updated, data FROM session_message WHERE session_id = ? ORDER BY seq") + .all(session.id) + yield* db + .transaction((tx) => + Effect.gen(function* () { + if (project) + yield* tx.run(sql` + INSERT OR IGNORE INTO project ( + id, worktree, vcs, name, icon_url, icon_url_override, icon_color, + time_created, time_updated, time_initialized, sandboxes, commands + ) VALUES ( + ${project.id}, ${project.worktree}, ${project.vcs}, ${project.name}, ${project.icon_url}, + ${project.icon_url_override}, ${project.icon_color}, ${project.time_created}, ${project.time_updated}, + ${project.time_initialized}, ${project.sandboxes}, ${project.commands} + ) + `) + const existing = yield* tx + .select({ id: SessionTable.id }) + .from(SessionTable) + .where(eq(SessionTable.id, SessionSchema.ID.make(session.id))) + .get() + if (existing) return + yield* tx.run(sql` + INSERT INTO session_v2 ( + id, project_id, workspace_id, parent_id, fork_session_id, fork_boundary, slug, directory, + path, title, version, share_url, summary_additions, summary_deletions, summary_files, + summary_diffs, metadata, cost, tokens_input, tokens_output, tokens_reasoning, tokens_cache_read, + tokens_cache_write, revert, permission, agent, model, time_created, time_updated, time_compacting, + time_archived, time_suspended + ) VALUES ( + ${session.id}, ${projectID}, ${session.workspace_id}, ${session.parent_id}, + ${session.fork_session_id}, ${session.fork_boundary}, ${session.slug}, ${session.directory}, + ${session.path}, ${session.title}, ${session.version}, ${session.share_url}, + ${session.summary_additions}, ${session.summary_deletions}, ${session.summary_files}, + ${session.summary_diffs}, ${session.metadata}, ${session.cost}, ${session.tokens_input}, + ${session.tokens_output}, ${session.tokens_reasoning}, ${session.tokens_cache_read}, + ${session.tokens_cache_write}, ${session.revert}, ${session.permission}, ${session.agent}, + ${session.model}, ${session.time_created}, ${session.time_updated}, ${session.time_compacting}, + ${session.time_archived}, ${session.time_suspended} + ) + `) + yield* Effect.forEach(messages, (message) => + tx + .insert(SessionMessageTable) + .values({ + id: SessionMessage.ID.make(message.id), + session_id: SessionSchema.ID.make(message.session_id), + type: message.type as SessionMessage.Type, + seq: message.seq, + time_created: message.time_created, + time_updated: message.time_updated, + data: sql`${message.data}`, + }) + .run(), + ) + yield* tx + .insert(EventSequenceTable) + .values({ aggregate_id: session.id, seq: messages.at(-1)?.seq ?? -1 }) + .onConflictDoUpdate({ + target: EventSequenceTable.aggregate_id, + set: { seq: messages.at(-1)?.seq ?? -1, owner_id: null }, + }) + .run() + }), + ) + .pipe(Effect.orDie) + onProgress(index + 1) + yield* Effect.yieldNow + } + source.run("COMMIT") + }), + ) +} + +function isNextDatabase(source: SQLiteDatabase) { + const tables = new Set( + source + .query<{ name: string }, []>("SELECT name FROM sqlite_master WHERE type = 'table'") + .all() + .map((table) => table.name), + ) + return tables.has("project") && tables.has("session") && tables.has("session_message") +} + +function row( + source: SourceMessage, + message: { + readonly id: string + readonly type: SessionMessage.Type + readonly time: { readonly created: number } + readonly [key: string]: unknown + }, +): TransformResult["messages"][number] { + const { id, type, ...data } = message + return { + id, + session_id: source.session_id, + type, + seq: 0, + time_created: source.time_created, + time_updated: source.time_updated, + data, + } +} + +function migrateTool(part: typeof SessionV1.ToolPart.Type, fallback: number) { + const base = { + type: "tool" as const, + id: part.callID, + name: part.tool, + ...(part.metadata ? { providerState: part.metadata } : {}), + } + if (part.state.status === "completed") + return { + ...base, + state: { + status: "completed", + input: part.state.input, + content: + part.state.time.compacted === undefined + ? [ + { type: "text", text: part.state.output }, + ...(part.state.attachments ?? []).map((file) => ({ + type: "file" as const, + uri: file.url, + mime: file.mime, + ...(file.filename ? { name: file.filename } : {}), + })), + ] + : [{ type: "text", text: "[Old tool result content cleared]" }], + metadata: part.state.metadata, + }, + time: { created: part.state.time.start, completed: part.state.time.end }, + } + if (part.state.status === "error") + return { + ...base, + state: { + status: "error", + input: part.state.input, + error: { type: "tool.execution", message: part.state.error }, + ...(typeof part.state.metadata?.output === "string" + ? { content: [{ type: "text", text: part.state.metadata.output }] } + : {}), + ...(part.state.metadata ? { metadata: part.state.metadata } : {}), + }, + time: { created: part.state.time.start, completed: part.state.time.end }, + } + return { + ...base, + state: { + status: "error", + input: part.state.input, + error: { type: "tool.interrupted", message: "Tool execution was interrupted before V2 migration" }, + ...(part.state.status === "running" && part.state.metadata ? { metadata: part.state.metadata } : {}), + }, + time: { created: part.state.status === "running" ? part.state.time.start : fallback }, + } +} + +function migrateError(error: NonNullable<(typeof SessionV1.Assistant.Type)["error"]>) { + const message = + "message" in error.data + ? error.data.message + : error.name === "MessageOutputLengthError" + ? "The model exceeded its output limit" + : error.name + const type = + error.name === "ProviderAuthError" + ? "provider.auth" + : error.name === "ContentFilterError" + ? "provider.content-filter" + : error.name === "ContextOverflowError" + ? "provider.invalid-request" + : error.name === "StructuredOutputError" || error.name === "MessageOutputLengthError" + ? "provider.invalid-output" + : error.name === "MessageAbortedError" + ? "aborted" + : error.name === "APIError" + ? "provider.error" + : "unknown" + return { type, message } +} + +function normalizeFinish(finish: string | undefined) { + if (!finish) return undefined + return ( + (["stop", "length", "tool-calls", "content-filter", "error", "unknown"] as const).find( + (value) => value === finish, + ) ?? "unknown" + ) +} + +function migrateFile(part: SessionV1.FilePart) { + if (!part.url.startsWith("data:")) return [] + const comma = part.url.indexOf(",") + if (comma < 0) return [] + const header = part.url.slice(0, comma) + const payload = part.url.slice(comma + 1) + const data = header.endsWith(";base64") + ? Buffer.from(payload, "base64").toString("base64") + : Buffer.from(decodeURIComponent(payload)).toString("base64") + return [ + { + data, + mime: part.mime, + source: + part.source?.type === "resource" ? { type: "uri" as const, uri: part.source.uri } : { type: "inline" as const }, + ...(part.filename ? { name: part.filename } : {}), + ...(part.source + ? { mention: { text: part.source.text.value, start: part.source.text.start, end: part.source.text.end } } + : {}), + }, + ] +} + +function unavailableFile(part: SessionV1.FilePart) { + const label = part.filename ?? (part.source?.type === "resource" ? part.source.uri : part.url) + return `[Attachment unavailable after migration: ${label} (${part.mime})]` +} + +function syntheticID(source: string, used: Set) { + const prefix = source.slice(0, 16) + const alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + for (let salt = 0; ; salt++) { + const hex = new Bun.CryptoHasher("sha256").update(`v1-synthetic:${source}${salt ? `:${salt}` : ""}`).digest("hex") + let value = BigInt(`0x${hex}`) + let suffix = "" + while (suffix.length < 14) { + suffix = alphabet[Number(value % 62n)] + suffix + value /= 62n + } + const id = prefix + suffix + if (used.has(id)) continue + used.add(id) + return id + } +} + +function serializeRecent( + messages: ReadonlyArray<{ row: SourceMessage; value: typeof SessionV1.Info.Type }>, + parts: Map>, +) { + return messages + .flatMap((message) => { + const owned = parts.get(message.row.id)?.map((part) => part.value) ?? [] + if (message.value.role === "user") + return [ + `[User]: ${owned + .filter((part) => part.type === "text" && !part.ignored) + .map((part) => (part.type === "text" ? part.text : "")) + .join("\n\n")}`, + ] + return owned.flatMap((part) => + part.type === "text" + ? [`[Assistant]: ${part.text}`] + : part.type === "reasoning" && part.text + ? [`[Assistant reasoning]: ${part.text}`] + : [], + ) + }) + .join("\n\n") +} + +function readState(db: Database.Interface["db"]): Effect.Effect { + return db + .select({ value: KVTable.value }) + .from(KVTable) + .where(eq(KVTable.key, MIGRATION_STATE_KEY)) + .get() + .pipe( + Effect.map((row) => parseState(row?.value)), + Effect.orDie, + ) +} + +function parseState(input: unknown): MigrationState | undefined { + if (!input || typeof input !== "object" || !("phase" in input)) return + if (input.phase === "completed") return { phase: "completed" } + if (input.phase !== "sessions") return + if (!("cursor" in input) || input.cursor === undefined) return { phase: "sessions" } + if (typeof input.cursor === "string") return { phase: "sessions", cursor: input.cursor } +} + +function hasLegacySessions(db: Database.Interface["db"]) { + return db.get(sql`SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'session'`).pipe( + Effect.map((row) => row !== undefined), + Effect.orDie, + ) +} diff --git a/packages/core/src/database/v1-migration.noop.ts b/packages/core/src/database/v1-migration.noop.ts new file mode 100644 index 00000000000..268eaf44e7c --- /dev/null +++ b/packages/core/src/database/v1-migration.noop.ts @@ -0,0 +1,11 @@ +import { Effect, Layer } from "effect" + +export type Status = { readonly status: "completed" } + +export const layer = Layer.empty +export function status() { + return Effect.succeed({ status: "completed" } as const) +} +export function run() { + return Effect.succeed({ status: "completed" } as const) +} diff --git a/packages/core/src/database/v1-migration.ts b/packages/core/src/database/v1-migration.ts index 5c3150c77c1..55cb22797ea 100644 --- a/packages/core/src/database/v1-migration.ts +++ b/packages/core/src/database/v1-migration.ts @@ -1,997 +1,2 @@ -export * as V1Migration from "./v1-migration.js" - -import { Cause, Effect, Layer, Option, Schema, Semaphore } from "effect" -import { Database } from "./database.js" -import { SessionMessageTable, SessionTable } from "../session/sql.js" -import { SessionV1 } from "@opencode-ai/schema/session-v1" -import { SessionMessage } from "../session/message.js" -import { SessionSchema } from "../session/schema.js" -import { KVTable } from "../kv/sql.js" -import { EventSequenceTable } from "../event/sql.js" -import { eq, sql } from "drizzle-orm" -import { Global } from "@opencode-ai/util/global" -import { existsSync } from "node:fs" -import path from "node:path" -import type { Database as SQLiteDatabase } from "bun:sqlite" -import { Project } from "@opencode-ai/schema/project" - -export type SourceMessage = { - readonly id: string - readonly session_id: string - readonly time_created: number - readonly time_updated: number - readonly data: string -} - -export type SourcePart = { - readonly id: string - readonly message_id: string - readonly session_id: string - readonly time_created: number - readonly time_updated: number - readonly data: string -} - -export type TransformInput = { - readonly session: typeof SessionTable.$inferSelect - readonly messages: ReadonlyArray - readonly parts: ReadonlyArray -} - -export type Warning = { - readonly reason: string - readonly sessionID: string - readonly messageID?: string - readonly partID?: string - readonly observedType?: string -} - -export type TransformResult = { - readonly messages: ReadonlyArray<{ - readonly id: string - readonly session_id: string - readonly type: SessionMessage.Type - readonly seq: number - readonly time_created: number - readonly time_updated: number - readonly data: Record - }> - readonly session: Pick< - typeof SessionTable.$inferInsert, - | "agent" - | "model" - | "cost" - | "tokens_input" - | "tokens_output" - | "tokens_reasoning" - | "tokens_cache_read" - | "tokens_cache_write" - | "revert" - | "time_compacting" - > - readonly watermark: number - readonly warnings: ReadonlyArray -} - -type Progress = { - readonly label: string - readonly numerator?: number - readonly denominator?: number -} - -export type Status = - | { readonly status: "required" | "completed" } - | { readonly status: "running"; readonly progress: Progress } - | { readonly status: "error"; readonly error: string } - -type RunResult = { - readonly status: "completed" -} - -type Options = { - readonly nextDatabasePath?: string -} - -type MigrationState = { readonly phase: "sessions"; readonly cursor?: string } | { readonly phase: "completed" } - -type RuntimeState = - | { readonly status: "idle" } - | { readonly status: "running"; readonly progress: Progress } - | { readonly status: "error"; readonly error: string } - -type NextProject = { - readonly id: string - readonly worktree: string - readonly vcs: string | null - readonly name: string | null - readonly icon_url: string | null - readonly icon_url_override: string | null - readonly icon_color: string | null - readonly time_created: number - readonly time_updated: number - readonly time_initialized: number | null - readonly sandboxes: string - readonly commands: string | null -} - -type NextSession = { - readonly id: string - readonly project_id: string - readonly workspace_id: string | null - readonly parent_id: string | null - readonly fork_session_id: string | null - readonly fork_boundary: string | null - readonly slug: string - readonly directory: string - readonly path: string | null - readonly title: string | null - readonly version: string - readonly share_url: string | null - readonly summary_additions: number | null - readonly summary_deletions: number | null - readonly summary_files: number | null - readonly summary_diffs: string | null - readonly metadata: string | null - readonly cost: number - readonly tokens_input: number - readonly tokens_output: number - readonly tokens_reasoning: number - readonly tokens_cache_read: number - readonly tokens_cache_write: number - readonly revert: string | null - readonly permission: string | null - readonly agent: string | null - readonly model: string | null - readonly time_created: number - readonly time_updated: number - readonly time_compacting: number | null - readonly time_archived: number | null - readonly time_suspended: number | null -} - -type NextMessage = { - readonly id: string - readonly session_id: string - readonly type: string - readonly seq: number - readonly time_created: number - readonly time_updated: number - readonly data: string -} - -const lock = Semaphore.makeUnsafe(1) -const MIGRATION_STATE_KEY = "migration.v1-v2" -const EVENT_DELETE_BATCH_SIZE = 1_000 -const decodeJson = Schema.decodeUnknownOption(Schema.UnknownFromJsonString) -const decodeMessage = Schema.decodeUnknownOption(SessionV1.Info) -const decodePart = Schema.decodeUnknownOption(SessionV1.Part) -let runtimeState: RuntimeState = { status: "idle" } - -export function transformSession(input: TransformInput): TransformResult { - const warnings: Warning[] = [] - const messages = input.messages - .map((row) => { - const value = Option.getOrUndefined(decodeJson(row.data)) - const decoded = - value && typeof value === "object" - ? Option.getOrUndefined(decodeMessage({ ...value, id: row.id, sessionID: row.session_id })) - : undefined - if (decoded) return { row, value: decoded } - warnings.push({ reason: "invalid-message", sessionID: input.session.id, messageID: row.id }) - return undefined - }) - .filter((item): item is NonNullable => item !== undefined) - .sort((a, b) => a.row.time_created - b.row.time_created || a.row.id.localeCompare(b.row.id)) - const messageIDs = new Set(input.messages.map((row) => row.id)) - const parts = input.parts - .map((row) => { - const value = Option.getOrUndefined(decodeJson(row.data)) - const observedType = value && typeof value === "object" && "type" in value ? String(value.type) : undefined - if (!messageIDs.has(row.message_id)) { - warnings.push({ - reason: "orphan-part", - sessionID: input.session.id, - messageID: row.message_id, - partID: row.id, - observedType, - }) - return undefined - } - const decoded = - value && typeof value === "object" - ? Option.getOrUndefined( - decodePart({ ...value, id: row.id, messageID: row.message_id, sessionID: row.session_id }), - ) - : undefined - if (decoded) return { row, value: decoded } - warnings.push({ - reason: "invalid-part", - sessionID: input.session.id, - messageID: row.message_id, - partID: row.id, - observedType, - }) - return undefined - }) - .filter((item): item is NonNullable => item !== undefined) - .sort((a, b) => a.row.id.localeCompare(b.row.id)) - const byMessage = Map.groupBy(parts, (item) => item.row.message_id) - const paired = new Set() - const used = new Set(messages.map((item) => item.row.id)) - const projected = messages - .flatMap((item) => { - if (paired.has(item.row.id)) return [] - const owned = byMessage.get(item.row.id)?.map((part) => part.value) ?? [] - if (item.value.role === "user") { - const compaction = owned.find((part) => part.type === "compaction") - if (compaction?.type === "compaction") { - const pairedSummary = messages.find( - (candidate) => - candidate.value.role === "assistant" && - candidate.value.parentID === item.row.id && - candidate.value.summary, - ) - if (!pairedSummary || pairedSummary.value.role !== "assistant") return [] - paired.add(pairedSummary.row.id) - if (pairedSummary.value.error || pairedSummary.value.time.completed === undefined) return [] - const summary = pairedSummary - const summaryText = (byMessage.get(summary.row.id) ?? []) - .map((part) => part.value) - .filter((part) => part.type === "text" && part.text.length > 0) - .map((part) => (part.type === "text" ? part.text : "")) - .join("\n\n") - const tailIndex = compaction.tail_start_id - ? messages.findIndex((candidate) => candidate.row.id === compaction.tail_start_id) - : -1 - const compactionIndex = messages.findIndex((candidate) => candidate.row.id === item.row.id) - const tail = tailIndex < 0 ? [] : messages.slice(tailIndex, compactionIndex) - return [ - row( - { ...item.row, time_updated: Math.max(item.row.time_updated, summary.row.time_updated) }, - { - id: item.row.id, - type: "compaction", - status: "completed", - reason: compaction.auto ? "auto" : "manual", - summary: summaryText, - recent: serializeRecent(tail, byMessage), - time: { created: item.row.time_created }, - }, - ), - ] - } - const subtasks = owned.filter((part) => part.type === "subtask") - const visible = owned.filter((part) => part.type === "text" && !part.ignored) - const files = owned.filter((part) => part.type === "file") - const agents = owned.filter((part) => part.type === "agent") - if (subtasks.length > 0 && visible.length === 0 && files.length === 0 && agents.length === 0) return [] - const ordinary = visible.filter((part) => part.type === "text" && !part.synthetic) - const synthetic = visible.filter((part) => part.type === "text" && part.synthetic) - const attachments = files.flatMap((part) => (part.type === "file" ? migrateFile(part) : [])) - const unavailable = files.flatMap((part) => - part.type === "file" && !part.url.startsWith("data:") ? [unavailableFile(part)] : [], - ) - const text = owned - .flatMap((part) => { - if (part.type === "text" && !part.ignored && !part.synthetic) return [part.text] - if (part.type === "file" && !part.url.startsWith("data:")) return [unavailableFile(part)] - return [] - }) - .join("\n\n") - const agentAttachments = agents.map((part) => - part.type === "agent" - ? { - name: part.name, - ...(part.source - ? { mention: { text: part.source.value, start: part.source.start, end: part.source.end } } - : {}), - } - : { name: "" }, - ) - if ( - ordinary.length === 0 && - unavailable.length === 0 && - synthetic.length > 0 && - attachments.length === 0 && - agentAttachments.length === 0 - ) - return [ - row(item.row, { - id: item.row.id, - type: "synthetic", - text: synthetic.map((part) => (part.type === "text" ? part.text : "")).join("\n\n"), - time: { created: item.row.time_created }, - }), - ] - const user = row(item.row, { - id: item.row.id, - type: "user", - text, - ...(attachments.length ? { files: attachments } : {}), - ...(agentAttachments.length ? { agents: agentAttachments } : {}), - time: { created: item.row.time_created }, - }) - if (synthetic.length === 0) return [user] - return [ - user, - row(item.row, { - id: syntheticID(item.row.id, used), - type: "synthetic", - text: synthetic.map((part) => (part.type === "text" ? part.text : "")).join("\n\n"), - time: { created: item.row.time_created }, - }), - ] - } - if (item.value.role !== "assistant") return [] - const assistant = item.value - const parent = messages.find((candidate) => candidate.row.id === assistant.parentID) - const parentParts = parent ? (byMessage.get(parent.row.id)?.map((part) => part.value) ?? []) : [] - if ( - parentParts.some((part) => part.type === "subtask") && - owned.some((part) => part.type === "tool" && part.tool === "task") - ) - return [] - const content = owned.flatMap((part): Array> => { - if (part.type === "text") - return [{ type: "text", text: part.text, ...(part.metadata ? { state: part.metadata } : {}) }] - if (part.type === "reasoning") - return [ - { - type: "reasoning", - text: part.text, - ...(part.metadata ? { state: part.metadata } : {}), - time: { created: part.time.start, ...(part.time.end === undefined ? {} : { completed: part.time.end }) }, - }, - ] - if (part.type !== "tool") return [] - return [migrateTool(part, item.row.time_created)] - }) - const start = - owned.flatMap((part) => (part.type === "step-start" && part.snapshot ? [part.snapshot] : []))[0] ?? - owned.flatMap((part) => (part.type === "snapshot" ? [part.snapshot] : []))[0] ?? - owned.flatMap((part) => (part.type === "patch" ? [part.hash] : []))[0] - const end = owned.flatMap((part) => (part.type === "step-finish" && part.snapshot ? [part.snapshot] : [])).at(-1) - const snapshotFiles = Array.from(new Set(owned.flatMap((part) => (part.type === "patch" ? part.files : [])))) - const finish = normalizeFinish(assistant.finish) - return [ - row(item.row, { - id: item.row.id, - type: "assistant", - agent: assistant.agent, - model: { - providerID: assistant.providerID, - id: assistant.modelID, - variant: assistant.variant ?? "default", - }, - content, - ...(start || end || snapshotFiles.length - ? { - snapshot: { - ...(start ? { start } : {}), - ...(end ? { end } : {}), - ...(snapshotFiles.length ? { files: snapshotFiles } : {}), - }, - } - : {}), - ...(finish ? { finish } : {}), - cost: assistant.cost, - tokens: { - input: assistant.tokens.input, - output: assistant.tokens.output, - reasoning: assistant.tokens.reasoning, - cache: assistant.tokens.cache, - }, - ...(assistant.error ? { error: migrateError(assistant.error) } : {}), - time: { - created: item.row.time_created, - ...(assistant.time.completed === undefined ? {} : { completed: item.row.time_updated }), - }, - }), - ] - }) - .map((item, seq) => ({ ...item, seq })) - const assistants = messages - .filter((item) => item.value.role === "assistant") - .map((item) => item.value) - .filter((item): item is SessionV1.Assistant => item.role === "assistant") - const latestUser = messages.findLast((item) => { - if (item.value.role !== "user") return false - const owned = byMessage.get(item.row.id) ?? [] - if (owned.some((part) => part.value.type === "compaction")) return false - return !owned.some((part) => part.value.type === "subtask") || !owned.every((part) => part.value.type === "subtask") - }) - return { - messages: projected, - session: { - agent: input.session.agent ?? (latestUser?.value.role === "user" ? latestUser.value.agent : null), - model: - input.session.model ?? - (latestUser?.value.role === "user" - ? { - id: latestUser.value.model.modelID, - providerID: latestUser.value.model.providerID, - variant: latestUser.value.model.variant ?? "default", - } - : null), - cost: assistants.reduce((total, item) => total + item.cost, 0), - tokens_input: assistants.reduce((total, item) => total + item.tokens.input, 0), - tokens_output: assistants.reduce((total, item) => total + item.tokens.output, 0), - tokens_reasoning: assistants.reduce((total, item) => total + item.tokens.reasoning, 0), - tokens_cache_read: assistants.reduce((total, item) => total + item.tokens.cache.read, 0), - tokens_cache_write: assistants.reduce((total, item) => total + item.tokens.cache.write, 0), - revert: null, - time_compacting: null, - }, - watermark: projected.length - 1, - warnings, - } -} - -export function status(): Effect.Effect { - return Effect.gen(function* () { - const { db } = yield* Database.Service - if (!(yield* hasLegacySessions(db))) return { status: "completed" as const } - const state = yield* readState(db) - if (runtimeState.status === "running") return runtimeState - if (runtimeState.status === "error") return runtimeState - if (state?.phase === "completed") return { status: "completed" as const } - return { status: "required" as const } - }).pipe(Effect.orDie) -} - -export const layer = Layer.effectDiscard( - Effect.gen(function* () { - runtimeState = { status: "running", progress: { label: "Clearing old events" } } - yield* run().pipe( - Effect.matchCauseEffect({ - onFailure: (cause) => - Effect.sync(() => { - runtimeState = { status: "error", error: errorText(Cause.squash(cause)) } - }).pipe(Effect.andThen(Effect.logError("V1 migration failed", { cause }))), - onSuccess: () => - Effect.sync(() => { - runtimeState = { status: "idle" } - }), - }), - Effect.forkScoped({ startImmediately: true }), - ) - }), -) - -function errorText(input: unknown): string { - if (!(input instanceof Error)) return String(input) - const cause = input.cause - return cause === undefined ? input.message : `${input.message}\nCaused by: ${errorText(cause)}` -} - -function updateProgress(progress: Progress) { - if (runtimeState.status === "running") runtimeState = { status: "running", progress } -} - -export function run(options: Options = {}): Effect.Effect { - return lock.withPermit( - Effect.gen(function* () { - const { db } = yield* Database.Service - const global = yield* Global.Service - const state = yield* readState(db) - if (state?.phase === "completed") return { status: "completed" as const } - if (!(yield* hasLegacySessions(db))) return { status: "completed" as const } - const migrate = Effect.gen(function* () { - const now = Date.now() - yield* db.run(sql` - INSERT OR IGNORE INTO project (id, worktree, time_created, time_updated, sandboxes) - VALUES (${Project.ID.global}, ${path.parse(global.data).root}, ${now}, ${now}, '[]') - `) - if (state === undefined) - yield* db - .transaction((tx) => - Effect.gen(function* () { - while (true) { - yield* tx.run(sql` - DELETE FROM event - WHERE rowid IN (SELECT rowid FROM event LIMIT ${EVENT_DELETE_BATCH_SIZE}) - `) - const deleted = (yield* tx.get<{ value: number }>(sql`SELECT changes() AS value`))?.value ?? 0 - if (deleted < EVENT_DELETE_BATCH_SIZE) break - yield* Effect.yieldNow - } - yield* tx - .insert(KVTable) - .values({ key: MIGRATION_STATE_KEY, value: { phase: "sessions" } }) - .run() - }), - ) - .pipe(Effect.orDie) - const sourceTotal = yield* countNextSessions(nextPath(options, global.data)) - const legacyTotal = (yield* db.get<{ value: number }>(sql`SELECT COUNT(*) AS value FROM session`))?.value ?? 0 - const cursor = state?.phase === "sessions" ? state.cursor : undefined - const migrated = - cursor !== undefined - ? ((yield* db.get<{ value: number }>(sql`SELECT COUNT(*) AS value FROM session WHERE id >= ${cursor}`)) - ?.value ?? 0) - : 0 - const denominator = sourceTotal + legacyTotal - updateProgress({ label: "Migrating sessions", numerator: migrated, denominator }) - yield* importNextDatabase(db, nextPath(options, global.data), (completed) => { - updateProgress({ label: "Migrating sessions", numerator: migrated + completed, denominator }) - }) - updateProgress({ label: "Migrating sessions", numerator: migrated + sourceTotal, denominator }) - const projects = new Set( - (yield* db.all<{ id: string }>(sql`SELECT id FROM project`)).map((project) => project.id), - ) - while (true) { - const state = yield* readState(db) - const cursorValue = state?.phase === "sessions" ? state.cursor : undefined - const nextID = yield* db.get<{ id: string; project_id: string }>( - cursorValue === undefined - ? sql`SELECT id, project_id FROM session ORDER BY id DESC LIMIT 1` - : sql`SELECT id, project_id FROM session WHERE id < ${cursorValue} ORDER BY id DESC LIMIT 1`, - ) - if (!nextID) break - yield* db - .transaction((tx) => - Effect.gen(function* () { - yield* tx - .insert(KVTable) - .values({ key: MIGRATION_STATE_KEY, value: { phase: "sessions", cursor: nextID.id } }) - .onConflictDoUpdate({ - target: KVTable.key, - set: { value: { phase: "sessions", cursor: nextID.id }, time_updated: Date.now() }, - }) - .run() - const projectID = projects.has(nextID.project_id) ? nextID.project_id : Project.ID.global - if (projectID !== nextID.project_id) - yield* Effect.logWarning("Reassigned V1 session with missing project", { - sessionID: nextID.id, - projectID: nextID.project_id, - }) - yield* tx.run(sql` - INSERT OR IGNORE INTO session_v2 ( - id, project_id, workspace_id, parent_id, slug, directory, path, title, version, share_url, - summary_additions, summary_deletions, summary_files, summary_diffs, metadata, cost, - tokens_input, tokens_output, tokens_reasoning, tokens_cache_read, tokens_cache_write, - revert, permission, agent, model, time_created, time_updated, time_compacting, time_archived - ) - SELECT - id, ${projectID}, workspace_id, parent_id, slug, directory, path, title, version, share_url, - summary_additions, summary_deletions, summary_files, summary_diffs, metadata, cost, - tokens_input, tokens_output, tokens_reasoning, tokens_cache_read, tokens_cache_write, - revert, permission, agent, model, time_created, time_updated, time_compacting, time_archived - FROM session - WHERE id = ${nextID.id} - `) - const next = yield* tx - .select() - .from(SessionTable) - .where(eq(SessionTable.id, SessionSchema.ID.make(nextID.id))) - .get() - if (!next) return yield* Effect.die(new Error(`Failed to copy V1 session ${nextID.id}`)) - const sourceMessages = yield* tx.all( - sql`SELECT id, session_id, time_created, time_updated, data FROM message WHERE session_id = ${next.id}`, - ) - const sourceParts = yield* tx.all( - sql`SELECT id, message_id, session_id, time_created, time_updated, data FROM part WHERE session_id = ${next.id}`, - ) - const transformed = transformSession({ session: next, messages: sourceMessages, parts: sourceParts }) - yield* Effect.forEach(transformed.warnings, (warning) => - Effect.logWarning("Skipped V1 migration row", warning), - ) - yield* tx.delete(SessionMessageTable).where(eq(SessionMessageTable.session_id, next.id)).run() - yield* Effect.forEach(transformed.messages, (message) => - tx - .insert(SessionMessageTable) - .values({ - id: SessionMessage.ID.make(message.id), - session_id: SessionSchema.ID.make(message.session_id), - type: message.type, - seq: message.seq, - time_created: message.time_created, - time_updated: message.time_updated, - data: sql`${JSON.stringify(message.data)}`, - }) - .run(), - ) - yield* tx - .update(SessionTable) - .set({ ...transformed.session, time_updated: next.time_updated }) - .where(eq(SessionTable.id, next.id)) - .run() - yield* tx - .insert(EventSequenceTable) - .values({ aggregate_id: next.id, seq: transformed.watermark }) - .onConflictDoUpdate({ - target: EventSequenceTable.aggregate_id, - set: { seq: transformed.watermark, owner_id: null }, - }) - .run() - }), - ) - .pipe(Effect.orDie) - if (runtimeState.status === "running") - runtimeState = { - status: "running", - progress: { - label: "Migrating sessions", - numerator: (runtimeState.progress.numerator ?? 0) + 1, - denominator, - }, - } - yield* Effect.yieldNow - } - yield* db - .transaction((tx) => - Effect.gen(function* () { - yield* tx - .insert(KVTable) - .values({ key: MIGRATION_STATE_KEY, value: { phase: "completed" } }) - .onConflictDoUpdate({ - target: KVTable.key, - set: { value: { phase: "completed" }, time_updated: Date.now() }, - }) - .run() - }), - ) - .pipe(Effect.orDie) - return { status: "completed" as const } - }) - return yield* migrate - }).pipe(Effect.orDie), - ) -} - -function nextPath(options: Options, data: string) { - if (options.nextDatabasePath) return options.nextDatabasePath - if (process.env.OPENCODE_DB === ":memory:") return undefined - return path.join(data, "opencode-next.db") -} - -function openNextDatabase(sourcePath: string) { - return Effect.acquireRelease( - Effect.gen(function* () { - const sqlite = yield* Effect.promise(() => import("bun:sqlite")) - return new sqlite.Database(sourcePath, { readonly: true, strict: true }) - }), - (source) => Effect.sync(() => source.close()), - ) -} - -function countNextSessions(sourcePath: string | undefined) { - if (!sourcePath || !existsSync(sourcePath)) return Effect.succeed(0) - return Effect.scoped( - Effect.gen(function* () { - const source = yield* openNextDatabase(sourcePath) - if (!isNextDatabase(source)) return 0 - return source.query<{ value: number }, []>("SELECT COUNT(*) AS value FROM session").get()?.value ?? 0 - }), - ).pipe(Effect.orElseSucceed(() => 0)) -} - -function importNextDatabase( - db: Database.Interface["db"], - sourcePath: string | undefined, - onProgress: (completed: number) => void, -): Effect.Effect { - if (!sourcePath || !existsSync(sourcePath)) return Effect.void - return Effect.scoped( - Effect.gen(function* () { - const source = yield* openNextDatabase(sourcePath) - if (!isNextDatabase(source)) { - yield* Effect.logWarning("Skipped incompatible opencode-next.db", { path: sourcePath }) - return - } - source.run("BEGIN") - yield* Effect.addFinalizer(() => - Effect.sync(() => { - if (source.inTransaction) source.run("ROLLBACK") - }), - ) - const projects = new Map( - source - .query("SELECT * FROM project") - .all() - .map((project) => [project.id, project]), - ) - const sessions = source.query("SELECT * FROM session ORDER BY id DESC").all() - for (const [index, session] of sessions.entries()) { - const project = projects.get(session.project_id) - const projectID = project ? session.project_id : Project.ID.global - if (!project) { - yield* Effect.logWarning("Reassigned previous V2 session with missing project", { - sessionID: session.id, - projectID: session.project_id, - }) - } - const messages = source - .query< - NextMessage, - [string] - >("SELECT id, session_id, type, seq, time_created, time_updated, data FROM session_message WHERE session_id = ? ORDER BY seq") - .all(session.id) - yield* db - .transaction((tx) => - Effect.gen(function* () { - if (project) - yield* tx.run(sql` - INSERT OR IGNORE INTO project ( - id, worktree, vcs, name, icon_url, icon_url_override, icon_color, - time_created, time_updated, time_initialized, sandboxes, commands - ) VALUES ( - ${project.id}, ${project.worktree}, ${project.vcs}, ${project.name}, ${project.icon_url}, - ${project.icon_url_override}, ${project.icon_color}, ${project.time_created}, ${project.time_updated}, - ${project.time_initialized}, ${project.sandboxes}, ${project.commands} - ) - `) - const existing = yield* tx - .select({ id: SessionTable.id }) - .from(SessionTable) - .where(eq(SessionTable.id, SessionSchema.ID.make(session.id))) - .get() - if (existing) return - yield* tx.run(sql` - INSERT INTO session_v2 ( - id, project_id, workspace_id, parent_id, fork_session_id, fork_boundary, slug, directory, - path, title, version, share_url, summary_additions, summary_deletions, summary_files, - summary_diffs, metadata, cost, tokens_input, tokens_output, tokens_reasoning, tokens_cache_read, - tokens_cache_write, revert, permission, agent, model, time_created, time_updated, time_compacting, - time_archived, time_suspended - ) VALUES ( - ${session.id}, ${projectID}, ${session.workspace_id}, ${session.parent_id}, - ${session.fork_session_id}, ${session.fork_boundary}, ${session.slug}, ${session.directory}, - ${session.path}, ${session.title}, ${session.version}, ${session.share_url}, - ${session.summary_additions}, ${session.summary_deletions}, ${session.summary_files}, - ${session.summary_diffs}, ${session.metadata}, ${session.cost}, ${session.tokens_input}, - ${session.tokens_output}, ${session.tokens_reasoning}, ${session.tokens_cache_read}, - ${session.tokens_cache_write}, ${session.revert}, ${session.permission}, ${session.agent}, - ${session.model}, ${session.time_created}, ${session.time_updated}, ${session.time_compacting}, - ${session.time_archived}, ${session.time_suspended} - ) - `) - yield* Effect.forEach(messages, (message) => - tx - .insert(SessionMessageTable) - .values({ - id: SessionMessage.ID.make(message.id), - session_id: SessionSchema.ID.make(message.session_id), - type: message.type as SessionMessage.Type, - seq: message.seq, - time_created: message.time_created, - time_updated: message.time_updated, - data: sql`${message.data}`, - }) - .run(), - ) - yield* tx - .insert(EventSequenceTable) - .values({ aggregate_id: session.id, seq: messages.at(-1)?.seq ?? -1 }) - .onConflictDoUpdate({ - target: EventSequenceTable.aggregate_id, - set: { seq: messages.at(-1)?.seq ?? -1, owner_id: null }, - }) - .run() - }), - ) - .pipe(Effect.orDie) - onProgress(index + 1) - yield* Effect.yieldNow - } - source.run("COMMIT") - }), - ) -} - -function isNextDatabase(source: SQLiteDatabase) { - const tables = new Set( - source - .query<{ name: string }, []>("SELECT name FROM sqlite_master WHERE type = 'table'") - .all() - .map((table) => table.name), - ) - return tables.has("project") && tables.has("session") && tables.has("session_message") -} - -function row( - source: SourceMessage, - message: { - readonly id: string - readonly type: SessionMessage.Type - readonly time: { readonly created: number } - readonly [key: string]: unknown - }, -): TransformResult["messages"][number] { - const { id, type, ...data } = message - return { - id, - session_id: source.session_id, - type, - seq: 0, - time_created: source.time_created, - time_updated: source.time_updated, - data, - } -} - -function migrateTool(part: typeof SessionV1.ToolPart.Type, fallback: number) { - const base = { - type: "tool" as const, - id: part.callID, - name: part.tool, - ...(part.metadata ? { providerState: part.metadata } : {}), - } - if (part.state.status === "completed") - return { - ...base, - state: { - status: "completed", - input: part.state.input, - content: - part.state.time.compacted === undefined - ? [ - { type: "text", text: part.state.output }, - ...(part.state.attachments ?? []).map((file) => ({ - type: "file" as const, - uri: file.url, - mime: file.mime, - ...(file.filename ? { name: file.filename } : {}), - })), - ] - : [{ type: "text", text: "[Old tool result content cleared]" }], - metadata: part.state.metadata, - }, - time: { created: part.state.time.start, completed: part.state.time.end }, - } - if (part.state.status === "error") - return { - ...base, - state: { - status: "error", - input: part.state.input, - error: { type: "tool.execution", message: part.state.error }, - ...(typeof part.state.metadata?.output === "string" - ? { content: [{ type: "text", text: part.state.metadata.output }] } - : {}), - ...(part.state.metadata ? { metadata: part.state.metadata } : {}), - }, - time: { created: part.state.time.start, completed: part.state.time.end }, - } - return { - ...base, - state: { - status: "error", - input: part.state.input, - error: { type: "tool.interrupted", message: "Tool execution was interrupted before V2 migration" }, - ...(part.state.status === "running" && part.state.metadata ? { metadata: part.state.metadata } : {}), - }, - time: { created: part.state.status === "running" ? part.state.time.start : fallback }, - } -} - -function migrateError(error: NonNullable<(typeof SessionV1.Assistant.Type)["error"]>) { - const message = - "message" in error.data - ? error.data.message - : error.name === "MessageOutputLengthError" - ? "The model exceeded its output limit" - : error.name - const type = - error.name === "ProviderAuthError" - ? "provider.auth" - : error.name === "ContentFilterError" - ? "provider.content-filter" - : error.name === "ContextOverflowError" - ? "provider.invalid-request" - : error.name === "StructuredOutputError" || error.name === "MessageOutputLengthError" - ? "provider.invalid-output" - : error.name === "MessageAbortedError" - ? "aborted" - : error.name === "APIError" - ? "provider.error" - : "unknown" - return { type, message } -} - -function normalizeFinish(finish: string | undefined) { - if (!finish) return undefined - return ( - (["stop", "length", "tool-calls", "content-filter", "error", "unknown"] as const).find( - (value) => value === finish, - ) ?? "unknown" - ) -} - -function migrateFile(part: SessionV1.FilePart) { - if (!part.url.startsWith("data:")) return [] - const comma = part.url.indexOf(",") - if (comma < 0) return [] - const header = part.url.slice(0, comma) - const payload = part.url.slice(comma + 1) - const data = header.endsWith(";base64") - ? Buffer.from(payload, "base64").toString("base64") - : Buffer.from(decodeURIComponent(payload)).toString("base64") - return [ - { - data, - mime: part.mime, - source: - part.source?.type === "resource" ? { type: "uri" as const, uri: part.source.uri } : { type: "inline" as const }, - ...(part.filename ? { name: part.filename } : {}), - ...(part.source - ? { mention: { text: part.source.text.value, start: part.source.text.start, end: part.source.text.end } } - : {}), - }, - ] -} - -function unavailableFile(part: SessionV1.FilePart) { - const label = part.filename ?? (part.source?.type === "resource" ? part.source.uri : part.url) - return `[Attachment unavailable after migration: ${label} (${part.mime})]` -} - -function syntheticID(source: string, used: Set) { - const prefix = source.slice(0, 16) - const alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - for (let salt = 0; ; salt++) { - const hex = new Bun.CryptoHasher("sha256").update(`v1-synthetic:${source}${salt ? `:${salt}` : ""}`).digest("hex") - let value = BigInt(`0x${hex}`) - let suffix = "" - while (suffix.length < 14) { - suffix = alphabet[Number(value % 62n)] + suffix - value /= 62n - } - const id = prefix + suffix - if (used.has(id)) continue - used.add(id) - return id - } -} - -function serializeRecent( - messages: ReadonlyArray<{ row: SourceMessage; value: typeof SessionV1.Info.Type }>, - parts: Map>, -) { - return messages - .flatMap((message) => { - const owned = parts.get(message.row.id)?.map((part) => part.value) ?? [] - if (message.value.role === "user") - return [ - `[User]: ${owned - .filter((part) => part.type === "text" && !part.ignored) - .map((part) => (part.type === "text" ? part.text : "")) - .join("\n\n")}`, - ] - return owned.flatMap((part) => - part.type === "text" - ? [`[Assistant]: ${part.text}`] - : part.type === "reasoning" && part.text - ? [`[Assistant reasoning]: ${part.text}`] - : [], - ) - }) - .join("\n\n") -} - -function readState(db: Database.Interface["db"]): Effect.Effect { - return db - .select({ value: KVTable.value }) - .from(KVTable) - .where(eq(KVTable.key, MIGRATION_STATE_KEY)) - .get() - .pipe( - Effect.map((row) => parseState(row?.value)), - Effect.orDie, - ) -} - -function parseState(input: unknown): MigrationState | undefined { - if (!input || typeof input !== "object" || !("phase" in input)) return - if (input.phase === "completed") return { phase: "completed" } - if (input.phase !== "sessions") return - if (!("cursor" in input) || input.cursor === undefined) return { phase: "sessions" } - if (typeof input.cursor === "string") return { phase: "sessions", cursor: input.cursor } -} - -function hasLegacySessions(db: Database.Interface["db"]) { - return db.get(sql`SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'session'`).pipe( - Effect.map((row) => row !== undefined), - Effect.orDie, - ) -} +export * as V1Migration from "#v1-migration" +export * from "#v1-migration" diff --git a/packages/core/src/environment/unavailable.ts b/packages/core/src/environment/unavailable.ts new file mode 100644 index 00000000000..59db611a77f --- /dev/null +++ b/packages/core/src/environment/unavailable.ts @@ -0,0 +1,17 @@ +import { Effect, Layer, PlatformError } from "effect" +import { ChildProcessSpawner, make } from "effect/unstable/process/ChildProcessSpawner" + +export const spawner = make(() => + Effect.fail( + PlatformError.systemError({ + _tag: "Unknown", + module: "Environment", + method: "spawn", + description: "This location has no execution plane: no workspace is attached and the host cannot spawn processes", + }), + ), +) + +export const layer = Layer.succeed(ChildProcessSpawner, spawner) + +export * as EnvironmentUnavailable from "./unavailable.js" diff --git a/packages/core/src/filesystem/fff.workerd.ts b/packages/core/src/filesystem/fff.workerd.ts new file mode 100644 index 00000000000..12d2dc52781 --- /dev/null +++ b/packages/core/src/filesystem/fff.workerd.ts @@ -0,0 +1,12 @@ +import { bind } from "./fff.js" + +export type { Directory, DirSearch, File, Init, Mixed, MixedSearch, Picker, Result, Search } from "./fff.js" + +// No fff backend exists on workerd; every create reports unavailability and +// FileSystemSearch degrades the same way it does on a runtime without the native module. +const adapter = bind(undefined, "fff unavailable on workerd runtime") + +export const available = adapter.available +export const create = adapter.create + +export * as Fff from "./fff.workerd.js" diff --git a/packages/core/src/filesystem/watcher-binding.ts b/packages/core/src/filesystem/watcher-binding.ts index 86a848878bc..e36dbbdf2e7 100644 --- a/packages/core/src/filesystem/watcher-binding.ts +++ b/packages/core/src/filesystem/watcher-binding.ts @@ -2,9 +2,10 @@ import { createRequire } from "node:module" declare const OPENCODE_LIBC: string | undefined -const require = createRequire(import.meta.url) - +// Lazy: on workerd import.meta.url is undefined and the watcher is never +// loaded, so createRequire must not run at module scope. export default function load() { + const require = createRequire(import.meta.url) const libc = typeof OPENCODE_LIBC === "undefined" ? undefined : OPENCODE_LIBC return require( process.env.OPENCODE_PARCEL_WATCHER_PATH ?? diff --git a/packages/core/src/image/photon-wasm.workerd.ts b/packages/core/src/image/photon-wasm.workerd.ts new file mode 100644 index 00000000000..6207c54ce48 --- /dev/null +++ b/packages/core/src/image/photon-wasm.workerd.ts @@ -0,0 +1,4 @@ +// workerd has no filesystem path to a photon wasm artifact. Image.Photon only +// reads this lazily and surfaces a typed ResizerUnavailableError when loading +// fails, so an empty path degrades cleanly instead of breaking module load. +export default "" diff --git a/packages/core/src/mcp/client.ts b/packages/core/src/mcp/client.ts index 49a9e0fc210..b5cba91ff8a 100644 --- a/packages/core/src/mcp/client.ts +++ b/packages/core/src/mcp/client.ts @@ -1,11 +1,10 @@ export * as MCPClient from "./client.js" import path from "node:path" -import { execFile } from "node:child_process" import { pathToFileURL } from "node:url" import { Client } from "@modelcontextprotocol/sdk/client/index.js" -import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js" import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js" +import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js" import { UnauthorizedError, type OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js" import { CallToolResultSchema, @@ -30,13 +29,12 @@ import { } from "@modelcontextprotocol/sdk/types.js" import { Cause, Effect, Exit, Schema } from "effect" import { ConfigMCP } from "@opencode-ai/schema/config/mcp" +import { MCPStdio } from "./stdio.js" const DEFAULT_STARTUP_TIMEOUT = 30_000 const DEFAULT_CATALOG_TIMEOUT = 30_000 const DEFAULT_EXECUTION_TIMEOUT = 12 * 60 * 60 * 1_000 // 12 hours -type Transport = StdioClientTransport | StreamableHTTPClientTransport - // Some servers advertise tool outputSchemas the SDK's strict validator can't resolve; this drops // only that field so a single bad schema doesn't blank out the whole tool list. const TolerantListToolsResult = ListToolsResultSchema.extend({ @@ -176,7 +174,12 @@ export interface Connection { readonly onResourcesChanged: (callback: () => void) => void } -/** Connects an MCP server; closing the calling scope tears down the transport and any spawned process. */ +/** + * Connects an MCP server; closing the calling scope tears down the transport and any spawned process. + * + * A stdio server is spawned through the location's `Environment`, so it runs on the same execution + * plane as the location's shell commands rather than always on the host. + */ export const connect = Effect.fnUntraced(function* ( server: string, config: typeof ConfigMCP.Server.Type, @@ -190,13 +193,12 @@ export const connect = Effect.fnUntraced(function* ( const transport: Transport = yield* Effect.gen(function* () { if (config.type === "local") { const [command, ...args] = config.command - return new StdioClientTransport({ + return yield* MCPStdio.make({ + server, command, args, cwd: config.cwd ? path.resolve(directory, config.cwd) : directory, - stderr: "pipe", - env: { - ...(process.env as Record), + environment: { ...(command === "opencode" ? { BUN_BE_BUN: "1" } : {}), ...config.environment, }, @@ -233,9 +235,9 @@ export const connect = Effect.fnUntraced(function* ( catch: (error) => error, }).pipe(Effect.exit) if (Exit.isSuccess(exit)) { - yield* Effect.addFinalizer(() => - cleanupStdioDescendants(transport).pipe(Effect.andThen(Effect.promise(() => client.close())), Effect.ignore), - ) + // Closing the client closes the transport, which ends stdin and then kills through the spawner + // handle if the server does not exit cleanly. The process scope remains a final backstop. + yield* Effect.addFinalizer(() => Effect.promise(() => client.close()).pipe(Effect.ignore)) const catalogTimeout = config.timeout?.catalog ?? DEFAULT_CATALOG_TIMEOUT const executionTimeout = config.timeout?.execution ?? DEFAULT_EXECUTION_TIMEOUT return { @@ -434,58 +436,12 @@ export const connect = Effect.fnUntraced(function* ( } satisfies Connection } - yield* cleanupStdioDescendants(transport).pipe(Effect.andThen(Effect.promise(() => transport.close())), Effect.ignore) + yield* Effect.promise(() => transport.close()).pipe(Effect.ignore) const error = Cause.squash(exit.cause) if (error instanceof UnauthorizedError) return yield* new NeedsAuthError({ server }) return yield* new ConnectError({ server, message: error instanceof Error ? error.message : String(error) }) }) -// SDK close stops the MCP process, but not child processes it spawned. -const cleanupStdioDescendants = (transport: Transport) => - Effect.gen(function* () { - if (!(transport instanceof StdioClientTransport)) return - const pid = transport.pid - if (typeof pid !== "number") return - yield* Effect.forEach( - yield* descendantPids(pid), - (pid) => - Effect.try({ - try: () => process.kill(pid, "SIGTERM"), - catch: () => undefined, - }).pipe(Effect.ignore), - { discard: true }, - ) - }) - -const descendantPids = Effect.fnUntraced(function* (root: number) { - if (process.platform === "win32") return [] - const result: number[] = [] - const queue = [root] - for (let index = 0; index < queue.length; index++) { - const parent = queue[index] - if (parent === undefined) return result - const children = (yield* childPids(parent)).filter((pid) => !result.includes(pid)) - result.push(...children) - queue.push(...children) - } - return result -}) - -const childPids = (pid: number) => - Effect.promise( - () => - new Promise((resolve) => { - execFile("pgrep", ["-P", String(pid)], { encoding: "utf8" }, (_error, stdout) => { - resolve( - stdout - .split("\n") - .map((line) => Number.parseInt(line, 10)) - .filter((pid) => Number.isInteger(pid)), - ) - }) - }), - ) - async function paginate( list: (cursor: string | undefined) => Promise, items: (result: R) => T[], diff --git a/packages/core/src/mcp/index.ts b/packages/core/src/mcp/index.ts index c1020cbff41..4685bc31eb5 100644 --- a/packages/core/src/mcp/index.ts +++ b/packages/core/src/mcp/index.ts @@ -12,6 +12,7 @@ import { makeLocationNode } from "@opencode-ai/util/effect/app-node" import { Config } from "../config.js" import { Credential } from "../credential.js" import { Bus } from "../bus.js" +import { Environment } from "../environment/index.js" import { Form } from "../form.js" import { Integration } from "../integration.js" import { KeyedMutex } from "../effect/keyed-mutex.js" @@ -173,13 +174,13 @@ export const layer = (options?: Options) => Effect.gen(function* () { const config = yield* Config.Service const location = yield* Location.Service + const environment = yield* Environment.Service const bus = yield* Bus.Service const forms = yield* Form.Service const integration = yield* Integration.Service const credentials = yield* Credential.Service - const root = yield* Scope.make() + const root = yield* Effect.scope const fork = yield* FiberSet.makeRuntime() - yield* Effect.addFinalizer((exit) => Scope.close(root, exit)) const loadConfig = (entries: readonly Entry[]) => { const documents = entries.filter((entry): entry is Document => entry.type === "document") @@ -459,13 +460,8 @@ export const layer = (options?: Options) => connection.onClose(() => live( Effect.gen(function* () { - entry.client = undefined - entry.tools = undefined - entry.prompts = undefined entry.status = { status: "failed", error: "Connection closed" } - yield* bus.publish(McpEvent.ToolsChanged, { server: name }).pipe(Effect.ignore) - yield* bus.publish(McpEvent.ResourcesChanged, { server: name }).pipe(Effect.ignore) - yield* bus.publish(Command.Event.Updated, {}).pipe(Effect.ignore) + yield* stopServer(name, entry) yield* bus.publish(McpEvent.StatusChanged, { server: name }).pipe(Effect.ignore) }), ), @@ -520,6 +516,8 @@ export const layer = (options?: Options) => options?.clientInfo, ).pipe( Effect.flatMap((connection) => connection.tools().pipe(Effect.map((tools) => ({ connection, tools })))), + // A stdio server is spawned on this location's execution plane, not the host's. + Effect.provideService(Environment.Service, environment), Scope.provide(scope), Effect.exit, ) @@ -828,7 +826,7 @@ export function configured(options?: Options) { return makeLocationNode({ service: Service, layer: layer(options), - deps: [Config.node, Location.node, Bus.node, Form.node, Integration.node, Credential.node], + deps: [Config.node, Location.node, Environment.node, Bus.node, Form.node, Integration.node, Credential.node], }) } diff --git a/packages/core/src/mcp/oauth.ts b/packages/core/src/mcp/oauth.ts index 1fda70dbd61..b6a87b9b935 100644 --- a/packages/core/src/mcp/oauth.ts +++ b/packages/core/src/mcp/oauth.ts @@ -2,7 +2,6 @@ export * as MCPOAuth from "./oauth.js" import { auth, type OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js" import type { OAuthClientInformationMixed, OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js" -import { createServer } from "node:http" import { Deferred, Effect } from "effect" import { Credential } from "@opencode-ai/schema/credential" import { ConfigMCP } from "@opencode-ai/schema/config/mcp" @@ -152,6 +151,8 @@ export const authorize = (input: { const redirectPath = oauth?.redirect_uri ? new URL(oauth.redirect_uri).pathname : "/callback" const state = Buffer.from(crypto.getRandomValues(new Uint8Array(32))).toString("base64url") + // Lazy so runtimes without a loopback listener (workerd) never evaluate node:http. + const { createServer } = yield* Effect.promise(() => import("node:http")) const server = createServer((request, response) => { const url = new URL(request.url ?? "/", "http://127.0.0.1") if (url.pathname !== redirectPath) { diff --git a/packages/core/src/mcp/stdio.ts b/packages/core/src/mcp/stdio.ts new file mode 100644 index 00000000000..2da5c71a1d0 --- /dev/null +++ b/packages/core/src/mcp/stdio.ts @@ -0,0 +1,181 @@ +export * as MCPStdio from "./stdio.js" + +import { ReadBuffer, serializeMessage } from "@modelcontextprotocol/sdk/shared/stdio.js" +import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js" +import type { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js" +import { Cause, Duration, Effect, Queue, Scope, Stream } from "effect" +import { ChildProcess } from "effect/unstable/process" +import type { ChildProcessHandle } from "effect/unstable/process/ChildProcessSpawner" +import { Environment } from "../environment/index.js" + +/** Mirrors StdioClientTransport: wait this long for a graceful exit after stdin closes. */ +const CLOSE_GRACE = Duration.seconds(2) + +/** Mirrors StdioClientTransport: escalate SIGTERM to SIGKILL after this long. */ +const FORCE_KILL_AFTER = Duration.seconds(2) +const OUTGOING_CAPACITY = 64 +const MAX_FRAME_BYTES = 16 * 1024 * 1024 + +export interface Options { + /** Server name; only used to attribute logs. */ + readonly server: string + readonly command: string + readonly args: ReadonlyArray + readonly cwd: string + /** + * Environment declared by the server config, and nothing else. + * + * The host environment is merged in by the spawner via `extendEnv`, which keeps the merge on the + * side that actually runs the process: the local driver extends with the host's `process.env` + * (what the MCP SDK's transport did), while a workspace driver extends with the sandbox's own + * environment. Host variables therefore never cross the seam into a remote workspace. + */ + readonly environment: Record +} + +/** + * MCP stdio transport that spawns its server through the location's `Environment` instead of the + * SDK's host-bound `StdioClientTransport`, so a workspace-backed location runs its MCP servers + * wherever the rest of its execution happens. + * + * The process is acquired in the calling scope: closing the scope kills it (the spawner kills the + * whole process group, so descendants go too) regardless of whether the transport was closed. + */ +export const make = Effect.fnUntraced(function* (options: Options) { + const environment = yield* Environment.Service + const scope = yield* Effect.scope + // Outgoing frames are queued rather than written to `handle.stdin` directly: the sink closes the + // stream it is run with, and stdin must stay open across the whole session. + const outgoing = yield* Queue.bounded(OUTGOING_CAPACITY) + const buffer = new ReadBuffer() + const state: { phase: "ready" | "starting" | "open" | "closed"; handle?: ChildProcessHandle } = { phase: "ready" } + let startup: Promise | undefined + let closing: Promise | undefined + let trailingBytes = 0 + + const stop = (handle: ChildProcessHandle) => + Effect.gen(function* () { + const exit = yield* Effect.timeoutOption(handle.exitCode, CLOSE_GRACE) + if (exit._tag === "Some") return + const terminated = yield* Effect.timeoutOption(handle.kill({ killSignal: "SIGTERM" }), FORCE_KILL_AFTER) + if (terminated._tag === "None") yield* handle.kill({ killSignal: "SIGKILL" }) + }).pipe(Effect.ignore) + + const close = () => + (closing ??= Effect.runPromise( + Effect.gen(function* () { + state.phase = "closed" + Queue.endUnsafe(outgoing) + if (startup) yield* Effect.promise(() => startup!.catch(() => undefined)) + const handle = state.handle + if (!handle) return + state.handle = undefined + yield* stop(handle) + }).pipe(Effect.ensuring(Queue.shutdown(outgoing)), Effect.ensuring(Effect.sync(() => buffer.clear()))), + )) + + const transport: Transport = { + start: () => { + if (state.phase !== "ready") return Promise.reject(new Error("Stdio transport already started")) + state.phase = "starting" + startup = Effect.runPromise( + Effect.gen(function* () { + const handle = yield* environment.spawner.spawn( + ChildProcess.make(options.command, [...options.args], { + cwd: options.cwd, + env: options.environment, + extendEnv: true, + stdin: { stream: Stream.encodeText(Stream.fromQueue(outgoing)), endOnDone: true }, + stdout: "pipe", + stderr: "pipe", + forceKillAfter: FORCE_KILL_AFTER, + }), + ) + state.handle = handle + if (state.phase === "closed") { + state.handle = undefined + return yield* stop(handle) + } + state.phase = "open" + yield* startOutput(handle) + }).pipe(Scope.provide(scope)), + ) + return startup + }, + send: (message: JSONRPCMessage) => + state.phase !== "open" + ? Promise.reject(new Error("Not connected")) + : Effect.runPromise( + Queue.offer(outgoing, serializeMessage(message)).pipe( + Effect.flatMap((offered) => (offered ? Effect.void : Effect.fail(new Error("Not connected")))), + ), + ), + close, + } + + const deliver = (chunk: Uint8Array) => + Effect.gen(function* () { + for (const byte of chunk) { + trailingBytes = byte === 10 ? 0 : trailingBytes + 1 + if (trailingBytes > MAX_FRAME_BYTES) return yield* Effect.fail(new Error("MCP stdio frame exceeded 16 MiB")) + } + buffer.append(Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)) + while (true) { + // `undefined` means the frame failed to parse: the buffer has already advanced past it, so + // keep draining. `null` means the buffer holds no complete frame yet. + const message = yield* Effect.try({ + try: () => buffer.readMessage(), + catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))), + }).pipe( + Effect.catch((error) => + Effect.sync(() => { + transport.onerror?.(error) + return undefined + }), + ), + ) + if (message === undefined) continue + if (message === null) return + transport.onmessage?.(message) + } + }) + + const startOutput = (handle: ChildProcessHandle) => + Effect.gen(function* () { + yield* Effect.forkScoped( + Stream.runForEach(handle.stdout, deliver).pipe( + Effect.tapCause((cause) => + Effect.sync(() => { + const error = Cause.squash(cause) + transport.onerror?.(error instanceof Error ? error : new Error(String(error))) + }), + ), + Effect.ignore, + // stdout ending means the server is gone; the SDK transport reports that the same way. + Effect.ensuring( + Effect.gen(function* () { + const unexpected = state.phase !== "closed" + if (unexpected) yield* Effect.promise(close) + transport.onclose?.() + }), + ), + ), + ) + + // StdioClientTransport pipes stderr into a stream nobody reads. Drain chunks into the debug + // log so chatty servers cannot stall and newline-free output is not buffered without bound. + yield* Effect.forkScoped( + handle.stderr.pipe( + Stream.decodeText(), + Stream.runForEach((output) => + output.trim() === "" + ? Effect.void + : Effect.logDebug("mcp server stderr", { server: options.server, output }), + ), + Effect.ignore, + ), + ) + }) + + return transport +}) diff --git a/packages/core/src/models-dev.ts b/packages/core/src/models-dev.ts index e23d735a87b..5fcdf7d4868 100644 --- a/packages/core/src/models-dev.ts +++ b/packages/core/src/models-dev.ts @@ -544,6 +544,24 @@ const Cache = Schema.Struct({ }) const defaultSource = "https://models.opencode.ai" +// Bundled snapshot of https://models.opencode.ai/api.json, committed at +// packages/core/src/models-dev/snapshot.txt and refreshed via +// `bun run script/update-models-snapshot.ts`. Decoded and normalized once per +// isolate: the snapshot is a multi-MB module-level constant and one isolate can +// host many runtimes (Cloudflare colocates Durable Object instances), so +// per-runtime decoding would multiply the cost. +let bundledCache: readonly Snapshot[] | undefined +const bundledSnapshot = Effect.suspend(() => + bundledCache + ? Effect.succeed(bundledCache) + : decodeCatalog(snapshotText).pipe( + Effect.map((catalog) => { + bundledCache = normalize(catalog) + return bundledCache + }), + ), +) + function cacheKey(source: string) { if (source === defaultSource) return "models-dev:catalog" return `models-dev:catalog:${Hash.fast(source)}` @@ -607,11 +625,9 @@ export const layer = (options?: Options) => ) : Effect.succeed(undefined) - // Bundled snapshot of https://models.opencode.ai/api.json, committed at - // packages/core/src/models-dev/snapshot.txt and refreshed via - // `bun run script/update-models-snapshot.ts`. It is the boot-time floor - // for the catalog; the periodic fetch below still refreshes on top. - const loadSnapshot = options?.snapshot === false ? Effect.succeed(undefined) : decodeCatalog(snapshotText) + // The bundled snapshot is the boot-time floor for the catalog; the + // periodic fetch below still refreshes on top. + const loadSnapshot = options?.snapshot === false ? Effect.succeed(undefined) : bundledSnapshot const fetchAndWrite = Effect.fn("ModelsDev.fetchAndWrite")(function* () { const text = yield* fetchApi() @@ -635,7 +651,7 @@ export const layer = (options?: Options) => const cached = options?.file ? undefined : yield* loadFromCache() if (cached) return normalize(cached.catalog) const bundled = yield* loadSnapshot - if (bundled) return normalize(bundled) + if (bundled) return bundled if (!fetch) return [] const catalog = yield* lock.withPermit( Effect.gen(function* () { diff --git a/packages/core/src/plugin/provider/github-copilot.ts b/packages/core/src/plugin/provider/github-copilot.ts index c5a2e2808b8..916c0b922f7 100644 --- a/packages/core/src/plugin/provider/github-copilot.ts +++ b/packages/core/src/plugin/provider/github-copilot.ts @@ -204,10 +204,11 @@ export const GithubCopilotPlugin = define({ for (const [id, model] of loaded.models) { evt.model.update(item.provider.id, id, (draft) => Object.assign(draft, structuredClone(model))) } - } else if (loaded.baseURL) { + } else { for (const id of item.models.keys()) { evt.model.update(item.provider.id, id, (model) => { - model.settings = Provider.mergeOverlay(model.settings, { baseURL: loaded.baseURL }) + model.package = "@ai-sdk/github-copilot" + if (loaded.baseURL) model.settings = Provider.mergeOverlay(model.settings, { baseURL: loaded.baseURL }) }) } } diff --git a/packages/core/src/plugin/provider/openai.ts b/packages/core/src/plugin/provider/openai.ts index 15437e7c89d..2aeded888d0 100644 --- a/packages/core/src/plugin/provider/openai.ts +++ b/packages/core/src/plugin/provider/openai.ts @@ -1,4 +1,3 @@ -import { createServer } from "node:http" import type { IntegrationOAuthMethodRegistration } from "@opencode-ai/plugin/effect/integration" import { define } from "@opencode-ai/plugin/effect/plugin" import { Deferred, Effect, Option, Schema, Semaphore, Stream } from "effect" @@ -58,6 +57,8 @@ const browser = (app: App.Info) => const state = base64UrlEncode(crypto.getRandomValues(new Uint8Array(32)).buffer) const code = yield* Deferred.make() const redirect = `http://localhost:${callbackPort}/auth/callback` + // Lazy so runtimes without a loopback listener (workerd) never evaluate node:http. + const { createServer } = yield* Effect.promise(() => import("node:http")) const server = createServer((request, response) => { const url = new URL(request.url ?? "/", `http://localhost:${callbackPort}`) if (url.pathname !== "/auth/callback") { diff --git a/packages/core/src/plugin/system-prompt.ts b/packages/core/src/plugin/system-prompt.ts index 4756d67ef87..dca093fbe4b 100644 --- a/packages/core/src/plugin/system-prompt.ts +++ b/packages/core/src/plugin/system-prompt.ts @@ -23,7 +23,11 @@ export const GooglePlugin = make("google", (id) => (id.includes("gemini-") ? PRO export const AnthropicPlugin = make("anthropic", (id) => (id.includes("claude") ? PROMPT_ANTHROPIC : undefined)) export const KimiPlugin = make("kimi", (id) => (id.includes("kimi") ? PROMPT_KIMI : undefined)) export const ArceePlugin = make("arcee", (id) => (id.includes("trinity") ? PROMPT_TRINITY : undefined)) -export const MetaPlugin = make("meta", (id) => (id.includes("muse-spark") ? PROMPT_META : undefined)) +export const MetaPlugin = make("meta", (id) => { + if (!id.includes("muse")) return + const name = id.includes("muse-glimmer") ? "Muse Glimmer" : "Muse Spark" + return PROMPT_META.replaceAll("{{MODEL_NAME}}", name) +}) export const Plugins = [OpenAIPlugin, GooglePlugin, AnthropicPlugin, KimiPlugin, ArceePlugin, MetaPlugin] as const diff --git a/packages/core/src/plugin/system-prompt/meta.txt b/packages/core/src/plugin/system-prompt/meta.txt index a8f92270bbd..f31887a7d45 100644 --- a/packages/core/src/plugin/system-prompt/meta.txt +++ b/packages/core/src/plugin/system-prompt/meta.txt @@ -1,4 +1,4 @@ -You are OpenCode, a coding agent that helps users with software engineering tasks. You are powered by Muse Spark, a large language model trained by Meta MSL. +You are OpenCode, a coding agent that helps users with software engineering tasks. You are powered by {{MODEL_NAME}}, a large language model trained by Meta MSL. Use the instructions below and the tools available to assist the user. @@ -55,5 +55,5 @@ Use the instructions below and the tools available to assist the user. - NEVER use comments as a place for long-winded chain-of-thought. Long thinking texts must be generated as private reasoning. Comments in code must be appropriately concise. # User Help & Feedback -- Users can give feedback or report issues at https://github.com/anomalyco/opencode and mention that they are using Meta Muse Spark. +- Users can give feedback or report issues at https://github.com/anomalyco/opencode and mention that they are using Meta {{MODEL_NAME}}. - When users ask directly about OpenCode (eg. "can OpenCode do...", "are you able to do...") or its features (eg. implement a hook, write a slash command, or install an MCP server), use the `webfetch` tool to gather information to answer the question from the V2 OpenCode docs at https://opencode.ai/v2/docs/. diff --git a/packages/core/src/project.ts b/packages/core/src/project.ts index 4f1e57897d8..755779d11c1 100644 --- a/packages/core/src/project.ts +++ b/packages/core/src/project.ts @@ -5,7 +5,9 @@ import { ChildProcess } from "effect/unstable/process" import { asc, desc } from "drizzle-orm" import path from "path" import { AbsolutePath } from "./schema.js" +import { Bus } from "./bus.js" import { Database } from "./database/database.js" +import { Event } from "@opencode-ai/schema/project-directories" import { FSUtil } from "@opencode-ai/util/fs-util" import { Git } from "./git.js" import { AppProcess } from "@opencode-ai/util/process" @@ -91,28 +93,40 @@ const layer = Layer.effect( const fs = yield* FSUtil.Service const git = yield* Git.Service const proc = yield* AppProcess.Service + const bus = yield* Bus.Service const db = (yield* Database.Service).db const projectDirectories = yield* ProjectDirectories.Service + const announcing = new Set() const persist = Effect.fnUntraced(function* (project: Resolved) { - yield* db - .transaction((tx) => - Effect.gen(function* () { - yield* upsertProject(tx, project) - if (!project.vcs) return - yield* projectDirectories.create({ projectID: project.id, directory: project.canonical }, tx) - if (project.directory === project.canonical) return - yield* projectDirectories.create( - { - projectID: project.id, - directory: project.directory, - strategy: project.vcs.type === "git" ? "git_worktree" : undefined, - }, - tx, - ) - }), - ) - .pipe(Effect.orDie) + yield* upsertProject(db, project).pipe(Effect.orDie) + if (!project.vcs) return project + const directories: ProjectDirectories.CreateInput[] = [{ projectID: project.id, directory: project.canonical }] + if (project.directory !== project.canonical) + directories.push({ + projectID: project.id, + directory: project.directory, + strategy: project.vcs.type === "git" ? "git_worktree" : undefined, + }) + // A missing directory row means this directory's resolution is a new durable + // fact (copy.ts registers copy directories directly; those never strand + // sessions and never announce). The row insert commits atomically with the + // event, so a crash between checks retries on the next resolve instead of + // stranding the announcement. The in-flight set keeps concurrent resolves + // from publishing the same fact twice. + for (const item of directories) { + const key = item.projectID + "\u0000" + item.directory + if (announcing.has(key)) continue + announcing.add(key) + yield* Effect.gen(function* () { + if (yield* projectDirectories.get({ projectID: item.projectID, directory: item.directory })) return + yield* bus.publish( + Event.Resolved, + { projectID: item.projectID, directory: item.directory, previous: project.previous ?? ID.global }, + { commit: () => Effect.asVoid(projectDirectories.create(item)) }, + ) + }).pipe(Effect.ensuring(Effect.sync(() => announcing.delete(key)))) + } return project }) @@ -250,5 +264,5 @@ const layer = Layer.effect( export const node = makeGlobalNode({ service: Service, layer: layer, - deps: [Database.node, FSUtil.node, Git.node, AppProcess.node, ProjectDirectories.node], + deps: [Bus.node, Database.node, FSUtil.node, Git.node, AppProcess.node, ProjectDirectories.node], }) diff --git a/packages/core/src/pty/pty.workerd.ts b/packages/core/src/pty/pty.workerd.ts new file mode 100644 index 00000000000..f0d485e6f7c --- /dev/null +++ b/packages/core/src/pty/pty.workerd.ts @@ -0,0 +1,9 @@ +import type { Proc } from "./pty.js" + +export type { Disp, Exit, Opts, Proc } from "./pty.js" + +// workerd cannot spawn processes; the Pty service surfaces this as a defect if +// a terminal is ever requested on this runtime. +export function spawn(): Proc { + throw new Error("Pseudo-terminals are unavailable on the workerd runtime") +} diff --git a/packages/core/src/session.ts b/packages/core/src/session.ts index bae924f9f43..48c7625f9fe 100644 --- a/packages/core/src/session.ts +++ b/packages/core/src/session.ts @@ -31,7 +31,7 @@ import { ForkEmptyError, MessageDecodeError, NotFoundError } from "./session/err import { makeGlobalNode } from "@opencode-ai/util/effect/app-node" import { LocationServiceMap } from "./location-service-map.js" import { SessionEvent } from "./session/event.js" -import { SessionPending } from "./session/pending.js" +import { SessionInbox } from "./session/inbox.js" import { InstructionState } from "./session/instruction-state.js" import { SessionGenerate } from "./session/generate.js" import { Snapshot } from "./snapshot.js" @@ -99,6 +99,7 @@ type CreateInput = CreateBaseInput & type CompactInput = { id?: SessionMessage.ID sessionID: SessionSchema.ID + delivery?: SessionInbox.Delivery } type ForkInput = { @@ -133,14 +134,11 @@ export class CompactionConflictError extends Schema.TaggedErrorClass()("Session.BusyError", { sessionID: SessionSchema.ID, }) {} -export class PendingInputConflictError extends Schema.TaggedErrorClass()( - "Session.PendingInputConflictError", - { - sessionID: SessionSchema.ID, - inputID: SessionMessage.ID, - }, -) {} -type PendingInputRef = { readonly sessionID: SessionSchema.ID; readonly inputID: SessionMessage.ID } +export class InboxConflictError extends Schema.TaggedErrorClass()("Session.InboxConflictError", { + sessionID: SessionSchema.ID, + inboxID: SessionMessage.ID, +}) {} +type InboxItemRef = { readonly sessionID: SessionSchema.ID; readonly inboxID: SessionMessage.ID } export class SkillNotFoundError extends Schema.TaggedErrorClass()("Session.SkillNotFoundError", { skill: Skill.ID, }) {} @@ -188,10 +186,10 @@ export interface Interface { * ordered by admission. Includes unpromoted user and synthetic inputs and * unhandled compaction barriers. */ - readonly pending: (sessionID: SessionSchema.ID) => Effect.Effect - readonly cancelPending: (input: PendingInputRef) => Effect.Effect - readonly steerPending: (input: PendingInputRef) => Effect.Effect - readonly queuePending: (input: PendingInputRef) => Effect.Effect + readonly inbox: (sessionID: SessionSchema.ID) => Effect.Effect + readonly cancelInbox: (input: InboxItemRef) => Effect.Effect + readonly steerInbox: (input: InboxItemRef) => Effect.Effect + readonly queueInbox: (input: InboxItemRef) => Effect.Effect /** * Durable, ordered session log read. Replays durable session bus after * the exclusive `after` cursor, emits a `Synced` marker at the captured @@ -211,6 +209,7 @@ export interface Interface { sessionID: SessionSchema.ID directory: AbsolutePath workspaceID?: Location.Ref["workspaceID"] + delivery?: SessionInbox.Delivery }) => Effect.Effect readonly prompt: (input: { id?: SessionMessage.ID @@ -220,9 +219,9 @@ export interface Interface { agents?: PromptInput.Prompt["agents"] skills?: PromptInput.Prompt["skills"] metadata?: Record - delivery?: SessionPending.Delivery + delivery?: SessionInbox.Delivery resume?: boolean - }) => Effect.Effect + }) => Effect.Effect /** Generates text from current Session context without admitting input or mutating history. */ readonly generate: (input: { sessionID: SessionSchema.ID @@ -238,10 +237,10 @@ export interface Interface { files?: PromptInput.Prompt["files"] agents?: PromptInput.Prompt["agents"] skills?: PromptInput.Prompt["skills"] - delivery?: SessionPending.Delivery + delivery?: SessionInbox.Delivery resume?: boolean }) => Effect.Effect< - SessionPending.User, + SessionInbox.User, | NotFoundError | PromptConflictError | AttachmentError @@ -262,7 +261,7 @@ export interface Interface { }) => Effect.Effect readonly compact: ( input: CompactInput, - ) => Effect.Effect + ) => Effect.Effect readonly wait: (id: SessionSchema.ID) => Effect.Effect readonly active: Effect.Effect> readonly background: (sessionID: SessionSchema.ID) => Effect.Effect @@ -274,9 +273,9 @@ export interface Interface { text: string description?: string metadata?: Record - delivery?: SessionPending.Delivery + delivery?: SessionInbox.Delivery resume?: boolean - }) => Effect.Effect + }) => Effect.Effect readonly revert: { readonly stage: (input: { sessionID: SessionSchema.ID @@ -321,12 +320,12 @@ const layer = Layer.effect( ), ) - const pendingConflict = Effect.fn("Session.pendingConflict")(function* (input: PendingInputRef) { + const pendingConflict = Effect.fn("Session.pendingConflict")(function* (input: InboxItemRef) { yield* result.get(input.sessionID) - return yield* new PendingInputConflictError(input) + return yield* new InboxConflictError(input) }) const mutatePending = ( - input: PendingInputRef, + input: InboxItemRef, mutation: ( bus: Bus.Interface, input: { readonly id: SessionMessage.ID; readonly sessionID: SessionSchema.ID }, @@ -335,9 +334,9 @@ const layer = Layer.effect( ) => Effect.uninterruptible( Effect.gen(function* () { - yield* mutation(bus, { sessionID: input.sessionID, id: input.inputID }).pipe( + yield* mutation(bus, { sessionID: input.sessionID, id: input.inboxID }).pipe( Effect.catchDefect((defect) => - defect instanceof SessionPending.LifecycleConflict ? pendingConflict(input) : Effect.die(defect), + defect instanceof SessionInbox.LifecycleConflict ? pendingConflict(input) : Effect.die(defect), ), ) if (wake) yield* execution.wake(input.sessionID) @@ -529,13 +528,13 @@ const layer = Layer.effect( yield* result.get(sessionID) return yield* store.context(sessionID) }), - pending: Effect.fn("Session.pending")(function* (sessionID) { + inbox: Effect.fn("Session.inbox")(function* (sessionID) { yield* result.get(sessionID) - return yield* SessionPending.list(db, sessionID) + return yield* SessionInbox.list(db, sessionID) }), - cancelPending: Effect.fn("Session.cancelPending")((input) => mutatePending(input, SessionPending.cancel)), - steerPending: Effect.fn("Session.steerPending")((input) => mutatePending(input, SessionPending.steer, true)), - queuePending: Effect.fn("Session.queuePending")((input) => mutatePending(input, SessionPending.queue)), + cancelInbox: Effect.fn("Session.cancelInbox")((input) => mutatePending(input, SessionInbox.cancel)), + steerInbox: Effect.fn("Session.steerInbox")((input) => mutatePending(input, SessionInbox.steer, true)), + queueInbox: Effect.fn("Session.queueInbox")((input) => mutatePending(input, SessionInbox.queue)), log: (input) => Stream.unwrap( result @@ -564,25 +563,25 @@ const layer = Layer.effect( skills, ).pipe(Effect.provideService(FSUtil.Service, fs)) const messageID = input.id ?? SessionMessage.ID.create() - const admittedInput = SessionPending.Message.make({ + const admittedInput = SessionInbox.Item.make({ type: "user", - data: { ...prompt, metadata: input.metadata }, + payload: { ...prompt, metadata: input.metadata }, delivery: input.delivery ?? "steer", }) - const admitted = yield* SessionPending.admit(db, bus, { + const admitted = yield* SessionInbox.admit(db, bus, { id: messageID, sessionID: input.sessionID, - input: admittedInput, + item: admittedInput, }).pipe( Effect.catchDefect((defect) => - defect instanceof SessionPending.LifecycleConflict + defect instanceof SessionInbox.LifecycleConflict ? new PromptConflictError({ sessionID: input.sessionID, messageID }) : Effect.die(defect), ), ) if ( admitted.type !== "user" || - !SessionPending.equivalent(admitted, { sessionID: input.sessionID, input: admittedInput }) + !SessionInbox.equivalent(admitted, { sessionID: input.sessionID, item: admittedInput }) ) return yield* new PromptConflictError({ sessionID: input.sessionID, messageID }) if (input.resume !== false) { @@ -640,7 +639,9 @@ const layer = Layer.effect( yield* execution.awaitIdle(input.sessionID) const started = yield* Effect.gen(function* () { const shell = yield* Shell.Service - return yield* shell.create({ command: input.command, cwd: session.location.directory, timeout: 0 }) + return yield* shell + .create({ command: input.command, cwd: session.location.directory, timeout: 0 }) + .pipe(Effect.orDie) }).pipe(Effect.provide(locations.get(session.location))) yield* bus.publish( SessionEvent.Shell.Started, @@ -738,33 +739,35 @@ const layer = Layer.effect( const info = yield* fs.stat(directory).pipe(Effect.catch(() => Effect.succeed(undefined))) if (!info) return yield* new DestinationNotFoundError({ directory }) if (info.type !== "Directory") return yield* new DestinationNotDirectoryError({ directory }) - if (current.location.directory === directory && current.location.workspaceID === input.workspaceID) return const project = yield* projects.resolve(directory) yield* persistProject(project) - if ((yield* execution.active).has(input.sessionID)) { - yield* execution.interrupt(input.sessionID) - yield* execution.awaitIdle(input.sessionID) - } - yield* bus.publish( - SessionEvent.Moved, - { - sessionID: input.sessionID, + const item = SessionInbox.Item.make({ + type: "move", + payload: { location: Location.Ref.make({ directory, workspaceID: input.workspaceID }), projectID: project.id, subpath: RelativePath.make(path.relative(project.directory, directory).replaceAll("\\", "/")), }, - { location: current.location }, - ) + delivery: input.delivery ?? "steer", + }) + const inboxID = SessionMessage.ID.create() + yield* SessionInbox.admit(db, bus, { + id: inboxID, + sessionID: input.sessionID, + item, + }) + yield* execution.wake(input.sessionID) }), compact: Effect.fn("Session.compact")(function* (input) { yield* result.get(input.sessionID) const inputID = input.id ?? SessionMessage.ID.create() - const admitted = yield* SessionPending.admitCompaction(db, bus, { + const admitted = yield* SessionInbox.admitCompaction(db, bus, { id: inputID, sessionID: input.sessionID, + delivery: input.delivery ?? "queue", }).pipe( Effect.catchDefect((defect) => - defect instanceof SessionPending.LifecycleConflict + defect instanceof SessionInbox.LifecycleConflict ? new CompactionConflictError({ sessionID: input.sessionID, inputID }) : Effect.die(defect), ), @@ -804,29 +807,29 @@ const layer = Layer.effect( Effect.gen(function* () { yield* result.get(input.sessionID) const inputID = input.id ?? SessionMessage.ID.create() - const admittedInput = SessionPending.Message.make({ + const admittedInput = SessionInbox.Item.make({ type: "synthetic", - data: { + payload: { text: input.text, description: input.description, metadata: input.metadata, }, delivery: input.delivery ?? "steer", }) - const admitted = yield* SessionPending.admit(db, bus, { + const admitted = yield* SessionInbox.admit(db, bus, { id: inputID, sessionID: input.sessionID, - input: admittedInput, + item: admittedInput, }).pipe( Effect.catchDefect((defect) => - defect instanceof SessionPending.LifecycleConflict + defect instanceof SessionInbox.LifecycleConflict ? new SyntheticConflictError({ sessionID: input.sessionID, inputID }) : Effect.die(defect), ), ) if ( admitted.type !== "synthetic" || - !SessionPending.equivalent(admitted, { sessionID: input.sessionID, input: admittedInput }) + !SessionInbox.equivalent(admitted, { sessionID: input.sessionID, item: admittedInput }) ) return yield* new SyntheticConflictError({ sessionID: input.sessionID, inputID }) if (input.resume !== false && !(yield* result.get(input.sessionID)).revert) @@ -839,7 +842,7 @@ const layer = Layer.effect( Effect.uninterruptible( Effect.gen(function* () { yield* execution.interrupt(sessionID) - if (options?.continue && (yield* SessionPending.has(db, sessionID, "any"))) yield* execution.wake(sessionID) + if (options?.continue && (yield* SessionInbox.has(db, sessionID, "any"))) yield* execution.wake(sessionID) }), ), ), diff --git a/packages/core/src/session/compaction.ts b/packages/core/src/session/compaction.ts index 21761a1a1f3..dbdc5db9515 100644 --- a/packages/core/src/session/compaction.ts +++ b/packages/core/src/session/compaction.ts @@ -89,6 +89,7 @@ export type ManualInput = { readonly session: SessionSchema.Info readonly messages: readonly SessionMessage.Info[] readonly inputID: SessionMessage.ID + readonly started?: boolean } type RequiredInput = Omit @@ -102,6 +103,7 @@ type Plan = { readonly prompt: string readonly recent: string readonly inputID?: SessionMessage.ID + readonly started?: boolean } export type Outcome = @@ -248,12 +250,13 @@ const make = (dependencies: Dependencies) => { return { status: "failed" as const, error: input.error } }) const execute = Effect.fn("SessionCompaction.execute")(function* (plan: Plan) { - yield* dependencies.bus.publish(SessionEvent.Compaction.Started, { - sessionID: plan.session.id, - reason: plan.reason, - recent: plan.recent, - inputID: plan.inputID, - }) + if (!plan.started) + yield* dependencies.bus.publish(SessionEvent.Compaction.Started, { + sessionID: plan.session.id, + reason: plan.reason, + recent: plan.recent, + inputID: plan.inputID, + }) const chunks: string[] = [] let failure: SessionError.Error | undefined @@ -408,6 +411,7 @@ const make = (dependencies: Dependencies) => { cost: resolved.cost, reason: "manual", inputID: input.inputID, + started: input.started, ...content, }) }) diff --git a/packages/core/src/session/execution.ts b/packages/core/src/session/execution.ts index 8c60a894b85..6ea2fc0779c 100644 --- a/packages/core/src/session/execution.ts +++ b/packages/core/src/session/execution.ts @@ -1,6 +1,6 @@ export * as SessionExecution from "./execution.js" -import { Cause, Context, Effect, Exit, Layer } from "effect" +import { Cause, Context, Effect, Exit, Layer, Stream } from "effect" import { Bus } from "../bus.js" import { LocationServiceMap } from "../location-service-map.js" import { makeGlobalNode } from "@opencode-ai/util/effect/app-node" @@ -67,16 +67,17 @@ export const layer = Layer.effect( const releaseOnCommit = (sessionID: SessionSchema.ID) => ({ commit: () => store.release(sessionID), }) - const coordinator = yield* SessionRunCoordinator.make({ - started: (sessionID) => - reportLifecycle( - sessionID, - bus.publish(SessionEvent.Execution.Started, { sessionID }, claimOnCommit(sessionID)), - ), - drain: Effect.fnUntraced(function* (sessionID: SessionSchema.ID, force) { + function drain( + sessionID: SessionSchema.ID, + force: boolean, + continuation?: SessionRunner.Continuation, + ): Effect.Effect { + return Effect.gen(function* () { const session = yield* store.get(sessionID) if (!session) return yield* Effect.die(new Error(`Session not found: ${sessionID}`)) - return yield* SessionRunner.Service.use((runner) => runner.drain({ sessionID, force })).pipe( + const result = yield* SessionRunner.Service.use((runner) => + runner.drain({ sessionID, force, continuation }), + ).pipe( Effect.provide(locations.get(session.location)), Effect.tapCause((cause) => Cause.hasInterruptsOnly(cause) @@ -84,7 +85,17 @@ export const layer = Layer.effect( : Effect.logError("Failed to drain Session", cause).pipe(Effect.annotateLogs({ sessionID })), ), ) - }), + if (result.type === "complete") return + return yield* drain(sessionID, false, result.continuation) + }) + } + const coordinator = yield* SessionRunCoordinator.make({ + started: (sessionID) => + reportLifecycle( + sessionID, + bus.publish(SessionEvent.Execution.Started, { sessionID }, claimOnCommit(sessionID)), + ), + drain: (sessionID, force) => drain(sessionID, force), // One terminal observation per busy period, covering every coalesced drain. settled: (sessionID, exit, reason) => reportLifecycle( @@ -116,6 +127,10 @@ export const layer = Layer.effect( }), ), }) + yield* bus.subscribe(SessionEvent.Moved).pipe( + Stream.runForEach((event) => coordinator.wake(event.data.sessionID)), + Effect.forkScoped, + ) return Service.of({ active: coordinator.active, diff --git a/packages/core/src/session/inbox.ts b/packages/core/src/session/inbox.ts new file mode 100644 index 00000000000..ca2942f81b7 --- /dev/null +++ b/packages/core/src/session/inbox.ts @@ -0,0 +1,505 @@ +export * as SessionInbox from "./inbox.js" + +import { and, asc, eq, or } from "drizzle-orm" +import { DateTime, Effect, Schema } from "effect" +import { + Compaction, + CompactionPayload, + Delivery, + Info, + Item, + Move, + MovePayload, + Synthetic, + SyntheticPayload, + User, + UserPayload, +} from "@opencode-ai/schema/session-inbox" +import type { Database } from "../database/database.js" +import { Bus } from "../bus.js" +import { KeyedMutex } from "../effect/keyed-mutex.js" +import { SessionEvent } from "./event.js" +import { SessionMessage } from "./message.js" +import { SessionSchema } from "./schema.js" +import { SessionInboxTable, SessionMessageTable } from "./sql.js" + +type DatabaseService = Database.Interface["db"] + +export { + Compaction, + CompactionPayload, + Delivery, + Info, + Item, + Move, + MovePayload, + Synthetic, + SyntheticPayload, + User, + UserPayload, +} + +/** + * Which pending input `promote` may consume: "steer" promotes steers only (a step + * boundary mid-work), while "input" also allows one queued input when no steers are + * waiting (the idle boundary, where the Session picks up fresh work). + */ +export type Promotable = "input" | "steer" + +const decodeUser = Schema.decodeUnknownSync(UserPayload) +const encodeUser = Schema.encodeSync(UserPayload) +const decodeSynthetic = Schema.decodeUnknownSync(SyntheticPayload) +const encodeSynthetic = Schema.encodeSync(SyntheticPayload) +const decodeCompaction = Schema.decodeUnknownSync(CompactionPayload) +const encodeCompaction = Schema.encodeSync(CompactionPayload) +const decodeMove = Schema.decodeUnknownSync(MovePayload) +const encodeMove = Schema.encodeSync(MovePayload) +const decodeMessage = Schema.decodeUnknownSync(SessionMessage.Info) +const inboxLocks = KeyedMutex.makeUnsafe() +type PendingRef = { readonly id: SessionMessage.ID; readonly sessionID: SessionSchema.ID } + +export const serialized = (sessionID: SessionSchema.ID, effect: Effect.Effect) => + inboxLocks.withLock(sessionID)(effect) + +export class LifecycleConflict extends Schema.TaggedErrorClass()("SessionInbox.LifecycleConflict", { + id: SessionMessage.ID, +}) {} + +const fromRow = (row: typeof SessionInboxTable.$inferSelect): Info => { + const base = { + id: SessionMessage.ID.make(row.id), + sessionID: SessionSchema.ID.make(row.session_id), + timeCreated: DateTime.makeUnsafe(row.time_created), + } + if (row.type === "compaction") + return Compaction.make({ + ...base, + type: "compaction", + payload: decodeCompaction(row.payload), + delivery: row.delivery, + }) + if (row.type === "move") + return Move.make({ ...base, type: "move", payload: decodeMove(row.payload), delivery: row.delivery }) + if (row.type === "user") + return User.make({ + ...base, + type: "user", + payload: decodeUser(row.payload), + delivery: row.delivery, + }) + if (row.type === "synthetic") + return Synthetic.make({ + ...base, + type: "synthetic", + payload: decodeSynthetic(row.payload), + delivery: row.delivery, + }) + throw new LifecycleConflict({ id: base.id }) +} + +export const find = Effect.fn("SessionInbox.find")(function* (db: DatabaseService, id: SessionMessage.ID) { + const row = yield* db.select().from(SessionInboxTable).where(eq(SessionInboxTable.id, id)).get().pipe(Effect.orDie) + return row === undefined ? undefined : fromRow(row) +}) + +const promotedFromMessage = Effect.fn("SessionInbox.promotedFromMessage")(function* ( + db: DatabaseService, + sessionID: SessionSchema.ID, + id: SessionMessage.ID, + delivery: Delivery, +) { + const row = yield* db + .select() + .from(SessionMessageTable) + .where(eq(SessionMessageTable.id, id)) + .get() + .pipe(Effect.orDie) + if (row === undefined) return undefined + if (row.session_id !== sessionID || (row.type !== "user" && row.type !== "synthetic")) + return yield* Effect.die(new LifecycleConflict({ id })) + const message = decodeMessage({ ...row.data, id: row.id, type: row.type }) + const base = { id, sessionID, timeCreated: message.time.created, delivery } + if (message.type === "user") + return User.make({ + ...base, + type: "user", + payload: decodeUser(message), + }) + if (message.type === "synthetic") + return Synthetic.make({ + ...base, + type: "synthetic", + payload: decodeSynthetic(message), + }) + return yield* Effect.die(new LifecycleConflict({ id })) +}) + +export const admit = Effect.fn("SessionInbox.admit")(function* ( + db: DatabaseService, + bus: Bus.Interface, + request: { + readonly id: SessionMessage.ID + readonly sessionID: SessionSchema.ID + readonly item: Item + }, +) { + const existing = yield* find(db, request.id) + if (existing !== undefined) { + if (existing.type === "compaction") return yield* Effect.die(new LifecycleConflict({ id: request.id })) + return existing + } + const promoted = yield* promotedFromMessage(db, request.sessionID, request.id, request.item.delivery) + if (promoted !== undefined) return promoted + return yield* bus + .publish(SessionEvent.InboxEnqueued, { + inboxID: request.id, + sessionID: request.sessionID, + item: request.item, + }) + .pipe( + Effect.flatMap((event) => { + const base = { + id: request.id, + sessionID: request.sessionID, + timeCreated: event.created, + } + return Effect.succeed(Info.make({ ...base, ...request.item })) + }), + Effect.catchDefect((defect) => + find(db, request.id).pipe( + Effect.flatMap((stored) => + stored?.type === request.item.type ? Effect.succeed(stored) : Effect.die(defect), + ), + ), + ), + ) +}) + +export const admitCompaction = Effect.fn("SessionInbox.admitCompaction")(function* ( + db: DatabaseService, + bus: Bus.Interface, + input: { readonly id: SessionMessage.ID; readonly sessionID: SessionSchema.ID; readonly delivery: Delivery }, +) { + const admitted = yield* admit(db, bus, { + id: input.id, + sessionID: input.sessionID, + item: Item.make({ type: "compaction", payload: {}, delivery: input.delivery }), + }) + if (admitted.type === "compaction") return admitted + return yield* Effect.die(new LifecycleConflict({ id: input.id })) +}) + +export const projectAdmitted = Effect.fn("SessionInbox.projectAdmitted")(function* ( + db: DatabaseService, + request: { + readonly enqueuedSeq: number + readonly id: SessionMessage.ID + readonly sessionID: SessionSchema.ID + readonly item: Item + readonly timeCreated: DateTime.Utc + }, +) { + const message = yield* db + .select({ id: SessionMessageTable.id }) + .from(SessionMessageTable) + .where(eq(SessionMessageTable.id, request.id)) + .get() + .pipe(Effect.orDie) + if (message !== undefined) return yield* Effect.die(new LifecycleConflict({ id: request.id })) + const stored = yield* db + .insert(SessionInboxTable) + .values({ + id: request.id, + session_id: request.sessionID, + type: request.item.type, + payload: + request.item.type === "user" + ? encodeUser(request.item.payload) + : request.item.type === "synthetic" + ? encodeSynthetic(request.item.payload) + : request.item.type === "compaction" + ? encodeCompaction(request.item.payload) + : encodeMove(request.item.payload), + delivery: request.item.delivery, + enqueued_seq: request.enqueuedSeq, + time_created: DateTime.toEpochMillis(request.timeCreated), + }) + .onConflictDoNothing() + .returning({ id: SessionInboxTable.id }) + .get() + .pipe(Effect.orDie) + if (!stored) return yield* Effect.die(new LifecycleConflict({ id: request.id })) +}) + +/** + * Consume one pending row at promotion. The row's content feeds the projected + * message insert inside the same event transaction; the deleted row is what + * makes the table pending-only. + */ +export const projectDelivered = Effect.fn("SessionInbox.projectDelivered")(function* ( + db: DatabaseService, + input: PendingRef, +) { + const deleted = yield* db + .delete(SessionInboxTable) + .where(and(eq(SessionInboxTable.id, input.id), eq(SessionInboxTable.session_id, input.sessionID))) + .returning() + .get() + .pipe(Effect.orDie) + if (!deleted) return yield* Effect.die(new LifecycleConflict({ id: input.id })) + return fromRow(deleted) +}) + +export const projectCancelled = Effect.fn("SessionInbox.projectCancelled")(function* ( + db: DatabaseService, + input: PendingRef, +) { + const deleted = yield* db + .delete(SessionInboxTable) + .where( + and( + eq(SessionInboxTable.id, input.id), + eq(SessionInboxTable.session_id, input.sessionID), + or(eq(SessionInboxTable.delivery, "queue"), eq(SessionInboxTable.delivery, "steer")), + ), + ) + .returning({ id: SessionInboxTable.id }) + .get() + .pipe(Effect.orDie) + if (!deleted) return yield* Effect.die(new LifecycleConflict({ id: input.id })) +}) + +const projectDelivery = Effect.fn("SessionInbox.projectDelivery")(function* ( + db: DatabaseService, + input: PendingRef & { readonly from: Delivery; readonly to: Delivery }, +) { + const updated = yield* db + .update(SessionInboxTable) + .set({ delivery: input.to }) + .where( + and( + eq(SessionInboxTable.id, input.id), + eq(SessionInboxTable.session_id, input.sessionID), + eq(SessionInboxTable.delivery, input.from), + ), + ) + .returning({ id: SessionInboxTable.id }) + .get() + .pipe(Effect.orDie) + if (!updated) return yield* Effect.die(new LifecycleConflict({ id: input.id })) +}) + +export const projectDeliveryChanged = Effect.fn("SessionInbox.projectDeliveryChanged")( + (db: DatabaseService, input: PendingRef & { readonly delivery: Delivery }) => + projectDelivery(db, { + ...input, + from: input.delivery === "steer" ? "queue" : "steer", + to: input.delivery, + }), +) + +export const list = Effect.fn("SessionInbox.list")(function* (db: DatabaseService, sessionID: SessionSchema.ID) { + const rows = yield* db + .select() + .from(SessionInboxTable) + .where(eq(SessionInboxTable.session_id, sessionID)) + .orderBy(asc(SessionInboxTable.enqueued_seq)) + .all() + .pipe(Effect.orDie) + return rows.map(fromRow) +}) + +export const nextQueued = Effect.fn("SessionInbox.nextQueued")(function* ( + db: DatabaseService, + sessionID: SessionSchema.ID, +) { + const row = yield* db + .select() + .from(SessionInboxTable) + .where(and(eq(SessionInboxTable.session_id, sessionID), eq(SessionInboxTable.delivery, "queue"))) + .orderBy(asc(SessionInboxTable.enqueued_seq)) + .limit(1) + .get() + .pipe(Effect.orDie) + return row ? fromRow(row) : undefined +}) + +export const nextSteer = Effect.fn("SessionInbox.nextSteer")(function* ( + db: DatabaseService, + sessionID: SessionSchema.ID, +) { + const row = yield* db + .select() + .from(SessionInboxTable) + .where(and(eq(SessionInboxTable.session_id, sessionID), eq(SessionInboxTable.delivery, "steer"))) + .orderBy(asc(SessionInboxTable.enqueued_seq)) + .limit(1) + .get() + .pipe(Effect.orDie) + return row ? fromRow(row) : undefined +}) + +/** + * Which pending rows count: "any" counts every row, while "input" means any + * item in either delivery mode. + */ +export type Scope = "any" | "input" | Delivery + +export const has = Effect.fn("SessionInbox.has")(function* ( + db: DatabaseService, + sessionID: SessionSchema.ID, + scope: Scope, +) { + const row = yield* db + .select({ id: SessionInboxTable.id }) + .from(SessionInboxTable) + .where( + and( + eq(SessionInboxTable.session_id, sessionID), + scope === "any" + ? undefined + : scope === "input" + ? or(eq(SessionInboxTable.delivery, "steer"), eq(SessionInboxTable.delivery, "queue")) + : eq(SessionInboxTable.delivery, scope), + ), + ) + .limit(1) + .get() + .pipe(Effect.orDie) + return row !== undefined +}) + +export const equivalent = (input: Info, expected: { readonly sessionID: SessionSchema.ID; readonly item: Item }) => { + if ( + input.type !== expected.item.type || + input.delivery !== expected.item.delivery || + input.sessionID !== expected.sessionID + ) + return false + if (input.type === "user" && expected.item.type === "user") + return JSON.stringify(encodeUser(input.payload)) === JSON.stringify(encodeUser(expected.item.payload)) + if (input.type === "synthetic" && expected.item.type === "synthetic") + return JSON.stringify(encodeSynthetic(input.payload)) === JSON.stringify(encodeSynthetic(expected.item.payload)) + if (input.type === "compaction" && expected.item.type === "compaction") return true + if (input.type === "move" && expected.item.type === "move") + return JSON.stringify(encodeMove(input.payload)) === JSON.stringify(encodeMove(expected.item.payload)) + return false +} + +const publishMutation = (input: PendingRef, effect: Effect.Effect) => + serialized(input.sessionID, effect).pipe(Effect.asVoid) + +export const cancel = Effect.fn("SessionInbox.cancel")((bus: Bus.Interface, input: PendingRef) => + publishMutation( + input, + bus.publish(SessionEvent.InboxCancelled, { + sessionID: input.sessionID, + inboxID: input.id, + }), + ), +) + +export const steer = Effect.fn("SessionInbox.steer")((bus: Bus.Interface, input: PendingRef) => + publishMutation( + input, + bus.publish(SessionEvent.InboxDeliveryChanged, { + sessionID: input.sessionID, + inboxID: input.id, + delivery: "steer", + }), + ), +) + +export const queue = Effect.fn("SessionInbox.queue")((bus: Bus.Interface, input: PendingRef) => + publishMutation( + input, + bus.publish(SessionEvent.InboxDeliveryChanged, { + sessionID: input.sessionID, + inboxID: input.id, + delivery: "queue", + }), + ), +) + +const publish = Effect.fn("SessionInbox.publish")(function* ( + db: DatabaseService, + bus: Bus.Interface, + sessionID: SessionSchema.ID, + rows: ReadonlyArray, +) { + yield* Effect.forEach( + rows, + (row) => { + const entry = fromRow(row) + if (entry.type === "compaction") return Effect.die(new LifecycleConflict({ id: entry.id })) + return bus + .publish(SessionEvent.InboxDelivered, { + sessionID, + inboxID: entry.id, + }) + .pipe( + Effect.catchDefect((defect) => + defect instanceof LifecycleConflict + ? promotedFromMessage(db, sessionID, entry.id, entry.delivery).pipe( + Effect.flatMap((stored) => (stored !== undefined ? Effect.void : Effect.die(defect))), + ) + : Effect.die(defect), + ), + ) + }, + { discard: true }, + ) + return rows.length +}) + +/** + * Promotes pending input into visible messages and returns the promoted count. + * Steers always go first; only the "input" scope may fall through to one queued + * input, and it then collects steers that arrived during promotion. + */ +export const promote = Effect.fn("SessionInbox.promote")(function* ( + db: DatabaseService, + bus: Bus.Interface, + sessionID: SessionSchema.ID, + scope: Promotable, +) { + return yield* serialized( + sessionID, + Effect.gen(function* () { + const steers = yield* db + .select() + .from(SessionInboxTable) + .where(and(eq(SessionInboxTable.session_id, sessionID), eq(SessionInboxTable.delivery, "steer"))) + .orderBy(asc(SessionInboxTable.enqueued_seq)) + .all() + .pipe(Effect.orDie) + if (steers.length > 0 || scope === "steer") { + const control = steers.findIndex((row) => row.type === "compaction" || row.type === "move") + return yield* publish(db, bus, sessionID, control === -1 ? steers : steers.slice(0, control)) + } + + const queued = yield* db + .select() + .from(SessionInboxTable) + .where(and(eq(SessionInboxTable.session_id, sessionID), eq(SessionInboxTable.delivery, "queue"))) + .orderBy(asc(SessionInboxTable.enqueued_seq)) + .limit(1) + .get() + .pipe(Effect.orDie) + if (!queued) return 0 + const promoted = yield* publish(db, bus, sessionID, [queued]) + const arrivedSteers = yield* db + .select() + .from(SessionInboxTable) + .where(and(eq(SessionInboxTable.session_id, sessionID), eq(SessionInboxTable.delivery, "steer"))) + .orderBy(asc(SessionInboxTable.enqueued_seq)) + .all() + .pipe(Effect.orDie) + const control = arrivedSteers.findIndex((row) => row.type === "compaction" || row.type === "move") + return ( + promoted + + (yield* publish(db, bus, sessionID, control === -1 ? arrivedSteers : arrivedSteers.slice(0, control))) + ) + }), + ) +}) diff --git a/packages/core/src/session/message-updater.ts b/packages/core/src/session/message-updater.ts index 29617feb077..db2427fc6b4 100644 --- a/packages/core/src/session/message-updater.ts +++ b/packages/core/src/session/message-updater.ts @@ -109,11 +109,10 @@ export function update(adapter: Adapter, event: SessionEvent.DurableEvent) { "session.renamed": () => Effect.void, "session.deleted": () => Effect.void, "session.forked": () => Effect.void, - "session.input.promoted": () => Effect.void, - "session.input.admitted": () => Effect.void, - "session.input.cancelled": () => Effect.void, - "session.input.steered": () => Effect.void, - "session.input.queued": () => Effect.void, + "session.inbox.delivered": () => Effect.void, + "session.inbox.enqueued": () => Effect.void, + "session.inbox.cancelled": () => Effect.void, + "session.inbox.delivery.changed": () => Effect.void, "session.execution.started": () => Effect.void, "session.execution.succeeded": () => clearCurrentRetry, "session.execution.failed": () => clearCurrentRetry, @@ -380,7 +379,6 @@ export function update(adapter: Adapter, event: SessionEvent.DurableEvent) { } }) }, - "session.compaction.admitted": () => Effect.void, "session.compaction.started": (event) => adapter.appendMessage( SessionMessage.CompactionRunning.make({ diff --git a/packages/core/src/session/pending.ts b/packages/core/src/session/pending.ts deleted file mode 100644 index d491e13c2ad..00000000000 --- a/packages/core/src/session/pending.ts +++ /dev/null @@ -1,545 +0,0 @@ -export * as SessionPending from "./pending.js" - -import { and, asc, eq, or } from "drizzle-orm" -import { DateTime, Effect, Schema } from "effect" -import { - Compaction, - Delivery, - Info, - Message, - Synthetic, - SyntheticData, - User, - UserData, -} from "@opencode-ai/schema/session-pending" -import type { Database } from "../database/database.js" -import { Bus } from "../bus.js" -import { KeyedMutex } from "../effect/keyed-mutex.js" -import { SessionEvent } from "./event.js" -import { SessionMessage } from "./message.js" -import { SessionSchema } from "./schema.js" -import { SessionMessageTable, SessionPendingTable } from "./sql.js" - -type DatabaseService = Database.Interface["db"] - -export { Compaction, Delivery, Info, Message, Synthetic, SyntheticData, User, UserData } - -/** - * Which pending input `promote` may consume: "steer" promotes steers only (a step - * boundary mid-work), while "input" also allows one queued input when no steers are - * waiting (the idle boundary, where the Session picks up fresh work). - */ -export type Promotable = "input" | "steer" - -const decodeUser = Schema.decodeUnknownSync(UserData) -const encodeUser = Schema.encodeSync(UserData) -const decodeSynthetic = Schema.decodeUnknownSync(SyntheticData) -const encodeSynthetic = Schema.encodeSync(SyntheticData) -const decodeMessage = Schema.decodeUnknownSync(SessionMessage.Info) -const inboxLocks = KeyedMutex.makeUnsafe() -type PendingRef = { readonly id: SessionMessage.ID; readonly sessionID: SessionSchema.ID } - -export class LifecycleConflict extends Schema.TaggedErrorClass()( - "SessionPending.LifecycleConflict", - { - id: SessionMessage.ID, - }, -) {} - -const fromRow = (row: typeof SessionPendingTable.$inferSelect): Info => { - const base = { - id: SessionMessage.ID.make(row.id), - sessionID: SessionSchema.ID.make(row.session_id), - timeCreated: DateTime.makeUnsafe(row.time_created), - } - if (row.type === "compaction") return Compaction.make({ ...base, type: "compaction" }) - if (!row.delivery) throw new LifecycleConflict({ id: base.id }) - if (row.type === "user") - return User.make({ - ...base, - type: "user", - data: decodeUser(row.data), - delivery: row.delivery, - }) - if (row.type === "synthetic") - return Synthetic.make({ - ...base, - type: "synthetic", - data: decodeSynthetic(row.data), - delivery: row.delivery, - }) - throw new LifecycleConflict({ id: base.id }) -} - -export const find = Effect.fn("SessionPending.find")(function* (db: DatabaseService, id: SessionMessage.ID) { - const row = yield* db - .select() - .from(SessionPendingTable) - .where(eq(SessionPendingTable.id, id)) - .get() - .pipe(Effect.orDie) - return row === undefined ? undefined : fromRow(row) -}) - -export const compaction = Effect.fn("SessionPending.compaction")(function* ( - db: DatabaseService, - sessionID: SessionSchema.ID, -) { - const row = yield* db - .select() - .from(SessionPendingTable) - .where(and(eq(SessionPendingTable.session_id, sessionID), eq(SessionPendingTable.type, "compaction"))) - .orderBy(asc(SessionPendingTable.admitted_seq)) - .limit(1) - .get() - .pipe(Effect.orDie) - if (!row) return - const entry = fromRow(row) - return entry.type === "compaction" ? entry : undefined -}) - -const promotedFromMessage = Effect.fn("SessionPending.promotedFromMessage")(function* ( - db: DatabaseService, - sessionID: SessionSchema.ID, - id: SessionMessage.ID, - delivery: Delivery, -) { - const row = yield* db - .select() - .from(SessionMessageTable) - .where(eq(SessionMessageTable.id, id)) - .get() - .pipe(Effect.orDie) - if (row === undefined) return undefined - if (row.session_id !== sessionID || (row.type !== "user" && row.type !== "synthetic")) - return yield* Effect.die(new LifecycleConflict({ id })) - const message = decodeMessage({ ...row.data, id: row.id, type: row.type }) - const base = { id, sessionID, timeCreated: message.time.created, delivery } - if (message.type === "user") - return User.make({ - ...base, - type: "user", - data: decodeUser(message), - }) - if (message.type === "synthetic") - return Synthetic.make({ - ...base, - type: "synthetic", - data: decodeSynthetic(message), - }) - return yield* Effect.die(new LifecycleConflict({ id })) -}) - -export const admit = Effect.fn("SessionPending.admit")(function* ( - db: DatabaseService, - bus: Bus.Interface, - request: { - readonly id: SessionMessage.ID - readonly sessionID: SessionSchema.ID - readonly input: Message - }, -) { - const existing = yield* find(db, request.id) - if (existing !== undefined) { - if (existing.type === "compaction") return yield* Effect.die(new LifecycleConflict({ id: request.id })) - return existing - } - const promoted = yield* promotedFromMessage(db, request.sessionID, request.id, request.input.delivery) - if (promoted !== undefined) return promoted - return yield* bus - .publish(SessionEvent.InputAdmitted, { - inputID: request.id, - sessionID: request.sessionID, - input: request.input, - }) - .pipe( - Effect.flatMap((event) => { - const base = { - id: request.id, - sessionID: request.sessionID, - timeCreated: event.created, - } - return Effect.succeed( - request.input.type === "user" - ? User.make({ ...base, ...request.input }) - : Synthetic.make({ ...base, ...request.input }), - ) - }), - Effect.catchDefect((defect) => - find(db, request.id).pipe( - Effect.flatMap((stored) => - stored?.type === request.input.type ? Effect.succeed(stored) : Effect.die(defect), - ), - ), - ), - ) -}) - -export const admitCompaction = Effect.fn("SessionPending.admitCompaction")(function* ( - db: DatabaseService, - bus: Bus.Interface, - input: { readonly id: SessionMessage.ID; readonly sessionID: SessionSchema.ID }, -) { - return yield* inboxLocks.withLock(input.sessionID)( - Effect.gen(function* () { - const exact = yield* find(db, input.id) - if (exact) { - if (exact.type === "compaction" && exact.sessionID === input.sessionID) return exact - return yield* Effect.die(new LifecycleConflict({ id: input.id })) - } - const pending = yield* compaction(db, input.sessionID) - if (pending) return pending - return yield* bus - .publish(SessionEvent.Compaction.Admitted, { - inputID: input.id, - sessionID: input.sessionID, - }) - .pipe( - Effect.flatMap((event) => { - if (event.durable === undefined) - return Effect.die(new Error("Compaction admission event is missing aggregate sequence")) - return compaction(db, input.sessionID).pipe( - Effect.flatMap((stored) => - stored ? Effect.succeed(stored) : Effect.die(new LifecycleConflict({ id: input.id })), - ), - ) - }), - Effect.catchDefect((defect) => - compaction(db, input.sessionID).pipe( - Effect.flatMap((stored) => (stored ? Effect.succeed(stored) : Effect.die(defect))), - ), - ), - ) - }), - ) -}) - -export const projectAdmitted = Effect.fn("SessionPending.projectAdmitted")(function* ( - db: DatabaseService, - request: { - readonly admittedSeq: number - readonly id: SessionMessage.ID - readonly sessionID: SessionSchema.ID - readonly input: Message - readonly timeCreated: DateTime.Utc - }, -) { - const message = yield* db - .select({ id: SessionMessageTable.id }) - .from(SessionMessageTable) - .where(eq(SessionMessageTable.id, request.id)) - .get() - .pipe(Effect.orDie) - if (message !== undefined) return yield* Effect.die(new LifecycleConflict({ id: request.id })) - const stored = yield* db - .insert(SessionPendingTable) - .values({ - id: request.id, - session_id: request.sessionID, - type: request.input.type, - data: request.input.type === "user" ? encodeUser(request.input.data) : encodeSynthetic(request.input.data), - delivery: request.input.delivery, - admitted_seq: request.admittedSeq, - time_created: DateTime.toEpochMillis(request.timeCreated), - }) - .onConflictDoNothing() - .returning({ id: SessionPendingTable.id }) - .get() - .pipe(Effect.orDie) - if (!stored) return yield* Effect.die(new LifecycleConflict({ id: request.id })) -}) - -export const projectCompactionAdmitted = Effect.fn("SessionPending.projectCompactionAdmitted")(function* ( - db: DatabaseService, - input: { - readonly admittedSeq: number - readonly id: SessionMessage.ID - readonly sessionID: SessionSchema.ID - readonly timeCreated: DateTime.Utc - }, -) { - const message = yield* db - .select({ id: SessionMessageTable.id }) - .from(SessionMessageTable) - .where(eq(SessionMessageTable.id, input.id)) - .get() - .pipe(Effect.orDie) - if (message !== undefined) return yield* Effect.die(new LifecycleConflict({ id: input.id })) - const stored = yield* db - .insert(SessionPendingTable) - .values({ - id: input.id, - session_id: input.sessionID, - type: "compaction", - data: {}, - admitted_seq: input.admittedSeq, - time_created: DateTime.toEpochMillis(input.timeCreated), - }) - .onConflictDoNothing() - .returning() - .get() - .pipe(Effect.orDie) - if (stored) { - const entry = fromRow(stored) - return entry.type === "compaction" ? entry : yield* Effect.die(new LifecycleConflict({ id: entry.id })) - } - const pending = yield* compaction(db, input.sessionID) - if (pending) return pending - return yield* Effect.die(new LifecycleConflict({ id: input.id })) -}) - -/** - * Consume one pending row at promotion. The row's content feeds the projected - * message insert inside the same event transaction; the deleted row is what - * makes the table pending-only. - */ -export const projectPromoted = Effect.fn("SessionPending.projectPromoted")(function* ( - db: DatabaseService, - input: PendingRef, -) { - if (yield* compaction(db, input.sessionID)) return yield* Effect.die(new LifecycleConflict({ id: input.id })) - const deleted = yield* db - .delete(SessionPendingTable) - .where(and(eq(SessionPendingTable.id, input.id), eq(SessionPendingTable.session_id, input.sessionID))) - .returning() - .get() - .pipe(Effect.orDie) - if (!deleted) return yield* Effect.die(new LifecycleConflict({ id: input.id })) - const stored = fromRow(deleted) - if (stored.type === "compaction") return yield* Effect.die(new LifecycleConflict({ id: input.id })) - return stored -}) - -export const projectCancelled = Effect.fn("SessionPending.projectCancelled")(function* ( - db: DatabaseService, - input: PendingRef, -) { - const deleted = yield* db - .delete(SessionPendingTable) - .where( - and( - eq(SessionPendingTable.id, input.id), - eq(SessionPendingTable.session_id, input.sessionID), - or(eq(SessionPendingTable.delivery, "queue"), eq(SessionPendingTable.delivery, "steer")), - ), - ) - .returning({ id: SessionPendingTable.id }) - .get() - .pipe(Effect.orDie) - if (!deleted) return yield* Effect.die(new LifecycleConflict({ id: input.id })) -}) - -const projectDelivery = Effect.fn("SessionPending.projectDelivery")(function* ( - db: DatabaseService, - input: PendingRef & { readonly from: Delivery; readonly to: Delivery }, -) { - const updated = yield* db - .update(SessionPendingTable) - .set({ delivery: input.to }) - .where( - and( - eq(SessionPendingTable.id, input.id), - eq(SessionPendingTable.session_id, input.sessionID), - eq(SessionPendingTable.delivery, input.from), - ), - ) - .returning({ id: SessionPendingTable.id }) - .get() - .pipe(Effect.orDie) - if (!updated) return yield* Effect.die(new LifecycleConflict({ id: input.id })) -}) - -export const projectSteered = Effect.fn("SessionPending.projectSteered")((db: DatabaseService, input: PendingRef) => - projectDelivery(db, { ...input, from: "queue", to: "steer" }), -) - -export const projectQueued = Effect.fn("SessionPending.projectQueued")((db: DatabaseService, input: PendingRef) => - projectDelivery(db, { ...input, from: "steer", to: "queue" }), -) - -export const settleCompaction = Effect.fn("SessionPending.settleCompaction")(function* ( - db: DatabaseService, - input: { readonly sessionID: SessionSchema.ID }, -) { - const deleted = yield* db - .delete(SessionPendingTable) - .where(and(eq(SessionPendingTable.session_id, input.sessionID), eq(SessionPendingTable.type, "compaction"))) - .returning() - .get() - .pipe(Effect.orDie) - if (deleted) { - const stored = fromRow(deleted) - return stored.type === "compaction" ? stored : yield* Effect.die(new LifecycleConflict({ id: stored.id })) - } - return undefined -}) - -export const list = Effect.fn("SessionPending.list")(function* (db: DatabaseService, sessionID: SessionSchema.ID) { - const rows = yield* db - .select() - .from(SessionPendingTable) - .where(eq(SessionPendingTable.session_id, sessionID)) - .orderBy(asc(SessionPendingTable.admitted_seq)) - .all() - .pipe(Effect.orDie) - return rows.map(fromRow) -}) - -/** - * Which pending rows count: "any" counts every row including compaction, while - * delivery scopes are blocked behind a pending compaction barrier. "input" means - * any model-facing input, steered or queued. - */ -export type Scope = "any" | "input" | Delivery - -export const has = Effect.fn("SessionPending.has")(function* ( - db: DatabaseService, - sessionID: SessionSchema.ID, - scope: Scope, -) { - if (scope !== "any" && (yield* compaction(db, sessionID))) return false - const row = yield* db - .select({ id: SessionPendingTable.id }) - .from(SessionPendingTable) - .where( - and( - eq(SessionPendingTable.session_id, sessionID), - scope === "any" - ? undefined - : scope === "input" - ? or(eq(SessionPendingTable.delivery, "steer"), eq(SessionPendingTable.delivery, "queue")) - : eq(SessionPendingTable.delivery, scope), - ), - ) - .limit(1) - .get() - .pipe(Effect.orDie) - return row !== undefined -}) - -export const equivalent = ( - input: User | Synthetic, - expected: { readonly sessionID: SessionSchema.ID; readonly input: Message }, -) => { - if ( - input.type !== expected.input.type || - input.delivery !== expected.input.delivery || - input.sessionID !== expected.sessionID - ) - return false - if (input.type === "user" && expected.input.type === "user") - return JSON.stringify(encodeUser(input.data)) === JSON.stringify(encodeUser(expected.input.data)) - if (input.type === "synthetic" && expected.input.type === "synthetic") - return JSON.stringify(encodeSynthetic(input.data)) === JSON.stringify(encodeSynthetic(expected.input.data)) - return false -} - -const publishMutation = (input: PendingRef, effect: Effect.Effect) => - inboxLocks.withLock(input.sessionID)(effect).pipe(Effect.asVoid) - -export const cancel = Effect.fn("SessionPending.cancel")((bus: Bus.Interface, input: PendingRef) => - publishMutation( - input, - bus.publish(SessionEvent.InputCancelled, { - sessionID: input.sessionID, - inputID: input.id, - }), - ), -) - -export const steer = Effect.fn("SessionPending.steer")((bus: Bus.Interface, input: PendingRef) => - publishMutation( - input, - bus.publish(SessionEvent.InputSteered, { - sessionID: input.sessionID, - inputID: input.id, - }), - ), -) - -export const queue = Effect.fn("SessionPending.queue")((bus: Bus.Interface, input: PendingRef) => - publishMutation( - input, - bus.publish(SessionEvent.InputQueued, { - sessionID: input.sessionID, - inputID: input.id, - }), - ), -) - -const publish = Effect.fn("SessionPending.publish")(function* ( - db: DatabaseService, - bus: Bus.Interface, - sessionID: SessionSchema.ID, - rows: ReadonlyArray, -) { - if (yield* compaction(db, sessionID)) return 0 - yield* Effect.forEach( - rows, - (row) => { - const entry = fromRow(row) - if (entry.type === "compaction") return Effect.die(new LifecycleConflict({ id: entry.id })) - return bus - .publish(SessionEvent.InputPromoted, { - sessionID, - inputID: entry.id, - }) - .pipe( - Effect.catchDefect((defect) => - defect instanceof LifecycleConflict - ? promotedFromMessage(db, sessionID, entry.id, entry.delivery).pipe( - Effect.flatMap((stored) => (stored !== undefined ? Effect.void : Effect.die(defect))), - ) - : Effect.die(defect), - ), - ) - }, - { discard: true }, - ) - return rows.length -}) - -/** - * Promotes pending input into visible messages and returns the promoted count. - * Steers always go first; only the "input" scope may fall through to one queued - * input, and it then collects steers that arrived during promotion. - */ -export const promote = Effect.fn("SessionPending.promote")(function* ( - db: DatabaseService, - bus: Bus.Interface, - sessionID: SessionSchema.ID, - scope: Promotable, -) { - return yield* inboxLocks.withLock(sessionID)( - Effect.gen(function* () { - if (yield* compaction(db, sessionID)) return 0 - const steers = yield* db - .select() - .from(SessionPendingTable) - .where(and(eq(SessionPendingTable.session_id, sessionID), eq(SessionPendingTable.delivery, "steer"))) - .orderBy(asc(SessionPendingTable.admitted_seq)) - .all() - .pipe(Effect.orDie) - if (steers.length > 0 || scope === "steer") return yield* publish(db, bus, sessionID, steers) - - const queued = yield* db - .select() - .from(SessionPendingTable) - .where(and(eq(SessionPendingTable.session_id, sessionID), eq(SessionPendingTable.delivery, "queue"))) - .orderBy(asc(SessionPendingTable.admitted_seq)) - .limit(1) - .get() - .pipe(Effect.orDie) - if (!queued) return 0 - const promoted = yield* publish(db, bus, sessionID, [queued]) - const arrivedSteers = yield* db - .select() - .from(SessionPendingTable) - .where(and(eq(SessionPendingTable.session_id, sessionID), eq(SessionPendingTable.delivery, "steer"))) - .orderBy(asc(SessionPendingTable.admitted_seq)) - .all() - .pipe(Effect.orDie) - return promoted + (yield* publish(db, bus, sessionID, arrivedSteers)) - }), - ) -}) diff --git a/packages/core/src/session/projector.ts b/packages/core/src/session/projector.ts index dc9b25ad8bf..1393536df55 100644 --- a/packages/core/src/session/projector.ts +++ b/packages/core/src/session/projector.ts @@ -1,7 +1,8 @@ export * as SessionProjector from "./projector.js" -import { and, asc, desc, eq, gt, gte, lt, lte, sql } from "drizzle-orm" +import { and, asc, desc, eq, gt, gte, inArray, lt, lte, sql } from "drizzle-orm" import { DateTime, Effect, Layer, Schema, Stream } from "effect" +import path from "path" import { Database } from "../database/database.js" import { Bus } from "../bus.js" import { makeGlobalNode } from "@opencode-ai/util/effect/app-node" @@ -10,12 +11,15 @@ import { Model } from "../model.js" import { SessionEvent } from "./event.js" import { SessionMessage } from "./message.js" import { SessionMessageUpdater } from "./message-updater.js" -import { SessionPending } from "./pending.js" +import { SessionInbox } from "./inbox.js" import { Workspace } from "../workspace.js" import { InstructionState } from "./instruction-state.js" -import { SessionPendingTable, SessionMessageTable, SessionTable } from "./sql.js" +import { SessionInboxTable, SessionMessageTable, SessionTable } from "./sql.js" import { Slug } from "../util/slug.js" +import { FSUtil } from "@opencode-ai/util/fs-util" import { Money } from "@opencode-ai/schema/money" +import { Event } from "@opencode-ai/schema/project-directories" +import { Project } from "@opencode-ai/schema/project" import { AbsolutePath, RelativePath } from "../schema.js" import type { SessionSchema } from "./schema.js" @@ -435,6 +439,47 @@ const layer = Layer.effectDiscard( yield* InstructionState.reset(db, event.data.sessionID) }), ) + // Sessions whose ownership came from the directory's previous resolution + // follow its new identity. Location, transcript, instructions, and recency + // are untouched: the session did not move, its directory got identified. + yield* bus.project(Event.Resolved, (event) => + Effect.gen(function* () { + const stale = [event.data.previous, Project.ID.global].filter((id) => id !== event.data.projectID) + if (stale.length === 0) return + const rows = yield* db + .select({ id: SessionTable.id, directory: SessionTable.directory }) + .from(SessionTable) + .where( + and( + inArray(SessionTable.project_id, stale), + // Lexicographic range narrows the scan to prefix neighbors without + // LIKE escaping; FSUtil.contains below decides containment exactly. + gte(SessionTable.directory, event.data.directory), + lte(SessionTable.directory, AbsolutePath.make(event.data.directory + "\uffff")), + ), + ) + .all() + .pipe(Effect.orDie) + yield* Effect.forEach( + rows, + (row) => { + if (!FSUtil.contains(event.data.directory, row.directory)) return Effect.void + return db + .update(SessionTable) + .set({ + project_id: event.data.projectID, + path: RelativePath.make(path.relative(event.data.directory, row.directory).replaceAll("\\", "/")), + // Self-assignment suppresses the column's $onUpdate: adoption is not activity. + time_updated: sql`${SessionTable.time_updated}`, + }) + .where(eq(SessionTable.id, row.id)) + .run() + .pipe(Effect.orDie) + }, + { discard: true }, + ) + }), + ) yield* bus.project(SessionEvent.Deleted, (event) => db.delete(SessionTable).where(eq(SessionTable.id, event.data.sessionID)).run().pipe(Effect.orDie), ) @@ -470,14 +515,15 @@ const layer = Layer.effectDiscard( ) yield* bus.project(SessionEvent.UsageRecorded, (event) => applyUsage(db, event.data.sessionID, event.data)) yield* bus.project(SessionEvent.Forked, (event) => projectFork(db, event)) - yield* bus.project(SessionEvent.InputPromoted, (event) => + yield* bus.project(SessionEvent.InboxDelivered, (event) => Effect.gen(function* () { if (event.durable === undefined) return yield* Effect.die(new Error("Durable Session event is missing aggregate sequence")) - const input = yield* SessionPending.projectPromoted(db, { - id: event.data.inputID, + const input = yield* SessionInbox.projectDelivered(db, { + id: event.data.inboxID, sessionID: event.data.sessionID, }) + if (input.type === "compaction" || input.type === "move") return yield* insertMessage( db, event, @@ -485,33 +531,33 @@ const layer = Layer.effectDiscard( ? { id: input.id, type: "user", - metadata: input.data.metadata, - text: input.data.text, - files: input.data.files, - agents: input.data.agents, - skills: input.data.skills, + metadata: input.payload.metadata, + text: input.payload.text, + files: input.payload.files, + agents: input.payload.agents, + skills: input.payload.skills, time: { created: event.created }, } : { id: input.id, type: "synthetic", - text: input.data.text, - description: input.data.description, - metadata: input.data.metadata, + text: input.payload.text, + description: input.payload.description, + metadata: input.payload.metadata, time: { created: event.created }, }, ) }), ) - yield* bus.project(SessionEvent.InputAdmitted, (event) => + yield* bus.project(SessionEvent.InboxEnqueued, (event) => Effect.gen(function* () { if (event.durable === undefined) return yield* Effect.die(new Error("Durable Session event is missing aggregate sequence")) - yield* SessionPending.projectAdmitted(db, { - admittedSeq: event.durable.seq, - id: event.data.inputID, + yield* SessionInbox.projectAdmitted(db, { + enqueuedSeq: event.durable.seq, + id: event.data.inboxID, sessionID: event.data.sessionID, - input: event.data.input, + item: event.data.item, timeCreated: event.created, }) yield* db @@ -522,34 +568,17 @@ const layer = Layer.effectDiscard( .pipe(Effect.orDie) }), ) - yield* bus.project(SessionEvent.InputCancelled, (event) => - SessionPending.projectCancelled(db, { - id: event.data.inputID, + yield* bus.project(SessionEvent.InboxCancelled, (event) => + SessionInbox.projectCancelled(db, { + id: event.data.inboxID, sessionID: event.data.sessionID, }), ) - yield* bus.project(SessionEvent.InputSteered, (event) => - SessionPending.projectSteered(db, { - id: event.data.inputID, + yield* bus.project(SessionEvent.InboxDeliveryChanged, (event) => + SessionInbox.projectDeliveryChanged(db, { + id: event.data.inboxID, sessionID: event.data.sessionID, - }), - ) - yield* bus.project(SessionEvent.InputQueued, (event) => - SessionPending.projectQueued(db, { - id: event.data.inputID, - sessionID: event.data.sessionID, - }), - ) - yield* bus.project(SessionEvent.Compaction.Admitted, (event) => - Effect.gen(function* () { - if (event.durable === undefined) - return yield* Effect.die(new Error("Durable Session event is missing aggregate sequence")) - yield* SessionPending.projectCompactionAdmitted(db, { - admittedSeq: event.durable.seq, - id: event.data.inputID, - sessionID: event.data.sessionID, - timeCreated: event.created, - }) + delivery: event.data.delivery, }), ) yield* bus.project(SessionEvent.Execution.Succeeded, (event) => run(db, event)) @@ -596,8 +625,6 @@ const layer = Layer.effectDiscard( yield* InstructionState.advanceEpoch(db, event.data.sessionID, event.durable.seq) if (event.durable === undefined) return yield* Effect.die(new Error("Durable Session event is missing aggregate sequence")) - if (event.data.reason === "manual") - yield* SessionPending.settleCompaction(db, { sessionID: event.data.sessionID }) }), ) yield* bus.project(SessionEvent.Compaction.Failed, (event) => @@ -605,8 +632,6 @@ const layer = Layer.effectDiscard( yield* run(db, event) if (event.durable === undefined) return yield* Effect.die(new Error("Durable Session event is missing aggregate sequence")) - if (event.data.reason === "manual") - yield* SessionPending.settleCompaction(db, { sessionID: event.data.sessionID }) }), ) yield* bus.project(SessionEvent.RevertEvent.Staged, (event) => @@ -650,11 +675,11 @@ const layer = Layer.effectDiscard( .run() .pipe(Effect.orDie) yield* db - .delete(SessionPendingTable) + .delete(SessionInboxTable) .where( and( - eq(SessionPendingTable.session_id, event.data.sessionID), - gte(SessionPendingTable.admitted_seq, boundary.seq), + eq(SessionInboxTable.session_id, event.data.sessionID), + gte(SessionInboxTable.enqueued_seq, boundary.seq), ), ) .run() diff --git a/packages/core/src/session/runner/index.ts b/packages/core/src/session/runner/index.ts index 6922c287786..e744f9bb75c 100644 --- a/packages/core/src/session/runner/index.ts +++ b/packages/core/src/session/runner/index.ts @@ -16,13 +16,20 @@ export type RunError = | UserInterruptedError | Instructions.InitializationBlocked +export type Continuation = { readonly step: number } + +export type DrainResult = + | { readonly type: "complete" } + | { readonly type: "moved"; readonly continuation?: Continuation } + /** Runs one local continuation from already-recorded Session history. */ export interface Interface { - /** Drains eligible durable work. Explicit runs make one model call even when no work is eligible. */ + /** Drains eligible durable work, returning transient state when execution must continue at a new Location. */ readonly drain: (input: { readonly sessionID: SessionSchema.ID readonly force: boolean - }) => Effect.Effect + readonly continuation?: Continuation + }) => Effect.Effect } export class Service extends Context.Service()("@opencode/SessionRunner") {} diff --git a/packages/core/src/session/runner/llm.ts b/packages/core/src/session/runner/llm.ts index 6b5bfebead0..cc971dcd565 100644 --- a/packages/core/src/session/runner/llm.ts +++ b/packages/core/src/session/runner/llm.ts @@ -17,13 +17,13 @@ import { InstructionState } from "../instruction-state.js" import { SessionCompaction } from "../compaction.js" import { SessionContext } from "../context.js" import { SessionEvent } from "../event.js" -import { SessionPending } from "../pending.js" +import { SessionInbox } from "../inbox.js" import { SessionModelRequest } from "../model-request.js" import { SessionMessage } from "../message.js" import { SessionSchema } from "../schema.js" import { SessionStore } from "../store.js" import { SessionTitle } from "../title.js" -import { Service } from "./index.js" +import { Service, type Continuation } from "./index.js" import { createLLMEventPublisher, type StepRecord } from "./publish-llm-event.js" import { Snapshot } from "../../snapshot.js" import { makeLocationNode } from "@opencode-ai/util/effect/app-node" @@ -113,8 +113,8 @@ const layer = Layer.effect( const compaction = yield* SessionCompaction.Service const title = yield* SessionTitle.Service const toolOutput = yield* ToolOutput.Service - // Title generation is a side effect of a successful step; it must not delay continuation. - // The in-flight set coalesces overlapping steps while title presence records success durably. + // Title generation starts once input is visible and must not delay model execution. + // The in-flight set coalesces overlapping prompts while title presence records success durably. const titlesRunning = new Set() const forkTitle = yield* FiberSet.makeRuntime() /** @@ -124,29 +124,47 @@ const layer = Layer.effect( const drain = Effect.fn("SessionRunner.drain")(function* (input: { readonly sessionID: SessionSchema.ID readonly force: boolean + readonly continuation?: Continuation }) { - if (!input.force && !(yield* SessionPending.has(db, input.sessionID, "any"))) return + let force = input.force + let continuation = input.continuation + if (!force && !continuation && !(yield* SessionInbox.has(db, input.sessionID, "any"))) + return { type: "complete" as const } yield* settleStaleToolCalls(input.sessionID) - yield* runPendingCompaction(input.sessionID) - if (!input.force && !(yield* SessionPending.has(db, input.sessionID, "input"))) return - do { - yield* runSteps(input.sessionID) - } while (yield* SessionPending.has(db, input.sessionID, "input")) + while (true) { + if (yield* runPendingCompaction(input.sessionID)) { + force = false + continue + } + if (yield* runPendingMove(input.sessionID, "input")) return { type: "moved" as const } + if (!force && !continuation && !(yield* SessionInbox.has(db, input.sessionID, "input"))) + return { type: "complete" as const } + const result = yield* runSteps(input.sessionID, continuation) + if (result.type === "moved") return result + force = false + continuation = undefined + } }) /** * Runs logical steps until no tool result or newly admitted steer requires another * model call. Queued inputs remain pending until the current model work reaches idle. */ - const runSteps = Effect.fn("SessionRunner.runSteps")(function* (sessionID: SessionSchema.ID) { + const runSteps = Effect.fn("SessionRunner.runSteps")(function* ( + sessionID: SessionSchema.ID, + continuation?: Continuation, + ) { // Fresh work may promote queued input; later steps absorb steers only. - let promotable: SessionPending.Promotable = "input" - let step = 1 + let promotable: SessionInbox.Promotable = continuation ? "steer" : "input" + let step = continuation?.step ?? 1 + let next = continuation while (true) { + if (yield* runPendingCompaction(sessionID)) continue + if (yield* runPendingMove(sessionID, "steer")) return { type: "moved" as const, continuation: next } const result = yield* runStep(sessionID, promotable, step) - if (step === 1) yield* startTitle(sessionID) - yield* runPendingCompaction(sessionID) - if (!result.needsContinuation && !(yield* SessionPending.has(db, sessionID, "steer"))) return + next = result.needsContinuation ? { step: result.step + 1 } : undefined + if (!result.needsContinuation && !(yield* SessionInbox.has(db, sessionID, "steer"))) + return { type: "complete" as const } promotable = "steer" step = result.step + 1 } @@ -155,7 +173,7 @@ const layer = Layer.effect( /** Completes one logical model step, transparently retrying or rebuilding after compaction. */ const runStep = Effect.fnUntraced(function* ( sessionID: SessionSchema.ID, - promotable: SessionPending.Promotable, + promotable: SessionInbox.Promotable, step: number, ) { // Minting message identity before any attempt lets retries resume the same durable @@ -183,7 +201,7 @@ const layer = Layer.effect( .pipe(Effect.andThen(Effect.fail(failure.cause))), ), ) - let currentPromotable: SessionPending.Promotable | undefined = promotable + let currentPromotable: SessionInbox.Promotable | undefined = promotable let currentStep = step // Overflow recovery is one-shot: a call after recovery must not recover another overflow. let recoverOverflow = true @@ -226,7 +244,7 @@ const layer = Layer.effect( */ const callModel = Effect.fn("SessionRunner.callModel")(function* ( sessionID: SessionSchema.ID, - promotable: SessionPending.Promotable | undefined, + promotable: SessionInbox.Promotable | undefined, step: number, recoverOverflow: boolean, assistantMessageID: SessionMessage.ID, @@ -235,7 +253,8 @@ const layer = Layer.effect( // Establish what the model knows before admitting what the user said, so // a blocked first step leaves pending inputs untouched. yield* InstructionState.prepare(db, bus, selected.instructions, selected.session.id) - const promoted = promotable ? yield* SessionPending.promote(db, bus, selected.session.id, promotable) : 0 + const promoted = promotable ? yield* SessionInbox.promote(db, bus, selected.session.id, promotable) : 0 + if (promoted > 0) yield* startTitle(sessionID) // Promoted input opens a fresh step allowance. const currentStep = promoted > 0 ? 1 : step const loaded = yield* context.load(selected) @@ -245,7 +264,7 @@ const layer = Layer.effect( // Make room: history must fit the context window before the call. A pending manual // compaction owns this instead; the runner executes it between steps. const compactionInput = { session, messages: loaded.messages, model, ref: resolved.ref, cost: resolved.cost } - if (compaction.required(compactionInput) && !(yield* SessionPending.compaction(db, session.id))) { + if (compaction.required(compactionInput)) { const compacted = yield* compaction.compact(compactionInput) if (compacted.status === "completed") return CallOutcome.Restart({ step: currentStep, recoveredOverflow: false }) @@ -482,36 +501,75 @@ const layer = Layer.effect( const runPendingCompaction = Effect.fn("SessionRunner.runPendingCompaction")(function* ( sessionID: SessionSchema.ID, ) { - const pending = yield* SessionPending.compaction(db, sessionID) - if (!pending) return - const session = yield* getSession(sessionID) return yield* Effect.uninterruptibleMask((restore) => Effect.gen(function* () { + const pending = yield* SessionInbox.serialized( + sessionID, + Effect.gen(function* () { + const selected = + (yield* SessionInbox.nextSteer(db, sessionID)) ?? (yield* SessionInbox.nextQueued(db, sessionID)) + if (selected?.type !== "compaction") return + yield* bus.publishAll([ + [SessionEvent.InboxDelivered, { sessionID, inboxID: selected.id }], + [SessionEvent.Compaction.Started, { sessionID, reason: "manual", recent: "", inputID: selected.id }], + ]) + return selected + }), + ) + if (pending?.type !== "compaction") return false + const session = yield* getSession(sessionID) const compacted = yield* restore( Effect.gen(function* () { return yield* compaction.compactManual({ session, messages: yield* store.context(sessionID), inputID: pending.id, + started: true, }) }), ).pipe(Effect.exit) - if (Exit.isSuccess(compacted)) return - const unsettled = yield* SessionPending.compaction(db, sessionID) - if (unsettled) - yield* bus.publish(SessionEvent.Compaction.Failed, { - sessionID, - reason: "manual", - error: Cause.hasInterruptsOnly(compacted.cause) - ? { type: "aborted", message: "Compaction cancelled" } - : { type: "compaction.failed", message: Cause.pretty(compacted.cause) }, - inputID: unsettled.id, - }) + if (Exit.isSuccess(compacted)) return true + yield* bus.publish(SessionEvent.Compaction.Failed, { + sessionID, + reason: "manual", + error: Cause.hasInterruptsOnly(compacted.cause) + ? { type: "aborted", message: "Compaction cancelled" } + : { type: "compaction.failed", message: Cause.pretty(compacted.cause) }, + inputID: pending.id, + }) return yield* Effect.failCause(compacted.cause) }), ) }) + const runPendingMove = Effect.fn("SessionRunner.runPendingMove")(function* ( + sessionID: SessionSchema.ID, + promotable: SessionInbox.Promotable, + ) { + return yield* SessionInbox.serialized( + sessionID, + Effect.gen(function* () { + const pending = + (yield* SessionInbox.nextSteer(db, sessionID)) ?? + (promotable === "input" ? yield* SessionInbox.nextQueued(db, sessionID) : undefined) + if (pending?.type !== "move") return false + yield* bus.publishAll([ + [SessionEvent.InboxDelivered, { sessionID, inboxID: pending.id }], + [ + SessionEvent.Moved, + { + sessionID, + location: pending.payload.location, + projectID: pending.payload.projectID, + subpath: pending.payload.subpath, + }, + ], + ]) + return true + }), + ) + }) + /** Closes stale tool calls left active by an earlier interrupted drain. */ const settleStaleToolCalls = Effect.fn("SessionRunner.settleStaleToolCalls")(function* ( sessionID: SessionSchema.ID, diff --git a/packages/core/src/session/runner/retry.ts b/packages/core/src/session/runner/retry.ts index 35f0b06eadc..efc20044333 100644 --- a/packages/core/src/session/runner/retry.ts +++ b/packages/core/src/session/runner/retry.ts @@ -48,10 +48,12 @@ export const schedule = ( assistantMessageID: () => SessionMessage.ID, ) => Schedule.max([Schedule.exponential("2 seconds"), Schedule.recurs(4)]).pipe( + Schedule.jittered, Schedule.setInputType(), Schedule.modifyDelay(({ input: failure, duration: delay }) => { const minimum = retryAfter(failure) - return Effect.succeed(minimum === undefined ? delay : Duration.max(delay, Duration.millis(minimum))) + const duration = minimum === undefined ? delay : Duration.max(delay, Duration.millis(minimum)) + return Effect.succeed(Duration.millis(Math.ceil(Duration.toMillis(duration)))) }), Schedule.tap((metadata) => bus.publish(SessionEvent.RetryScheduled, { diff --git a/packages/core/src/session/runner/to-llm-message.ts b/packages/core/src/session/runner/to-llm-message.ts index ed9f558aeaf..967f56bedc3 100644 --- a/packages/core/src/session/runner/to-llm-message.ts +++ b/packages/core/src/session/runner/to-llm-message.ts @@ -1,5 +1,6 @@ import { Message, ToolCallPart, ToolResultPart, type ContentPart, type ProviderMetadata } from "@opencode-ai/ai" import { Option, Schema } from "effect" +import { fileURLToPath } from "url" import type { Model } from "../../model.js" import { SessionMessage } from "../message.js" import type { FileAttachment } from "@opencode-ai/schema/prompt" @@ -14,6 +15,17 @@ const media = (file: FileAttachment): ContentPart => ({ metadata: file.description === undefined ? undefined : { description: file.description }, }) +const attachmentLocation = (file: FileAttachment) => { + if (file.source.type !== "uri") return undefined + const url = URL.parse(file.source.uri) + if (url?.protocol !== "file:") return undefined + try { + return fileURLToPath(url) + } catch { + return undefined + } +} + const textAttachment = (file: FileAttachment): ContentPart => ({ type: "text", text: `\n\n${[ @@ -36,7 +48,7 @@ const textAttachment = (file: FileAttachment): ContentPart => ({ const directoryAttachment = (file: FileAttachment): ContentPart => ({ type: "text", text: `\n\n${[ - `Attached directory: ${file.name ?? (file.source.type === "uri" ? file.source.uri : "directory")}`, + `Attached directory: ${attachmentLocation(file) ?? file.name ?? (file.source.type === "uri" ? file.source.uri : "directory")}`, file.description === undefined ? undefined : `Description: ${file.description}`, file.data.length === 0 ? undefined : "", file.data.length === 0 ? undefined : Buffer.from(file.data, "base64").toString("utf8"), @@ -55,7 +67,10 @@ const directoryAttachment = (file: FileAttachment): ContentPart => ({ const attachmentContent = (file: FileAttachment): ContentPart[] => { if (file.mime === "text/plain") return [textAttachment(file)] if (file.mime === "application/x-directory") return [directoryAttachment(file)] - if (imageMimes.has(file.mime)) return [media(file)] + if (imageMimes.has(file.mime)) { + const location = attachmentLocation(file) + return [...(location === undefined ? [] : [Message.text(`Attached file: ${location}`)]), media(file)] + } return [] } diff --git a/packages/core/src/session/sql.ts b/packages/core/src/session/sql.ts index 8db29460e64..96ebc3feab4 100644 --- a/packages/core/src/session/sql.ts +++ b/packages/core/src/session/sql.ts @@ -3,7 +3,7 @@ import { sql } from "drizzle-orm" import { directoryColumn, pathColumn } from "../database/path.js" import { ProjectTable } from "../project/sql.js" import type { SessionMessage } from "./message.js" -import type { SessionPending } from "./pending.js" +import type { SessionInbox } from "./inbox.js" import type { FileDiff } from "@opencode-ai/schema/file-diff" import { PermissionV1 } from "../v1/permission.js" import { Project } from "../project.js" @@ -12,7 +12,7 @@ import { Workspace } from "../workspace.js" import { Timestamps } from "../database/schema.sql.js" import type { Instruction } from "@opencode-ai/schema/instruction" import type { Session } from "@opencode-ai/schema/session" -import type { SyntheticData, UserData } from "@opencode-ai/schema/session-pending" +import type { CompactionPayload, MovePayload, SyntheticPayload, UserPayload } from "@opencode-ai/schema/session-inbox" import type { RevertV1 } from "@opencode-ai/schema/session-revert" import type { Schema } from "effect" @@ -101,9 +101,9 @@ export const SessionPendingTable = sqliteTable( .$type() .notNull() .references(() => SessionTable.id, { onDelete: "cascade" }), - type: text().$type().notNull(), - data: text({ mode: "json" }).$type>().notNull(), - delivery: text().$type(), + type: text().$type().notNull(), + data: text({ mode: "json" }).$type>().notNull(), + delivery: text().$type(), admitted_seq: integer().notNull(), time_created: integer() .notNull() @@ -118,6 +118,28 @@ export const SessionPendingTable = sqliteTable( ], ) +export const SessionInboxTable = sqliteTable( + "session_inbox", + { + id: text().$type().primaryKey(), + session_id: text() + .$type() + .notNull() + .references(() => SessionTable.id, { onDelete: "cascade" }), + type: text().$type().notNull(), + payload: text({ mode: "json" }).$type().notNull(), + delivery: text().$type().notNull(), + enqueued_seq: integer().notNull(), + time_created: integer() + .notNull() + .$default(() => Date.now()), + }, + (table) => [ + index("session_inbox_session_delivery_seq_idx").on(table.session_id, table.delivery, table.enqueued_seq), + uniqueIndex("session_inbox_session_enqueued_seq_idx").on(table.session_id, table.enqueued_seq), + ], +) + export const InstructionEntryTable = sqliteTable( "instruction_entry", { diff --git a/packages/core/src/shell.ts b/packages/core/src/shell.ts index 38e8c1cc0db..d1733732be0 100644 --- a/packages/core/src/shell.ts +++ b/packages/core/src/shell.ts @@ -5,6 +5,7 @@ import { Context, Deferred, Duration, Effect, Fiber, Layer, Schema, Stream } fro import { ChildProcess } from "effect/unstable/process" import { produce } from "immer" import { Shell } from "@opencode-ai/schema/shell" +import { AppProcess } from "@opencode-ai/util/process" import { makeLocationNode } from "@opencode-ai/util/effect/app-node" import { Config } from "./config.js" import { Bus } from "./bus.js" @@ -50,7 +51,7 @@ export interface Interface { readonly create: ( input: Shell.CreateInput, before?: (input: ShellCreateBefore) => Effect.Effect, - ) => Effect.Effect + ) => Effect.Effect // Currently running commands only; exited shells are retained for get/output but excluded here. readonly list: () => Effect.Effect readonly get: (id: Shell.ID) => Effect.Effect @@ -215,19 +216,23 @@ export const layer = (options?: ShellSelect.Options) => // Spawn through the Environment and stream combined output to the file. The handle is scope-bound, so // the managing fiber keeps its scope open until the command terminates (it awaits `done` at the // end). `create` returns once `ready` resolves with the registered session. - const ready = Deferred.makeUnsafe() + const ready = Deferred.makeUnsafe() runFork( Effect.scoped( Effect.gen(function* () { - const handle = yield* environment.spawner.spawn( - ChildProcess.make(invocation.shell, args, { - cwd: invocation.cwd, - env: invocation.env, - stdin: "ignore", - detached: process.platform !== "win32", - forceKillAfter: Duration.seconds(3), - }), - ) + const handle = yield* environment.spawner + .spawn( + ChildProcess.make(invocation.shell, args, { + cwd: invocation.cwd, + env: invocation.env, + stdin: "ignore", + detached: process.platform !== "win32", + forceKillAfter: Duration.seconds(3), + }), + ) + .pipe( + Effect.mapError((cause) => new AppProcess.AppProcessError({ command: invocation.command, cause })), + ) const session: Active = { info: produce(info, (draft) => { draft.pid = handle.pid @@ -329,7 +334,7 @@ export const layer = (options?: ShellSelect.Options) => // release (kill) the process before its exit is observed. yield* Deferred.await(session.done).pipe(Effect.catch(() => Effect.void)) }), - ).pipe(Effect.catch(() => Effect.void)), + ).pipe(Effect.catchTag("AppProcessError", (error) => Deferred.fail(ready, error))), ) const session = yield* Deferred.await(ready) diff --git a/packages/core/src/shell/parser-wasm.workerd.ts b/packages/core/src/shell/parser-wasm.workerd.ts new file mode 100644 index 00000000000..394d517a042 --- /dev/null +++ b/packages/core/src/shell/parser-wasm.workerd.ts @@ -0,0 +1,4 @@ +// workerd has no filesystem paths to tree-sitter wasm artifacts. ShellParse +// loads these lazily and degrades when initialization fails, so empty paths +// keep module load side-effect free instead of resolving from disk. +export const shellParserWasm = { runtime: "", bash: "", powershell: "" } diff --git a/packages/core/src/tool.ts b/packages/core/src/tool.ts index 2d38ea7cecf..218580f52b7 100644 --- a/packages/core/src/tool.ts +++ b/packages/core/src/tool.ts @@ -2,7 +2,7 @@ export * as Tool from "./tool.js" export { CallID, Content, Error, FileContent, TextContent } from "@opencode-ai/schema/tool" export type { Context, Metadata, Options, Result } from "@opencode-ai/schema/tool" -import type { ToolCall, ToolDefinition } from "@opencode-ai/ai" +import { ToolDefinition, type ToolCall } from "@opencode-ai/ai" import { Tool } from "@opencode-ai/schema/tool" import { Context, Effect, Layer, Schema, Scope, Semaphore } from "effect" import { makeLocationNode } from "@opencode-ai/util/effect/app-node" @@ -165,6 +165,19 @@ const layer = Layer.effect( }), ) if (entries.length === 0) return + yield* Effect.forEach( + entries, + (entry) => + Effect.try({ + try: () => ToolDefinition.make(definition(entry.tool)), + catch: (error) => + new RegistrationError({ + name: entry.key, + message: `Invalid tool definition ${entry.key}: ${error instanceof Error ? error.message : String(error)}`, + }), + }), + { discard: true }, + ) yield* Effect.uninterruptible( lock.withPermit( Effect.gen(function* () { diff --git a/packages/core/src/util/process-lock-ffi.workerd.ts b/packages/core/src/util/process-lock-ffi.workerd.ts new file mode 100644 index 00000000000..1549ef42c72 --- /dev/null +++ b/packages/core/src/util/process-lock-ffi.workerd.ts @@ -0,0 +1,14 @@ +export type LockResult = + | { readonly acquired: true } + | { readonly acquired: false; readonly held: true } + | { readonly acquired: false; readonly held: false; readonly code: number } + +// workerd has no FFI and no cross-process file locking; a Durable Object is +// already single-threaded per instance, so nothing on this runtime should +// reach these. +const unavailable = (_fd: number): LockResult => { + throw new Error("Process locks are unavailable on the workerd runtime") +} + +export const lockDarwin = unavailable +export const lockLinux = unavailable diff --git a/packages/core/test/aisdk.test.ts b/packages/core/test/aisdk.test.ts index 9decce67b81..a7620759448 100644 --- a/packages/core/test/aisdk.test.ts +++ b/packages/core/test/aisdk.test.ts @@ -49,7 +49,9 @@ const client = LLMClient.layer.pipe( Layer.provide( Layer.succeed( RequestExecutor.Service, - RequestExecutor.Service.of({ execute: () => Effect.die("Unexpected HTTP request") }), + RequestExecutor.Service.of({ + execute: () => Effect.die("Unexpected HTTP request"), + }), ), ), ) @@ -542,7 +544,12 @@ it.effect("retries status-less AI SDK transport failures", () => isRetryable: true, }), ) - expect(error.reason).toMatchObject({ _tag: "Transport", kind: "AI_APICallError" }) + expect(error.reason).toMatchObject({ + _tag: "Transport", + transport: "http", + operation: "request", + code: "AI_APICallError", + }) expect(SessionRunnerRetry.isRetryable(error)).toBeTrue() expect("http" in error.reason ? error.reason.http?.request.url : undefined).toBe("https://api.example.com/chat") }), diff --git a/packages/core/test/bus.test.ts b/packages/core/test/bus.test.ts index f1f3997962e..7c679d184ce 100644 --- a/packages/core/test/bus.test.ts +++ b/packages/core/test/bus.test.ts @@ -455,6 +455,120 @@ describe("Bus", () => { }), ) + it.effect("publishes a durable batch atomically in provided order", () => + Effect.gen(function* () { + const bus = yield* Bus.Service + const { db } = yield* Database.Service + const aggregateID = Event.ID.create() + const observed = new Array() + yield* bus.project(SyncMessage, (event) => + Effect.sync(() => { + observed.push(`project:${event.data.text}`) + }), + ) + yield* bus.listen((event) => + event.type === SyncMessage.type + ? Effect.gen(function* () { + const text = (event.data as { readonly text: string }).text + const row = yield* db + .select({ seq: EventSequenceTable.seq }) + .from(EventSequenceTable) + .where(eq(EventSequenceTable.aggregate_id, aggregateID)) + .get() + .pipe(Effect.orDie) + observed.push(`notify:${text}:${row?.seq}`) + }) + : Effect.void, + ) + + const events = yield* bus.publishAll([ + [SyncMessage, { id: aggregateID, text: "first" }], + [SyncMessage, { id: aggregateID, text: "second" }], + ]) + + expect(events.map((event) => event.durable.seq)).toEqual([Event.Seq.make(0), Event.Seq.make(1)]) + expect(observed).toEqual(["project:first", "project:second", "notify:first:1", "notify:second:1"]) + expect( + (yield* db.select().from(EventTable).where(eq(EventTable.aggregate_id, aggregateID)).all()).map( + (row) => row.seq, + ), + ).toEqual([0, 1]) + }), + ) + + it.effect("rolls back every batch event when a projector fails", () => + Effect.gen(function* () { + const bus = yield* Bus.Service + const { db } = yield* Database.Service + const aggregateID = Event.ID.create() + const notifications = new Array() + yield* db.run("CREATE TABLE IF NOT EXISTS event_batch_probe (value text NOT NULL)") + yield* db.run("DELETE FROM event_batch_probe") + yield* bus.project(SyncMessage, (event) => + db + .run(`INSERT INTO event_batch_probe (value) VALUES ('${event.data.text}')`) + .pipe( + Effect.orDie, + Effect.andThen(event.data.text === "second" ? Effect.die("projector failed") : Effect.void), + ), + ) + yield* bus.listen((event) => + Effect.sync(() => { + notifications.push(event.type) + }), + ) + + const exit = yield* bus + .publishAll([ + [SyncMessage, { id: aggregateID, text: "first" }], + [SyncMessage, { id: aggregateID, text: "second" }], + ]) + .pipe(Effect.exit) + + expect(String(exit)).toContain("projector failed") + expect(yield* db.all("SELECT value FROM event_batch_probe")).toEqual([]) + expect(yield* db.select().from(EventTable).where(eq(EventTable.aggregate_id, aggregateID)).all()).toEqual([]) + expect( + yield* db.select().from(EventSequenceTable).where(eq(EventSequenceTable.aggregate_id, aggregateID)).all(), + ).toEqual([]) + expect(notifications).toEqual([]) + }), + ) + + it.effect("does not interleave a concurrent publish with batch notifications", () => + Effect.gen(function* () { + const bus = yield* Bus.Service + const aggregateID = Event.ID.create() + const firstObserved = yield* Deferred.make() + const continueNotifications = yield* Deferred.make() + const observed = new Array() + yield* bus.listen((event) => { + if (event.type !== SyncMessage.type) return Effect.void + const text = (event.data as { readonly text: string }).text + return Effect.sync(() => observed.push(text)).pipe( + Effect.andThen(text === "first" ? Deferred.succeed(firstObserved, undefined) : Effect.void), + Effect.andThen(text === "first" ? Deferred.await(continueNotifications) : Effect.void), + ) + }) + + const batch = yield* bus + .publishAll([ + [SyncMessage, { id: aggregateID, text: "first" }], + [SyncMessage, { id: aggregateID, text: "second" }], + ]) + .pipe(Effect.forkScoped) + yield* Deferred.await(firstObserved) + const single = yield* bus.publish(SyncMessage, { id: aggregateID, text: "third" }).pipe(Effect.forkScoped) + yield* Effect.yieldNow + + expect(observed).toEqual(["first"]) + yield* Deferred.succeed(continueNotifications, undefined) + yield* Fiber.join(batch) + yield* Fiber.join(single) + expect(observed).toEqual(["first", "second", "third"]) + }), + ) + it.effect("replays durable aggregate events after a sequence and tails new events", () => Effect.gen(function* () { const bus = yield* Bus.Service diff --git a/packages/core/test/environment.test.ts b/packages/core/test/environment.test.ts index 90246bd02be..94fbc04a188 100644 --- a/packages/core/test/environment.test.ts +++ b/packages/core/test/environment.test.ts @@ -1,9 +1,10 @@ import fs from "node:fs/promises" import { describe, expect } from "bun:test" import { Effect } from "effect" -import { ChildProcessSpawner } from "effect/unstable/process" +import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process" import { CrossSpawnSpawner } from "@opencode-ai/util/cross-spawn-spawner" import { LayerNode } from "@opencode-ai/util/effect/layer-node" +import { EnvironmentUnavailable } from "../src/environment/unavailable" import { execDefaults, Failed, @@ -35,6 +36,17 @@ describe("typeFollowing", () => { ) }) +describe("no execution plane", () => { + it.effect("fails spawn with a typed location error", () => + Effect.gen(function* () { + const error = yield* EnvironmentUnavailable.spawner.spawn(ChildProcess.make("echo", ["hello"])).pipe(Effect.flip) + + expect(error._tag).toBe("PlatformError") + expect(error.message).toContain("location has no execution plane") + }), + ) +}) + environmentConformance("memory environment", () => Effect.sync(() => { const driver = makeMemoryDriver() diff --git a/packages/core/test/file-mutation.test.ts b/packages/core/test/file-mutation.test.ts index 11e70c65294..7a7508d2f61 100644 --- a/packages/core/test/file-mutation.test.ts +++ b/packages/core/test/file-mutation.test.ts @@ -5,7 +5,7 @@ import { Deferred, Effect, Fiber, Layer } from "effect" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNode } from "@opencode-ai/util/effect/layer-node" import { FileMutation } from "@opencode-ai/core/file-mutation" -import { Environment } from "@opencode-ai/core/environment" +import { Environment } from "@opencode-ai/core/environment/index" import { Location } from "@opencode-ai/core/location" import { LocationMutation } from "@opencode-ai/core/location-mutation" import { AbsolutePath } from "@opencode-ai/core/schema" diff --git a/packages/core/test/fixture/durable-object-storage.ts b/packages/core/test/fixture/durable-object-storage.ts new file mode 100644 index 00000000000..00bf8f4a630 --- /dev/null +++ b/packages/core/test/fixture/durable-object-storage.ts @@ -0,0 +1,47 @@ +import { Database } from "bun:sqlite" +import type { DurableObjectStorage } from "@opencode-ai/core/database/sqlite.workerd" + +// Emulates the Durable Object storage API over bun:sqlite so the workerd +// adapter and the workerd server profile can be verified without workerd or +// Cloudflare runtime dependencies. The real runtime is covered by the +// workerd-spike package, which boots inside an actual isolate. +export const makeDurableObjectStorage = (): DurableObjectStorage => { + const native = new Database(":memory:") + const toSqlStorageValue = (value: unknown) => { + if (!(value instanceof Uint8Array)) return value as ArrayBuffer | string | number | null + const buffer = new ArrayBuffer(value.byteLength) + new Uint8Array(buffer).set(value) + return buffer + } + return { + sql: { + exec(query: string, ...bindings: Array) { + const statement = native.query(query) + const rows = (statement.values(...(bindings as never[])) ?? []).map((row) => row.map(toSqlStorageValue)) + const columnNames = statement.columnNames + return { + columnNames, + raw: () => rows[Symbol.iterator](), + toArray: () => rows.map((row) => Object.fromEntries(columnNames.map((name, i) => [name, row[i]]))), + } + }, + }, + transaction(closure: (txn: { rollback(): void }) => Promise): Promise { + native.run("BEGIN") + let rolledBack = false + return closure({ rollback: () => (rolledBack = true) }).then( + (result) => { + native.run(rolledBack ? "ROLLBACK" : "COMMIT") + return result + }, + (error) => { + native.run("ROLLBACK") + throw error + }, + ) + }, + transactionSync(closure: () => T): T { + return native.transaction(closure)() + }, + } +} diff --git a/packages/core/test/fixture/environment.ts b/packages/core/test/fixture/environment.ts index 1b77e7b0af4..d9a341a6265 100644 --- a/packages/core/test/fixture/environment.ts +++ b/packages/core/test/fixture/environment.ts @@ -1,7 +1,42 @@ import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" -import { Environment } from "@opencode-ai/core/environment" +import { Environment } from "@opencode-ai/core/environment/index" import { Location } from "@opencode-ai/core/location" +import { CrossSpawnSpawner } from "@opencode-ai/util/cross-spawn-spawner" +import { LayerNode } from "@opencode-ai/util/effect/layer-node" import { Effect, Layer } from "effect" +import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process" + +/** + * The host environment, without the workspace machinery: what a location with no `workspaceID` + * resolves to. + */ +export const hostEnvironmentLayer = Layer.effect( + Environment.Service, + Effect.gen(function* () { + const spawner = yield* ChildProcessSpawner.ChildProcessSpawner + const driver = Environment.makeLocalDriver(spawner) + return Environment.Service.of({ files: Environment.makeFiles(driver), spawner: driver.spawner }) + }), +).pipe(Layer.provide(LayerNode.compile(CrossSpawnSpawner.node))) + +/** + * The host environment with its spawner wrapped so a test can assert on every command that crosses + * the seam. Spawning still really happens, so the process under test behaves normally. + */ +export const recordingEnvironmentLayer = (spawns: Array) => + Layer.effect( + Environment.Service, + Effect.gen(function* () { + const environment = yield* Environment.Service + return Environment.Service.of({ + ...environment, + spawner: ChildProcessSpawner.make((command) => { + spawns.push(command) + return environment.spawner.spawn(command) + }), + }) + }), + ).pipe(Layer.provide(hostEnvironmentLayer)) export type EnvironmentFilesTransform = (files: Environment.Files) => Partial diff --git a/packages/core/test/instruction-discovery.test.ts b/packages/core/test/instruction-discovery.test.ts index 5c2706f2d1f..de5005a38c1 100644 --- a/packages/core/test/instruction-discovery.test.ts +++ b/packages/core/test/instruction-discovery.test.ts @@ -7,7 +7,7 @@ import { Bus } from "@opencode-ai/core/bus" import { ConfigInstructionPlugin } from "@opencode-ai/core/config/plugin/instruction" import { Watcher } from "@opencode-ai/core/filesystem/watcher" import { InstructionDiscovery } from "@opencode-ai/core/instruction-discovery" -import { Instructions } from "@opencode-ai/core/instructions" +import { Instructions } from "@opencode-ai/core/instructions/index" import { Location } from "@opencode-ai/core/location" import { AbsolutePath } from "@opencode-ai/core/schema" import { FSUtil } from "@opencode-ai/util/fs-util" diff --git a/packages/core/test/instruction-state.test.ts b/packages/core/test/instruction-state.test.ts index 36f9c61ef18..837d683b5cf 100644 --- a/packages/core/test/instruction-state.test.ts +++ b/packages/core/test/instruction-state.test.ts @@ -7,7 +7,7 @@ import { LayerNode } from "@opencode-ai/util/effect/layer-node" import { Bus } from "@opencode-ai/core/bus" import { Event } from "@opencode-ai/schema/event" import { EventTable } from "@opencode-ai/core/event/sql" -import { Instructions } from "@opencode-ai/core/instructions" +import { Instructions } from "@opencode-ai/core/instructions/index" import { Project } from "@opencode-ai/core/project" import { ProjectTable } from "@opencode-ai/core/project/sql" import { AbsolutePath } from "@opencode-ai/core/schema" diff --git a/packages/core/test/instructions/index.test.ts b/packages/core/test/instructions/index.test.ts index 1b74bd130cb..842c5bb536f 100644 --- a/packages/core/test/instructions/index.test.ts +++ b/packages/core/test/instructions/index.test.ts @@ -1,6 +1,6 @@ import { describe, expect } from "bun:test" import { Cause, Effect, Exit, Option, Schema } from "effect" -import { Instructions } from "@opencode-ai/core/instructions" +import { Instructions } from "@opencode-ai/core/instructions/index" import { it } from "../lib/effect" const key = (value: string) => Instructions.Key.make(value) diff --git a/packages/core/test/lib/environment-conformance.ts b/packages/core/test/lib/environment-conformance.ts index 0264aec011b..6d656690619 100644 --- a/packages/core/test/lib/environment-conformance.ts +++ b/packages/core/test/lib/environment-conformance.ts @@ -1,7 +1,6 @@ -import { describe, expect } from "bun:test" +import { describe, expect, test } from "bun:test" import { Effect } from "effect" -import { Failed, NotFound, WrongKind, type Files } from "../../src/environment/index" -import { it } from "./effect" +import { Failed, NotFound, WrongKind, type Files } from "@opencode-ai/core/environment/index" export interface EnvironmentHarness { readonly files: Files @@ -16,17 +15,21 @@ export const environmentConformance = ( skip = false, ) => { const check = (title: string, body: (harness: EnvironmentHarness) => Effect.Effect) => - it.live(title, () => - Effect.gen(function* () { - const harness = yield* Effect.acquireRelease(makeHarness(), (harness) => + test(title, () => + Effect.runPromise( + Effect.scoped( Effect.gen(function* () { - yield* Effect.ignore(harness.files.remove(harness.root)) - if (harness.dispose) yield* harness.dispose + const harness = yield* Effect.acquireRelease(makeHarness(), (harness) => + Effect.gen(function* () { + yield* Effect.ignore(harness.files.remove(harness.root)) + if (harness.dispose) yield* harness.dispose + }), + ) + yield* harness.files.mkdir(harness.root) + return yield* body(harness) }), - ) - yield* harness.files.mkdir(harness.root) - return yield* body(harness) - }), + ), + ), ) const bytes = (value: string) => new TextEncoder().encode(value) diff --git a/packages/core/test/lib/instructions.ts b/packages/core/test/lib/instructions.ts index e7a0f6b7236..7a129d41ebb 100644 --- a/packages/core/test/lib/instructions.ts +++ b/packages/core/test/lib/instructions.ts @@ -1,5 +1,5 @@ import { Effect, Option, Schema } from "effect" -import { Instructions } from "@opencode-ai/core/instructions" +import { Instructions } from "@opencode-ai/core/instructions/index" export interface State { readonly values: Readonly> diff --git a/packages/core/test/mcp.test.ts b/packages/core/test/mcp.test.ts index ed295f75e2d..cc879b8d388 100644 --- a/packages/core/test/mcp.test.ts +++ b/packages/core/test/mcp.test.ts @@ -22,19 +22,25 @@ import { Bus } from "@opencode-ai/core/bus" import { ID, type Payload } from "@opencode-ai/schema/event" import { Form } from "@opencode-ai/core/form" import { Integration } from "@opencode-ai/core/integration" +import { Environment } from "@opencode-ai/core/environment/index" +import { EnvironmentUnavailable } from "@opencode-ai/core/environment/unavailable" import { Location } from "@opencode-ai/core/location" import { MCP } from "@opencode-ai/core/mcp/index" import { MCPClient } from "@opencode-ai/core/mcp/client" +import { MCPStdio } from "@opencode-ai/core/mcp/stdio" import { Permission } from "@opencode-ai/core/permission" import { AbsolutePath } from "@opencode-ai/core/schema" import { Session } from "@opencode-ai/core/session" import { McpTool } from "@opencode-ai/core/tool/mcp" import { Tool } from "@opencode-ai/core/tool" -import { DateTime, Deferred, Effect, Exit, Fiber, Layer, PubSub, Schedule, Schema, Stream } from "effect" +import { DateTime, Deferred, Effect, Exit, Fiber, Layer, PubSub, Schedule, Schema, Sink, Stream } from "effect" +import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process" +import { ExitCode, makeHandle, ProcessId } from "effect/unstable/process/ChildProcessSpawner" import { Image } from "@opencode-ai/core/image" import { testEffect } from "./lib/effect" import { imagePassthrough } from "./lib/image" import { location } from "./fixture/location" +import { hostEnvironmentLayer, recordingEnvironmentLayer } from "./fixture/environment" import { executeTool, toolDefinitions, toolIdentity, waitForCodeModeTool, waitForTool } from "./lib/tool" let assertion: Deferred.Deferred | undefined @@ -167,6 +173,7 @@ function resourceMcpLayer( overrides?: { entries?: Config.Interface["entries"] subscribe?: Bus.Interface["subscribe"] + environment?: Layer.Layer }, ) { const directory = AbsolutePath.make(import.meta.dir) @@ -229,11 +236,15 @@ function resourceMcpLayer( }, }), Layer.mock(Credential.Service, {}), + overrides?.environment ?? hostEnvironmentLayer, ), ), ) } +const connect = (server: string, config: typeof ConfigMCP.Server.Type, directory: string) => + MCPClient.connect(server, config, directory).pipe(Effect.provide(hostEnvironmentLayer)) + const mcp = Layer.mock(MCP.Service, { tools: () => Effect.succeed([ @@ -248,6 +259,12 @@ const mcp = Layer.mock(MCP.Service, { required: ["ok"], }, }), + new MCP.Tool({ + server: MCP.ServerName.make("demo"), + name: "status", + description: "Status", + inputSchema: { type: "object", properties: {} }, + }), new MCP.Tool({ server: MCP.ServerName.make("direct"), name: "lookup", @@ -290,6 +307,13 @@ const mcp = Layer.mock(MCP.Service, { { type: "media", data: "aGVsbG8=", mimeType: "image/png" }, ], }) + if (input.name === "status") + return new MCP.ToolResult({ + server: MCP.ServerName.make(input.server), + tool: input.name, + isError: false, + content: [{ type: "text", text: "hello" }], + }) return new MCP.ToolResult({ server: MCP.ServerName.make(input.server), tool: input.name, @@ -394,7 +418,7 @@ test("retains output schemas across paginated MCP discovery", async () => { const tools = await Effect.runPromise( Effect.scoped( Effect.gen(function* () { - const connection = yield* MCPClient.connect( + const connection = yield* connect( "pagination", new ConfigMCP.Local({ type: "local", @@ -427,11 +451,160 @@ test("retains output schemas across paginated MCP discovery", async () => { ]) }) +test("spawns local MCP servers through the location environment", async () => { + const spawns: Array = [] + const cwd = path.join(import.meta.dir, "fixture") + const config = new ConfigMCP.Local({ + type: "local", + command: [process.execPath, path.join(import.meta.dir, "fixture/mcp-output-schema.ts")], + cwd: "fixture", + environment: { MCP_LOCATION_TEST: "configured" }, + }) + + await Effect.runPromise( + Effect.scoped( + Effect.gen(function* () { + const connection = yield* MCPClient.connect("environment", config, import.meta.dir) + yield* connection.tools() + }), + ).pipe(Effect.provide(recordingEnvironmentLayer(spawns))), + ) + + expect(spawns).toHaveLength(1) + const command = spawns[0] + if (!command || !ChildProcess.isStandardCommand(command)) throw new Error("Expected a standard process command") + expect(command.command).toBe(process.execPath) + expect(command.options.cwd).toBe(cwd) + expect(command.options.extendEnv).toBe(true) + expect(command.options.env).toEqual({ MCP_LOCATION_TEST: "configured" }) +}) + +test("reports a local MCP server as failed when the location has no execution plane", async () => { + const config = new ConfigMCP.Local({ type: "local", command: ["example-mcp"] }) + const driver = Environment.makeMemoryDriver() + const environment = Layer.succeed( + Environment.Service, + Environment.Service.of({ files: Environment.makeFiles(driver), spawner: EnvironmentUnavailable.spawner }), + ) + + await Effect.runPromise( + Effect.gen(function* () { + const service = yield* MCP.Service + yield* service.tools() + const status = (yield* service.servers()).find((server) => server.name === "resources")?.status + expect(status).toEqual({ + status: "failed", + error: expect.stringContaining("location has no execution plane"), + }) + }).pipe(Effect.provide(resourceMcpLayer(config, undefined, undefined, { environment }))), + ) +}) + +test("rejects sends before the stdio transport is started", async () => { + await Effect.runPromise( + Effect.scoped( + Effect.gen(function* () { + const transport = yield* MCPStdio.make({ + server: "not-started", + command: process.execPath, + args: [path.join(import.meta.dir, "fixture/mcp-output-schema.ts")], + cwd: import.meta.dir, + environment: {}, + }) + yield* Effect.tryPromise({ + try: () => transport.send({ jsonrpc: "2.0", method: "notifications/initialized" }), + catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))), + }).pipe( + Effect.flip, + Effect.tap((error) => Effect.sync(() => expect(error.message).toBe("Not connected"))), + ) + }).pipe(Effect.provide(hostEnvironmentLayer)), + ), + ) +}) + +test("joins concurrent stdio transport closes", async () => { + await Effect.runPromise( + Effect.scoped( + Effect.gen(function* () { + const transport = yield* MCPStdio.make({ + server: "concurrent-close", + command: "unused", + args: [], + cwd: import.meta.dir, + environment: {}, + }) + const first = transport.close() + expect(transport.close()).toBe(first) + yield* Effect.promise(() => first) + }).pipe(Effect.provide(hostEnvironmentLayer)), + ), + ) +}) + +test("closes a stdio process that finishes spawning after close", async () => { + const spawning = Deferred.makeUnsafe() + const release = Deferred.makeUnsafe() + const exited = Deferred.makeUnsafe() + const signals: Array = [] + const driver = Environment.makeMemoryDriver() + const environment = Layer.succeed( + Environment.Service, + Environment.Service.of({ + files: Environment.makeFiles(driver), + spawner: ChildProcessSpawner.make(() => + Effect.gen(function* () { + yield* Deferred.succeed(spawning, undefined) + yield* Deferred.await(release) + return makeHandle({ + pid: ProcessId(1), + exitCode: Deferred.await(exited), + isRunning: Deferred.isDone(exited).pipe(Effect.map((done) => !done)), + kill: (options) => + Effect.gen(function* () { + signals.push(options?.killSignal ?? "SIGTERM") + yield* Deferred.succeed(exited, ExitCode(143)) + }), + stdin: Sink.drain, + stdout: Stream.never, + stderr: Stream.empty, + all: Stream.never, + getInputFd: () => Sink.drain, + getOutputFd: () => Stream.empty, + unref: Effect.succeed(Effect.void), + }) + }), + ), + }), + ) + + await Effect.runPromise( + Effect.scoped( + Effect.gen(function* () { + const transport = yield* MCPStdio.make({ + server: "close-during-spawn", + command: "unused", + args: [], + cwd: import.meta.dir, + environment: {}, + }) + const start = transport.start() + yield* Deferred.await(spawning) + const close = transport.close() + yield* Deferred.succeed(release, undefined) + yield* Effect.promise(() => Promise.all([start, close])) + }).pipe(Effect.provide(environment)), + ), + ) + + expect(signals).toEqual(["SIGTERM"]) +}) + test("applies the configured MCP catalog timeout", async () => { const result = Effect.runPromise( Effect.scoped( Effect.gen(function* () { - const connection = yield* MCPClient.connect( + const connection = yield* connect( "catalog-timeout", new ConfigMCP.Local({ type: "local", @@ -453,7 +626,7 @@ test("applies the configured MCP execution timeout", async () => { const result = Effect.runPromise( Effect.scoped( Effect.gen(function* () { - const connection = yield* MCPClient.connect( + const connection = yield* connect( "execution-timeout", new ConfigMCP.Local({ type: "local", @@ -474,7 +647,7 @@ test("applies the configured MCP execution timeout to prompts", async () => { const result = Effect.runPromise( Effect.scoped( Effect.gen(function* () { - const connection = yield* MCPClient.connect( + const connection = yield* connect( "prompt-timeout", new ConfigMCP.Local({ type: "local", @@ -495,7 +668,7 @@ test("applies configured MCP timeouts to resource operations", async () => { const catalog = Effect.runPromise( Effect.scoped( Effect.gen(function* () { - const connection = yield* MCPClient.connect( + const connection = yield* connect( "resource-catalog-timeout", new ConfigMCP.Local({ type: "local", @@ -514,7 +687,7 @@ test("applies configured MCP timeouts to resource operations", async () => { const read = Effect.runPromise( Effect.scoped( Effect.gen(function* () { - const connection = yield* MCPClient.connect( + const connection = yield* connect( "resource-read-timeout", new ConfigMCP.Local({ type: "local", @@ -549,7 +722,7 @@ test("lists, reads, and reports MCP resource changes", async () => { }, "templates-2": { items: [{ name: "Issue", uriTemplate: "issue://{id}", description: "Issue" }] }, } - const connection = yield* MCPClient.connect( + const connection = yield* connect( "resources", new ConfigMCP.Remote({ type: "remote", url: server.url, oauth: false }), import.meta.dir, @@ -620,7 +793,7 @@ test("skips MCP resource requests when the capability is absent", async () => { Effect.scoped( Effect.gen(function* () { const server = yield* resourceServer({ resources: false }) - const connection = yield* MCPClient.connect( + const connection = yield* connect( "resources", new ConfigMCP.Remote({ type: "remote", url: server.url, oauth: false }), import.meta.dir, @@ -984,6 +1157,31 @@ it.effect("advertises MCP output schemas to Code Mode", () => }), ) +it.effect("returns content-only MCP results through Code Mode", () => + Effect.gen(function* () { + assertion = yield* Deferred.make() + decision = Effect.void + const registry = yield* Tool.Service + const toolSet = yield* waitForCodeModeTool(registry, "demo.status") + + const execution = yield* toolSet.execute({ + sessionID: Session.ID.make("ses_mcp_content_only"), + ...toolIdentity, + call: { + type: "tool-call", + id: "call_mcp_content_only", + name: "execute", + input: { code: "return await tools.demo.status({})" }, + }, + }) + + expect(execution).toMatchObject({ + output: { output: "hello", toolCalls: [{ tool: "demo.status", status: "completed" }] }, + content: [{ type: "text", text: "hello" }], + }) + }), +) + it.effect("advertises MCP tools directly when Code Mode is disabled for the server", () => Effect.gen(function* () { const registry = yield* Tool.Service diff --git a/packages/core/test/plugin/promise.test.ts b/packages/core/test/plugin/promise.test.ts index e5551e4340b..f003eef20e2 100644 --- a/packages/core/test/plugin/promise.test.ts +++ b/packages/core/test/plugin/promise.test.ts @@ -11,7 +11,7 @@ import { PluginPromise } from "@opencode-ai/core/plugin/promise" import { WebSearch } from "@opencode-ai/core/websearch" import { Session } from "@opencode-ai/core/session" import { SessionMessage } from "@opencode-ai/core/session/message" -import { SessionPending } from "@opencode-ai/core/session/pending" +import { SessionInbox } from "@opencode-ai/core/session/inbox" import { Tool } from "@opencode-ai/core/tool" import { Provider } from "@opencode-ai/core/provider" import { define } from "@opencode-ai/plugin/promise/plugin" @@ -61,12 +61,12 @@ describe("fromPromise", () => { synthetic: (value) => { seen = value return Effect.succeed( - SessionPending.Synthetic.make({ + SessionInbox.Synthetic.make({ id: SessionMessage.ID.make(input.id), sessionID: Session.ID.make(input.sessionID), timeCreated: DateTime.makeUnsafe(0), type: "synthetic", - data: { + payload: { text: input.text, metadata: input.metadata, }, @@ -393,4 +393,45 @@ describe("fromPromise", () => { expect(progress).toEqual([{ phase: "greeting" }]) }), ) + + it.effect("returns content-only plugin results through Code Mode", () => + Effect.gen(function* () { + const plugins = yield* Plugin.Service + const registry = yield* Tool.Service + const host = yield* PluginHost.make(plugins) + const promisePlugin = define({ + id: "content-only-tool", + setup: async (ctx) => { + await ctx.tool.transform((tools) => { + tools.add({ + name: "demo_status", + description: "Returns a status string", + input: Schema.Struct({}), + execute: async () => ({ content: [{ type: "text", text: "hello" }] }), + options: { codemode: true }, + }) + }) + }, + }) + + yield* PluginPromise.fromPromise(promisePlugin).effect(host) + + const toolSet = yield* registry.snapshot() + const throughCodeMode = yield* toolSet.execute({ + sessionID: Session.ID.make("ses_content_only_tool"), + agent: Agent.ID.make("build"), + messageID: SessionMessage.ID.make("msg_content_only_tool"), + call: { + type: "tool-call", + id: "call_content_only_tool", + name: "execute", + input: { code: "return await tools.demo_status({})" }, + }, + }) + expect(throughCodeMode).toMatchObject({ + output: { output: "hello", toolCalls: [{ tool: "demo_status", status: "completed" }] }, + content: [{ type: "text", text: "hello" }], + }) + }), + ) }) diff --git a/packages/core/test/plugin/provider-github-copilot.test.ts b/packages/core/test/plugin/provider-github-copilot.test.ts index a64ab29b34f..6088965aa38 100644 --- a/packages/core/test/plugin/provider-github-copilot.test.ts +++ b/packages/core/test/plugin/provider-github-copilot.test.ts @@ -195,6 +195,22 @@ describe("GithubCopilotPlugin", () => { }), ) + it.effect("rewrites models.dev fallback models to the GitHub Copilot package", () => + Effect.gen(function* () { + const catalog = yield* Catalog.Service + yield* catalog.transform((catalog) => { + catalog.provider.update(Provider.ID.githubCopilot, () => {}) + catalog.model.update(Provider.ID.githubCopilot, Model.ID.make("gpt-5.6-sol"), (model) => { + model.package = "@ai-sdk/openai-compatible" + }) + }) + yield* addPlugin() + expect(required(yield* catalog.model.get(Provider.ID.githubCopilot, Model.ID.make("gpt-5.6-sol"))).package).toBe( + "@ai-sdk/github-copilot", + ) + }), + ) + it.effect("selects languageModel when responses and chat are absent", () => Effect.gen(function* () { const plugin = yield* Plugin.Service diff --git a/packages/core/test/plugin/system-prompt.test.ts b/packages/core/test/plugin/system-prompt.test.ts index 78e98b575f1..c3246752919 100644 --- a/packages/core/test/plugin/system-prompt.test.ts +++ b/packages/core/test/plugin/system-prompt.test.ts @@ -90,6 +90,36 @@ describe("SystemPromptPlugin", () => { }), ) + it.effect("selects the Meta prompt for Muse family model IDs", () => + Effect.gen(function* () { + const hooks = yield* PluginHooks.Service + const pluginHost = yield* makeHost + yield* SystemPromptPlugin.MetaPlugin.effect(pluginHost) + + yield* Effect.forEach( + [ + ["meta/muse-spark-preview", "Muse Spark"], + ["muse-spark-1.2", "Muse Spark"], + ["meta/muse-glimmer-30b", "Muse Glimmer"], + ["muse-glimmer-30b", "Muse Glimmer"], + ] as const, + ([id, name]) => { + const event = context(id) + return hooks.trigger("session", "context", event).pipe( + Effect.tap(() => + Effect.sync(() => { + expect(event.system[0]?.text).toContain(`powered by ${name},`) + expect(event.system[0]?.text).toContain(`using Meta ${name}.`) + expect(event.system[0]?.text).not.toContain("{{MODEL_NAME}}") + }), + ), + ) + }, + { discard: true }, + ) + }), + ) + it.effect("preserves an explicit agent system prompt", () => Effect.gen(function* () { const agents = yield* Agent.Service diff --git a/packages/core/test/session-compact.test.ts b/packages/core/test/session-compact.test.ts index e21e28c0e39..8f8da70b219 100644 --- a/packages/core/test/session-compact.test.ts +++ b/packages/core/test/session-compact.test.ts @@ -15,7 +15,6 @@ import { AbsolutePath } from "@opencode-ai/core/schema" import { Session } from "@opencode-ai/core/session" import { SessionCompaction } from "@opencode-ai/core/session/compaction" import { SessionEvent } from "@opencode-ai/core/session/event" -import { SessionPending } from "@opencode-ai/core/session/pending" import { SessionMessage } from "@opencode-ai/core/session/message" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionExecution } from "@opencode-ai/core/session/execution" @@ -81,7 +80,7 @@ const it = testEffect( ) describe("Session.compact", () => { - it.effect("durably admits and coalesces manual compaction", () => + it.effect("durably stacks manual compaction", () => Effect.gen(function* () { requests = [] const session = yield* Session.Service @@ -89,18 +88,18 @@ describe("Session.compact", () => { const created = yield* session.create({ location }) const messageID = SessionMessage.ID.create() - yield* bus.publish(SessionEvent.InputAdmitted, { + yield* bus.publish(SessionEvent.InboxEnqueued, { sessionID: created.id, - inputID: messageID, - input: { + inboxID: messageID, + item: { type: "user", - data: { text: "Please compact this session history." }, + payload: { text: "Please compact this session history." }, delivery: "steer", }, }) - yield* bus.publish(SessionEvent.InputPromoted, { + yield* bus.publish(SessionEvent.InboxDelivered, { sessionID: created.id, - inputID: messageID, + inboxID: messageID, }) expect(yield* session.compact({ id: messageID, sessionID: created.id }).pipe(Effect.flip)).toMatchObject({ @@ -110,12 +109,17 @@ describe("Session.compact", () => { const first = yield* session.compact({ sessionID: created.id }) const second = yield* session.compact({ sessionID: created.id }) - expect(second.id).toBe(first.id) + expect(second.id).not.toBe(first.id) expect(requests).toHaveLength(0) - expect(yield* SessionPending.compaction((yield* Database.Service).db, created.id)).toMatchObject({ - id: first.id, - }) + expect(yield* session.inbox(created.id)).toEqual([ + expect.objectContaining({ id: first.id, type: "compaction", delivery: "queue" }), + expect.objectContaining({ id: second.id, type: "compaction", delivery: "queue" }), + ]) expect((yield* session.context(created.id)).find((message) => message.id === first.id)).toBeUndefined() + + const steered = yield* session.create({ location }) + const steer = yield* session.compact({ sessionID: steered.id, delivery: "steer" }) + expect(steer).toMatchObject({ type: "compaction", delivery: "steer" }) }), ) }) diff --git a/packages/core/test/session-create.test.ts b/packages/core/test/session-create.test.ts index e365ab1fa0c..57ebf17d0e2 100644 --- a/packages/core/test/session-create.test.ts +++ b/packages/core/test/session-create.test.ts @@ -1,4 +1,6 @@ import { describe, expect } from "bun:test" +import { $ } from "bun" +import fs from "fs/promises" import path from "path" import { DateTime, Effect, Layer, Stream } from "effect" import { Money } from "@opencode-ai/schema/money" @@ -7,6 +9,7 @@ import { asc, eq } from "drizzle-orm" import { Database } from "@opencode-ai/core/database/database" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNode } from "@opencode-ai/util/effect/layer-node" +import { Hash } from "@opencode-ai/util/hash" import { Bus } from "@opencode-ai/core/bus" import { EventTable } from "@opencode-ai/core/event/sql" import { Location } from "@opencode-ai/core/location" @@ -19,7 +22,7 @@ import { Session } from "@opencode-ai/core/session" import { SessionMessage } from "@opencode-ai/core/session/message" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionExecution } from "@opencode-ai/core/session/execution" -import { SessionPending } from "@opencode-ai/core/session/pending" +import { SessionInbox } from "@opencode-ai/core/session/inbox" import { SessionEvent } from "@opencode-ai/core/session/event" import { SessionTable } from "@opencode-ai/core/session/sql" import { SessionStore } from "@opencode-ai/core/session/store" @@ -53,6 +56,15 @@ const it = testEffect( ], ), ) +const liveIt = testEffect( + AppNodeBuilder.build( + LayerNode.group([Database.node, Bus.node, Project.node, SessionProjector.node, SessionStore.node, Session.node]), + [ + [Bus.node, Bus.configured({ persist: true })], + [SessionExecution.node, SessionExecution.noopLayer], + ], + ), +) const location = Location.Ref.make({ directory: AbsolutePath.make("/project") }) const id = Session.ID.create() @@ -78,6 +90,65 @@ function withTmp(f: (directory: string) => Effect.Effect) { } describe("Session.create", () => { + liveIt.live("follows the directory's project identity established after creation", () => + withTmp((directory) => + Effect.gen(function* () { + const session = yield* Session.Service + const projects = yield* Project.Service + const { db } = yield* Database.Service + const ref = Location.Ref.make({ directory: AbsolutePath.make(directory) }) + const nested = Location.Ref.make({ directory: AbsolutePath.make(path.join(directory, "packages", "app")) }) + const created = yield* session.create({ location: ref, title: "Before git" }) + const child = yield* session.create({ location: nested, title: "Nested before git" }) + const originalUpdated = created.time.updated + + yield* Effect.promise(async () => { + await $`git init -q`.cwd(directory) + await $`git config user.email test@example.com`.cwd(directory) + await $`git config user.name Test`.cwd(directory) + await fs.writeFile(path.join(directory, "README.md"), "test\n") + await $`git add README.md`.cwd(directory) + await $`git commit -qm initial`.cwd(directory) + await $`git remote add origin git@github.com:owner/adopted.git`.cwd(directory) + }) + + const project = yield* projects.resolve(ref.directory) + const repeat = yield* projects.resolve(ref.directory) + const adopted = yield* session.get(created.id) + const nestedAdopted = yield* session.get(child.id) + const page = yield* session.list({ project: project.id }) + const log = Array.from(yield* Stream.runCollect(logEvents(session, created.id))) + + expect(created.projectID).toBe(Project.ID.global) + expect(project.id).toBe(Project.ID.make(Hash.fast("git-remote:github.com/owner/adopted"))) + expect(repeat.id).toBe(project.id) + expect(page.data.map((item) => item.id)).toEqual(expect.arrayContaining([created.id, child.id])) + expect(adopted).toMatchObject({ + projectID: project.id, + location: ref, + subpath: undefined, + time: { updated: originalUpdated }, + }) + expect(nestedAdopted).toMatchObject({ + projectID: project.id, + location: nested, + subpath: RelativePath.make("packages/app"), + }) + // Adoption is a project-domain fact; the session log records nothing new. + expect(log.map((event) => event.type)).toEqual(["session.created"]) + expect(yield* session.messages({ sessionID: created.id })).toEqual([]) + // Repeated resolution announces the directory's identity exactly once. + const announced = yield* db + .select({ type: EventTable.type }) + .from(EventTable) + .where(eq(EventTable.aggregate_id, project.id)) + .all() + .pipe(Effect.orDie) + expect(announced.map((event) => event.type)).toEqual(["project.directory.resolved.1"]) + }), + ), + ) + it.effect("persists a missing title until one is generated or supplied", () => Effect.gen(function* () { const session = yield* Session.Service @@ -267,9 +338,9 @@ describe("Session.create", () => { text: "First", resume: false, }) - yield* SessionPending.promote(db, bus, parent.id, "steer") + yield* SessionInbox.promote(db, bus, parent.id, "steer") yield* session.synthetic({ sessionID: parent.id, text: "parent note", resume: false }) - yield* SessionPending.promote(db, bus, parent.id, "steer") + yield* SessionInbox.promote(db, bus, parent.id, "steer") const forked = yield* session.fork({ sessionID: parent.id, boundary: { type: "through" } }) const parentContext = yield* session.context(parent.id) @@ -289,24 +360,24 @@ describe("Session.create", () => { durable: { seq: 0 }, data: { sessionID: forked.id, parentID: parent.id }, }) - expect(yield* SessionPending.find(db, forkContext[0].id)).toBeUndefined() - expect(yield* SessionPending.find(db, forkContext[1].id)).toBeUndefined() + expect(yield* SessionInbox.find(db, forkContext[0].id)).toBeUndefined() + expect(yield* SessionInbox.find(db, forkContext[1].id)).toBeUndefined() expect( yield* session.prompt({ id: forkContext[0].id, sessionID: forked.id, text: "First", resume: false }), - ).toMatchObject({ id: forkContext[0].id, type: "user", data: { text: "First" } }) + ).toMatchObject({ id: forkContext[0].id, type: "user", payload: { text: "First" } }) yield* session.prompt({ sessionID: parent.id, text: "Parent changed", resume: false, }) - yield* SessionPending.promote(db, bus, parent.id, "steer") + yield* SessionInbox.promote(db, bus, parent.id, "steer") yield* session.prompt({ sessionID: forked.id, text: "Child continues", resume: false, }) - yield* SessionPending.promote(db, bus, forked.id, "steer") + yield* SessionInbox.promote(db, bus, forked.id, "steer") expect((yield* session.context(parent.id)).map((message) => message.type)).toEqual(["user", "synthetic", "user"]) expect((yield* session.context(forked.id)).map((message) => message.type)).toEqual(["user", "synthetic", "user"]) @@ -316,7 +387,7 @@ describe("Session.create", () => { (event): number | undefined => event.durable?.seq, ), ).toEqual([0, 5, 6]) - expect(yield* SessionPending.find(db, admitted.id)).toBeUndefined() + expect(yield* SessionInbox.find(db, admitted.id)).toBeUndefined() }), ) @@ -327,7 +398,7 @@ describe("Session.create", () => { const { db } = yield* Database.Service const parent = yield* session.create({ location }) yield* session.prompt({ sessionID: parent.id, text: "First", resume: false }) - yield* SessionPending.promote(db, bus, parent.id, "steer") + yield* SessionInbox.promote(db, bus, parent.id, "steer") const forked = yield* session.fork({ sessionID: parent.id, boundary: { type: "through" } }) const row = yield* db.select().from(SessionTable).where(eq(SessionTable.id, forked.id)).get().pipe(Effect.orDie) @@ -359,13 +430,13 @@ describe("Session.create", () => { text: "First", resume: false, }) - yield* SessionPending.promote(db, bus, parent.id, "steer") + yield* SessionInbox.promote(db, bus, parent.id, "steer") const second = yield* session.prompt({ sessionID: parent.id, text: "Second", resume: false, }) - yield* SessionPending.promote(db, bus, parent.id, "steer") + yield* SessionInbox.promote(db, bus, parent.id, "steer") const assistantMessageID = SessionMessage.ID.create() const model = Model.Ref.make({ id: Model.ID.make("model"), providerID: Provider.ID.make("provider") }) yield* bus.publish(SessionEvent.Step.Started, { @@ -496,7 +567,7 @@ describe("Session.create", () => { text: "Hello", resume: false, }) - yield* SessionPending.promote(db, bus, created.id, "steer") + yield* SessionInbox.promote(db, bus, created.id, "steer") expect( Array.from(yield* logEvents(session, created.id, true).pipe(Stream.take(3), Stream.runCollect)), @@ -504,10 +575,13 @@ describe("Session.create", () => { { durable: { seq: 0 }, type: "session.created" }, { durable: { seq: 1 }, - type: "session.input.admitted", - data: { input: { type: "user", data: { text: "Hello" }, delivery: "steer" } }, + type: "session.inbox.enqueued", + data: { + inboxID: expect.any(String), + item: { type: "user", payload: { text: "Hello" }, delivery: "steer" }, + }, }, - { durable: { seq: 2 }, type: "session.input.promoted" }, + { durable: { seq: 2 }, type: "session.inbox.delivered" }, ]) }), ) @@ -523,7 +597,7 @@ describe("Session.create", () => { text: "Replay lifecycle", resume: false, }) - yield* SessionPending.promote(sourceDb, sourceEvents, created.id, "steer") + yield* SessionInbox.promote(sourceDb, sourceEvents, created.id, "steer") const serialized = (yield* sourceDb .select() .from(EventTable) @@ -563,17 +637,17 @@ describe("Session.create", () => { expect(yield* store.get(created.id)).toBeUndefined() expect(yield* bus.replayAll(serialized.slice(0, 2))).toBe(created.id) - expect(yield* SessionPending.find(db, admitted.id)).toMatchObject({ + expect(yield* SessionInbox.find(db, admitted.id)).toMatchObject({ id: admitted.id, sessionID: created.id, type: "user", - data: { text: "Replay lifecycle" }, + payload: { text: "Replay lifecycle" }, delivery: "steer", }) expect(yield* store.context(created.id)).toEqual([]) expect(yield* bus.replayAll(serialized.slice(2))).toBe(created.id) - expect(yield* SessionPending.find(db, admitted.id)).toBeUndefined() + expect(yield* SessionInbox.find(db, admitted.id)).toBeUndefined() expect(yield* store.context(created.id)).toMatchObject([ { id: admitted.id, type: "user", text: "Replay lifecycle" }, ]) @@ -587,8 +661,8 @@ describe("Session.create", () => { .pipe(Effect.orDie)).map((event) => [event.seq, event.type]), ).toEqual([ [0, Bus.versionedType(SessionEvent.Created.type, 1)], - [1, Bus.versionedType(SessionEvent.InputAdmitted.type, 1)], - [2, Bus.versionedType(SessionEvent.InputPromoted.type, 1)], + [1, Bus.versionedType(SessionEvent.InboxEnqueued.type, 1)], + [2, Bus.versionedType(SessionEvent.InboxDelivered.type, 1)], ]) }).pipe(Effect.provide(Layer.fresh(targetLayer))) }), @@ -808,7 +882,7 @@ describe("SessionTransfer", () => { ]) yield* session.prompt({ sessionID, text: "Continue", resume: false }) - yield* SessionPending.promote(db, bus, sessionID, "steer") + yield* SessionInbox.promote(db, bus, sessionID, "steer") expect((yield* session.messages({ sessionID, order: "asc" })).map((message) => message.type)).toEqual([ "user", diff --git a/packages/core/test/session-error.test.ts b/packages/core/test/session-error.test.ts index 625427d65cd..d0e14b8fa70 100644 --- a/packages/core/test/session-error.test.ts +++ b/packages/core/test/session-error.test.ts @@ -39,7 +39,9 @@ describe("toSessionError", () => { ) expect(toSessionError(llm(new QuotaExceededReason({ message: "quota" }))).type).toBe("provider.quota") expect(toSessionError(llm(new ContentPolicyReason({ message: "blocked" }))).type).toBe("provider.content-filter") - expect(toSessionError(llm(new TransportReason({ message: "transport" }))).type).toBe("provider.transport") + expect( + toSessionError(llm(new TransportReason({ message: "transport", transport: "http", operation: "request" }))).type, + ).toBe("provider.transport") expect(toSessionError(llm(new ProviderInternalReason({ message: "internal", status: 500 }))).type).toBe( "provider.internal", ) @@ -111,7 +113,7 @@ describe("toSessionError", () => { const eligible = [ llm(new RateLimitReason({ message: "rate" })), llm(new ProviderInternalReason({ message: "internal", status: 500 })), - llm(new TransportReason({ message: "transport" })), + llm(new TransportReason({ message: "transport", transport: "http", operation: "request" })), ] const ineligible = [ llm(new AuthenticationReason({ message: "auth", kind: "invalid" })), diff --git a/packages/core/test/session-execution.test.ts b/packages/core/test/session-execution.test.ts index e71cd12ade8..d41f1416809 100644 --- a/packages/core/test/session-execution.test.ts +++ b/packages/core/test/session-execution.test.ts @@ -14,7 +14,7 @@ import { SessionExecution } from "@opencode-ai/core/session/execution" import { SessionRestart } from "@opencode-ai/core/session/execution/restart" import { UserInterruptedError } from "@opencode-ai/core/session/error" import { SessionEvent } from "@opencode-ai/core/session/event" -import { SessionRunner } from "@opencode-ai/core/session/runner" +import { SessionRunner } from "@opencode-ai/core/session/runner/index" import { SessionTable } from "@opencode-ai/core/session/sql" import { SessionStore } from "@opencode-ai/core/session/store" import { Context, Deferred, Effect, Exit, Fiber, Layer, LayerMap, Scope } from "effect" @@ -32,7 +32,7 @@ describe("SessionExecution lifecycle", () => { new AIError({ module: "test", method: "stream", - reason: new TransportReason({ message: "Disconnected" }), + reason: new TransportReason({ message: "Disconnected", transport: "http", operation: "request" }), }), ), ), @@ -346,14 +346,17 @@ function attempts(database: Database.Service["Service"], sessionID: Session.ID) /** Builds the local execution layer plus the restart actions against the test harness services. */ function buildExecution( scope: Scope.Closeable, - drain: SessionRunner.Interface["drain"], + drain: (input: Parameters[0]) => Effect.Effect, options?: SessionRestart.Options, ) { return Effect.gen(function* () { const database = yield* Database.Service const bus = yield* Bus.Service const store = yield* SessionStore.Service - const runner = Layer.succeed(SessionRunner.Service, SessionRunner.Service.of({ drain })) + const runner = Layer.succeed( + SessionRunner.Service, + SessionRunner.Service.of({ drain: (input) => drain(input).pipe(Effect.as({ type: "complete" as const })) }), + ) const locations = Layer.effect( LocationServiceMap.Service, LayerMap.make( diff --git a/packages/core/test/session-generate.test.ts b/packages/core/test/session-generate.test.ts index 35f2998cc64..756532b0344 100644 --- a/packages/core/test/session-generate.test.ts +++ b/packages/core/test/session-generate.test.ts @@ -17,7 +17,7 @@ import { LayerNode } from "@opencode-ai/util/effect/layer-node" import { Bus } from "@opencode-ai/core/bus" import { EventTable } from "@opencode-ai/core/event/sql" import { InstructionDiscovery } from "@opencode-ai/core/instruction-discovery" -import { Instructions } from "@opencode-ai/core/instructions" +import { Instructions } from "@opencode-ai/core/instructions/index" import { InstructionBuiltIns } from "@opencode-ai/core/instructions/builtins" import { Location } from "@opencode-ai/core/location" import { McpInstructions } from "@opencode-ai/core/mcp/instructions" @@ -38,7 +38,7 @@ import { InstructionBlobTable, InstructionStateTable, SessionMessageTable, - SessionPendingTable, + SessionInboxTable, SessionTable, } from "@opencode-ai/core/session/sql" import { SessionStore } from "@opencode-ai/core/session/store" @@ -170,9 +170,9 @@ const durableState = (db: Database.Interface["db"], sessionID: SessionSchema.ID) .pipe(Effect.orDie), pending: db .select() - .from(SessionPendingTable) - .where(eq(SessionPendingTable.session_id, sessionID)) - .orderBy(asc(SessionPendingTable.admitted_seq)) + .from(SessionInboxTable) + .where(eq(SessionInboxTable.session_id, sessionID)) + .orderBy(asc(SessionInboxTable.enqueued_seq)) .all() .pipe(Effect.orDie), instructions: db @@ -225,12 +225,15 @@ it.effect("generates from fresh settled Session context without durable mutation const { db, bus, instructions } = yield* setup yield* InstructionState.prepare(db, bus, instructions, sessionID) const existing = SessionMessage.ID.create() - yield* bus.publish(SessionEvent.InputAdmitted, { + yield* bus.publish(SessionEvent.InboxEnqueued, { sessionID, - inputID: existing, - input: { type: "user", data: { text: "Existing durable context" }, delivery: "steer" }, + inboxID: existing, + item: { type: "user", payload: { text: "Existing durable context" }, delivery: "steer" }, + }) + yield* bus.publish(SessionEvent.InboxDelivered, { + sessionID, + inboxID: existing, }) - yield* bus.publish(SessionEvent.InputPromoted, { sessionID, inputID: existing }) const settledAssistant = SessionMessage.ID.create() yield* bus.publish(SessionEvent.Step.Started, { sessionID, @@ -275,10 +278,10 @@ it.effect("generates from fresh settled Session context without durable mutation input: {}, executed: false, }) - yield* bus.publish(SessionEvent.InputAdmitted, { + yield* bus.publish(SessionEvent.InboxEnqueued, { sessionID, - inputID: SessionMessage.ID.create(), - input: { type: "user", data: { text: "Queued input must remain invisible" }, delivery: "queue" }, + inboxID: SessionMessage.ID.create(), + item: { type: "user", payload: { text: "Queued input must remain invisible" }, delivery: "queue" }, }) instruction = "Changed context" const before = yield* durableState(db, sessionID) diff --git a/packages/core/test/session-move.test.ts b/packages/core/test/session-move.test.ts index 9b2798697ca..fba36496879 100644 --- a/packages/core/test/session-move.test.ts +++ b/packages/core/test/session-move.test.ts @@ -1,6 +1,7 @@ import { describe, expect } from "bun:test" import path from "path" import { Effect, Layer } from "effect" +import { Event } from "@opencode-ai/schema/project-directories" import { Bus } from "@opencode-ai/core/bus" import { Database } from "@opencode-ai/core/database/database" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" @@ -8,6 +9,7 @@ import { Location } from "@opencode-ai/core/location" import { Project } from "@opencode-ai/core/project" import { AbsolutePath } from "@opencode-ai/core/schema" import { Session } from "@opencode-ai/core/session" +import { SessionEvent } from "@opencode-ai/core/session/event" import { SessionExecution } from "@opencode-ai/core/session/execution" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionStore } from "@opencode-ai/core/session/store" @@ -34,7 +36,7 @@ const it = testEffect( ) describe("Session.move", () => { - it.effect("moves a session whose source directory no longer exists", () => + it.effect("enqueues one move when the source directory no longer exists", () => Effect.acquireRelease( Effect.promise(() => tmpdir()), (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()), @@ -49,24 +51,65 @@ describe("Session.move", () => { yield* session.move({ sessionID: created.id, directory: destination }) - expect((yield* session.get(created.id)).location.directory).toBe(destination) - const messages = yield* session.messages({ sessionID: created.id, order: "asc" }) - expect(messages).toEqual([ - expect.objectContaining({ - type: "location-switched", - location: { directory: destination }, - projectID: Project.ID.global, - previous: { - location: { directory: path.join(tmp.path, "deleted") }, + expect((yield* session.get(created.id)).location.directory).toBe( + AbsolutePath.make(path.join(tmp.path, "deleted")), + ) + expect(yield* session.inbox(created.id)).toMatchObject([ + { + type: "move", + delivery: "steer", + payload: { + location: { directory: destination }, projectID: Project.ID.global, - subpath: "", }, - subpath: "", - }), + }, ]) yield* session.move({ sessionID: created.id, directory: destination }) - expect(yield* session.messages({ sessionID: created.id, order: "asc" })).toEqual(messages) + expect(yield* session.inbox(created.id)).toHaveLength(2) + + const steered = yield* session.create({ + location: Location.Ref.make({ directory: AbsolutePath.make(path.join(tmp.path, "other")) }), + }) + yield* session.move({ sessionID: steered.id, directory: destination, delivery: "queue" }) + expect(yield* session.inbox(steered.id)).toMatchObject([{ type: "move", delivery: "queue" }]) + }), + ), + ), + ) + + it.effect("keeps a moved session out of its former directory's new identity", () => + Effect.acquireRelease( + Effect.promise(() => tmpdir()), + (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()), + ).pipe( + Effect.flatMap((tmp) => + Effect.gen(function* () { + const session = yield* Session.Service + const bus = yield* Bus.Service + const previous = AbsolutePath.make(path.join(tmp.path, "previous")) + const destination = AbsolutePath.make(tmp.path) + const created = yield* session.create({ location: Location.Ref.make({ directory: previous }) }) + + // Moves are admitted through the inbox and applied by the drain; + // publish the applied move directly since execution is a no-op here. + yield* bus.publish(SessionEvent.Moved, { + sessionID: created.id, + location: Location.Ref.make({ directory: destination }), + projectID: Project.ID.global, + }) + // The former directory becomes a project after the session left it. + yield* bus.publish(Event.Resolved, { + projectID: Project.ID.make("adopting"), + directory: previous, + previous: Project.ID.global, + }) + + expect(yield* session.get(created.id)).toMatchObject({ + projectID: Project.ID.global, + location: { directory: destination }, + subpath: undefined, + }) }), ), ), diff --git a/packages/core/test/session-projector.test.ts b/packages/core/test/session-projector.test.ts index f45f769f288..1aed7f170b9 100644 --- a/packages/core/test/session-projector.test.ts +++ b/packages/core/test/session-projector.test.ts @@ -20,11 +20,11 @@ import { Money } from "@opencode-ai/schema/money" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionExecution } from "@opencode-ai/core/session/execution" import { fromRow } from "@opencode-ai/core/session/info" -import { SessionPending } from "@opencode-ai/core/session/pending" +import { SessionInbox } from "@opencode-ai/core/session/inbox" import { Shell } from "@opencode-ai/schema/shell" import { InstructionStateTable, - SessionPendingTable, + SessionInboxTable, SessionMessageTable, SessionTable, } from "@opencode-ai/core/session/sql" @@ -81,7 +81,7 @@ describe("SessionProjector", () => { .run() const bus = yield* Bus.Service const inputID = SessionMessage.ID.make("msg_manual_compaction") - yield* SessionPending.admitCompaction(db, bus, { id: inputID, sessionID }) + yield* SessionInbox.admitCompaction(db, bus, { id: inputID, sessionID, delivery: "queue" }) yield* bus.publish(SessionEvent.Compaction.Failed, { sessionID, @@ -89,7 +89,7 @@ describe("SessionProjector", () => { error: { type: "compaction.failed", message: "Auto compaction failed" }, }) - expect(yield* SessionPending.compaction(db, sessionID)).toMatchObject({ id: inputID }) + expect(yield* SessionInbox.find(db, inputID)).toMatchObject({ id: inputID }) }), ) @@ -247,29 +247,29 @@ describe("SessionProjector", () => { .pipe(Effect.orDie) const bus = yield* Bus.Service - yield* bus.publish(SessionEvent.InputAdmitted, { + yield* bus.publish(SessionEvent.InboxEnqueued, { sessionID, - inputID: SessionMessage.ID.make("msg_first"), - input: { type: "user", data: { text: "first" }, delivery: "steer" }, + inboxID: SessionMessage.ID.make("msg_first"), + item: { type: "user", payload: { text: "first" }, delivery: "steer" }, }) yield* bus.publish( - SessionEvent.InputPromoted, + SessionEvent.InboxDelivered, { sessionID, - inputID: SessionMessage.ID.make("msg_first"), + inboxID: SessionMessage.ID.make("msg_first"), }, { id: Event.ID.make("evt_z") }, ) - yield* bus.publish(SessionEvent.InputAdmitted, { + yield* bus.publish(SessionEvent.InboxEnqueued, { sessionID, - inputID: SessionMessage.ID.make("msg_second"), - input: { type: "user", data: { text: "second" }, delivery: "steer" }, + inboxID: SessionMessage.ID.make("msg_second"), + item: { type: "user", payload: { text: "second" }, delivery: "steer" }, }) yield* bus.publish( - SessionEvent.InputPromoted, + SessionEvent.InboxDelivered, { sessionID, - inputID: SessionMessage.ID.make("msg_second"), + inboxID: SessionMessage.ID.make("msg_second"), }, { id: Event.ID.make("evt_a") }, ) @@ -320,20 +320,20 @@ describe("SessionProjector", () => { .pipe(Effect.orDie) const bus = yield* Bus.Service const id = SessionMessage.ID.make("msg_admitted") - const admitted = yield* SessionPending.admit(db, bus, { + const admitted = yield* SessionInbox.admit(db, bus, { id, sessionID, - input: { type: "user", data: { text: "promote me" }, delivery: "steer" }, + item: { type: "user", payload: { text: "promote me" }, delivery: "steer" }, }) if (!admitted) return yield* Effect.die("Prompt admission failed") - const event = yield* bus.publish(SessionEvent.InputPromoted, { + const event = yield* bus.publish(SessionEvent.InboxDelivered, { sessionID, - inputID: id, + inboxID: id, }) expect( - yield* db.select().from(SessionPendingTable).where(eq(SessionPendingTable.id, id)).get().pipe(Effect.orDie), + yield* db.select().from(SessionInboxTable).where(eq(SessionInboxTable.id, id)).get().pipe(Effect.orDie), ).toBeUndefined() expect( yield* db.select().from(SessionMessageTable).where(eq(SessionMessageTable.id, id)).get().pipe(Effect.orDie), diff --git a/packages/core/test/session-prompt.test.ts b/packages/core/test/session-prompt.test.ts index 51059a2b237..d5a71a20c4a 100644 --- a/packages/core/test/session-prompt.test.ts +++ b/packages/core/test/session-prompt.test.ts @@ -21,8 +21,8 @@ import { Session } from "@opencode-ai/core/session" import { SessionMessage } from "@opencode-ai/core/session/message" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionExecution } from "@opencode-ai/core/session/execution" -import { SessionPending } from "@opencode-ai/core/session/pending" -import { SessionPendingTable, SessionMessageTable, SessionTable } from "@opencode-ai/core/session/sql" +import { SessionInbox } from "@opencode-ai/core/session/inbox" +import { SessionInboxTable, SessionMessageTable, SessionTable } from "@opencode-ai/core/session/sql" import { SessionStore } from "@opencode-ai/core/session/store" import { LocationServiceMap } from "@opencode-ai/core/location-service-map" import type { LocationServices } from "@opencode-ai/core/location-services" @@ -100,11 +100,11 @@ const setup = Effect.gen(function* () { .pipe(Effect.orDie) }) -const admitted = (id: SessionMessage.ID) => Database.Service.use(({ db }) => SessionPending.find(db, id)) +const admitted = (id: SessionMessage.ID) => Database.Service.use(({ db }) => SessionInbox.find(db, id)) const admittedCount = Database.Service.use(({ db }) => db .select() - .from(SessionPendingTable) + .from(SessionInboxTable) .all() .pipe( Effect.orDie, @@ -227,13 +227,13 @@ describe("Session.prompt", () => { resume: false, }) - expect(message.data.text).toBe("Fix the failing tests") + expect(message.payload.text).toBe("Fix the failing tests") expect(yield* session.messages({ sessionID })).toEqual([]) expect(yield* admitted(message.id)).toMatchObject({ id: message.id, sessionID, type: "user", - data: { text: "Fix the failing tests" }, + payload: { text: "Fix the failing tests" }, delivery: "steer", }) }), @@ -251,7 +251,7 @@ describe("Session.prompt", () => { text: "boundary", resume: false, }) - yield* SessionPending.promote(db, bus, sessionID, "steer") + yield* SessionInbox.promote(db, bus, sessionID, "steer") const stale = SessionMessage.ID.make("msg_stale_assistant") yield* db.insert(SessionMessageTable).values(assistantRow(stale, 100)).run().pipe(Effect.orDie) yield* bus.publish(SessionEvent.RevertEvent.Staged, { @@ -268,7 +268,7 @@ describe("Session.prompt", () => { (row) => row.id, ), ).not.toContainAnyValues([boundary.id, stale]) - expect(yield* SessionPending.find(db, boundary.id)).toBeUndefined() + expect(yield* SessionInbox.find(db, boundary.id)).toBeUndefined() }), ) @@ -283,7 +283,7 @@ describe("Session.prompt", () => { text: "boundary", resume: false, }) - yield* SessionPending.promote(db, bus, sessionID, "steer") + yield* SessionInbox.promote(db, bus, sessionID, "steer") yield* bus.publish(SessionEvent.RevertEvent.Staged, { sessionID, revert: { messageID: boundary.id, files: [] }, @@ -293,11 +293,11 @@ describe("Session.prompt", () => { const completion = yield* session.synthetic({ sessionID, text: "stale completion" }) expect(wakeCalls).toEqual([]) - expect(yield* SessionPending.find(db, completion.id)).toMatchObject({ type: "synthetic" }) + expect(yield* SessionInbox.find(db, completion.id)).toMatchObject({ type: "synthetic" }) yield* session.revert.commit(sessionID) - expect(yield* SessionPending.find(db, completion.id)).toBeUndefined() + expect(yield* SessionInbox.find(db, completion.id)).toBeUndefined() }), ) @@ -315,7 +315,7 @@ describe("Session.prompt", () => { resume: false, }) - expect(message.data.files).toEqual([ + expect(message.payload.files).toEqual([ { data: uri.slice(uri.indexOf(",") + 1), mime: "image/png", @@ -326,7 +326,7 @@ describe("Session.prompt", () => { ]) const stored = yield* admitted(message.id) expect(stored?.type).toBe("user") - if (stored?.type === "user") expect(stored.data.files).toEqual(message.data.files) + if (stored?.type === "user") expect(stored.payload.files).toEqual(message.payload.files) }), ) @@ -347,14 +347,14 @@ describe("Session.prompt", () => { resume: false, }) - expect(message.data.files).toHaveLength(1) - expect(message.data.files?.[0]).toMatchObject({ + expect(message.payload.files).toHaveLength(1) + expect(message.payload.files?.[0]).toMatchObject({ mime: "text/plain", source: { type: "uri", uri: sourceUri.href }, name: "main.ts", }) expect( - Buffer.from(message.data.files?.[0]?.data ?? "", "base64") + Buffer.from(message.payload.files?.[0]?.data ?? "", "base64") .toString("utf8") .replace(/\r$/, ""), ).toBe('import { describe, expect } from "bun:test"') @@ -374,13 +374,13 @@ describe("Session.prompt", () => { resume: false, }) - expect(message.data.files).toHaveLength(1) - expect(message.data.files?.[0]).toMatchObject({ + expect(message.payload.files).toHaveLength(1) + expect(message.payload.files?.[0]).toMatchObject({ mime: "application/x-directory", source: { type: "uri", uri }, name: "source", }) - expect(Buffer.from(message.data.files?.[0]?.data ?? "", "base64").toString("utf8")).toContain( + expect(Buffer.from(message.payload.files?.[0]?.data ?? "", "base64").toString("utf8")).toContain( "session-prompt.test.ts", ) }), @@ -408,7 +408,7 @@ describe("Session.prompt", () => { resume: false, }) - expect(message.data.files).toEqual([ + expect(message.payload.files).toEqual([ { data: bytes.toString("base64"), mime: "image/png", @@ -417,7 +417,7 @@ describe("Session.prompt", () => { }, ]) const stored = yield* admitted(message.id) - expect(stored?.type === "user" ? stored.data.files : undefined).toEqual(message.data.files) + expect(stored?.type === "user" ? stored.payload.files : undefined).toEqual(message.payload.files) }), ) @@ -440,7 +440,7 @@ describe("Session.prompt", () => { resume: false, }) - expect(message.data.files).toEqual([ + expect(message.payload.files).toEqual([ { data: "AA==", mime: "image/png", @@ -463,7 +463,7 @@ describe("Session.prompt", () => { resume: false, }) - expect(message.data.files).toEqual([ + expect(message.payload.files).toEqual([ { data: Buffer.from("export const value = 1\n").toString("base64"), mime: "text/plain", @@ -512,20 +512,20 @@ describe("Session.prompt", () => { yield* session.prompt({ sessionID, text: "First", resume: false }) yield* session.prompt({ sessionID, text: "Second", resume: false }) - yield* SessionPending.promote(db, bus, sessionID, "steer") + yield* SessionInbox.promote(db, bus, sessionID, "steer") const streamed = Array.from(yield* Fiber.join(fiber)) expect(streamed.map((event): [number | undefined, string] => [event.durable?.seq, event.type])).toEqual([ - [0, "session.input.admitted"], - [1, "session.input.admitted"], - [2, "session.input.promoted"], - [3, "session.input.promoted"], + [0, "session.inbox.enqueued"], + [1, "session.inbox.enqueued"], + [2, "session.inbox.delivered"], + [3, "session.inbox.delivered"], ]) expect( Array.from( yield* publicEvents({ sessionID, after: streamed[0].durable?.seq }).pipe(Stream.take(1), Stream.runCollect), ).map((event): [number | undefined, string] => [event.durable?.seq, event.type]), - ).toEqual([[1, "session.input.admitted"]]) + ).toEqual([[1, "session.inbox.enqueued"]]) }), ) @@ -593,12 +593,12 @@ describe("Session.prompt", () => { const { db } = yield* Database.Service const input = { sessionID, id: messageID, text: "Fix the failing tests", resume: false } const first = yield* session.prompt(input) - yield* SessionPending.promote(db, bus, sessionID, "steer") + yield* SessionInbox.promote(db, bus, sessionID, "steer") yield* db.delete(EventTable).where(eq(EventTable.aggregate_id, sessionID)).run().pipe(Effect.orDie) const retried = yield* session.prompt(input) - expect(retried).toMatchObject({ id: first.id, type: "user", data: { text: first.data.text } }) + expect(retried).toMatchObject({ id: first.id, type: "user", payload: { text: first.payload.text } }) expect(yield* session.messages({ sessionID })).toMatchObject([ { id: messageID, type: "user", text: "Fix the failing tests" }, ]) @@ -613,11 +613,11 @@ describe("Session.prompt", () => { const { db } = yield* Database.Service const input = { sessionID, id: messageID, text: "Fix the failing tests", resume: false } yield* session.prompt(input) - yield* SessionPending.promote(db, bus, sessionID, "steer") + yield* SessionInbox.promote(db, bus, sessionID, "steer") const retried = yield* session.prompt({ ...input, delivery: "queue" }) - expect(retried).toMatchObject({ id: messageID, type: "user", data: { text: input.text } }) + expect(retried).toMatchObject({ id: messageID, type: "user", payload: { text: input.text } }) expect(yield* admitted(messageID)).toBeUndefined() }), ) @@ -708,7 +708,7 @@ describe("Session.prompt", () => { expect(messages[1]).toEqual(messages[0]) expect(yield* session.messages({ sessionID })).toEqual([]) expect(yield* admittedCount).toBe(1) - expect(yield* eventCount(Bus.versionedType(SessionEvent.InputAdmitted.type, 1))).toBe(1) + expect(yield* eventCount(Bus.versionedType(SessionEvent.InboxEnqueued.type, 1))).toBe(1) }), ) @@ -726,11 +726,11 @@ describe("Session.prompt", () => { }) yield* Effect.all( - [SessionPending.promote(db, bus, sessionID, "steer"), SessionPending.promote(db, bus, sessionID, "steer")], + [SessionInbox.promote(db, bus, sessionID, "steer"), SessionInbox.promote(db, bus, sessionID, "steer")], { concurrency: "unbounded" }, ) - expect(yield* eventCount(Bus.versionedType(SessionEvent.InputPromoted.type, 1))).toBe(1) + expect(yield* eventCount(Bus.versionedType(SessionEvent.InboxDelivered.type, 1))).toBe(1) expect(yield* admitted(messageID)).toBeUndefined() expect(yield* session.messages({ sessionID })).toMatchObject([ { id: messageID, type: "user", text: "Promote once" }, @@ -761,11 +761,7 @@ describe("Session.prompt", () => { .pipe(Effect.orDie) yield* bus.remove(sessionID) - yield* db - .delete(SessionPendingTable) - .where(eq(SessionPendingTable.session_id, sessionID)) - .run() - .pipe(Effect.orDie) + yield* db.delete(SessionInboxTable).where(eq(SessionInboxTable.session_id, sessionID)).run().pipe(Effect.orDie) yield* db .delete(SessionMessageTable) .where(eq(SessionMessageTable.session_id, sessionID)) @@ -785,12 +781,12 @@ describe("Session.prompt", () => { expect(yield* admitted(messageID)).toMatchObject({ id: messageID, type: "user", - data: { text: "Replay pending" }, + payload: { text: "Replay pending" }, }) expect(yield* admitted(syntheticID)).toMatchObject({ id: syntheticID, type: "synthetic", - data: { text: "Replay synthetic" }, + payload: { text: "Replay synthetic" }, }) expect(yield* session.messages({ sessionID })).toEqual([]) expect(wakeCalls).toEqual([]) @@ -923,7 +919,7 @@ describe("Session.prompt", () => { const failure = yield* session.prompt({ ...input, metadata: { source: "plugin" } }).pipe(Effect.flip) expect(retried).toEqual(first) - expect(first.data.metadata).toEqual({ source: "api" }) + expect(first.payload.metadata).toEqual({ source: "api" }) expect(failure._tag).toBe("Session.PromptConflictError") }), ) @@ -949,14 +945,14 @@ describe("Session.prompt", () => { type: "synthetic", sessionID, delivery: "steer", - data: { + payload: { text: "Background work completed", description: "shell completion", metadata: { job: "shell" }, }, }) - yield* SessionPending.promote(db, bus, sessionID, "steer") + yield* SessionInbox.promote(db, bus, sessionID, "steer") expect(yield* session.messages({ sessionID })).toMatchObject([ { @@ -981,15 +977,15 @@ describe("Session.prompt", () => { const entries = yield* Effect.all([session.synthetic(input), session.synthetic(input)], { concurrency: "unbounded", }) - yield* SessionPending.promote(database.db, bus, sessionID, "steer") + yield* SessionInbox.promote(database.db, bus, sessionID, "steer") const promotedRetry = yield* session.synthetic(input) const failure = yield* session.synthetic({ ...input, text: "Different completion" }).pipe(Effect.flip) expect(entries[1]).toEqual(entries[0]) - expect(promotedRetry).toMatchObject({ id: messageID, type: "synthetic", data: { text: "Completed" } }) + expect(promotedRetry).toMatchObject({ id: messageID, type: "synthetic", payload: { text: "Completed" } }) expect(failure).toMatchObject({ _tag: "Session.SyntheticConflictError", sessionID, inputID: messageID }) expect(yield* admittedCount).toBe(0) - expect(yield* eventCount(Bus.versionedType(SessionEvent.InputAdmitted.type, 1))).toBe(1) + expect(yield* eventCount(Bus.versionedType(SessionEvent.InboxEnqueued.type, 1))).toBe(1) }), ) @@ -1008,11 +1004,11 @@ describe("Session.prompt", () => { }) expect(input.delivery).toBe("queue") - expect(yield* SessionPending.has(db, sessionID, "input")).toBe(true) - expect(yield* SessionPending.promote(db, bus, sessionID, "steer")).toBe(0) + expect(yield* SessionInbox.has(db, sessionID, "input")).toBe(true) + expect(yield* SessionInbox.promote(db, bus, sessionID, "steer")).toBe(0) expect(yield* session.messages({ sessionID })).toEqual([]) - expect(yield* SessionPending.promote(db, bus, sessionID, "input")).toBe(1) - expect(yield* SessionPending.has(db, sessionID, "input")).toBe(false) + expect(yield* SessionInbox.promote(db, bus, sessionID, "input")).toBe(1) + expect(yield* SessionInbox.has(db, sessionID, "input")).toBe(false) expect(yield* session.messages({ sessionID })).toMatchObject([ { id: input.id, type: "synthetic", text: "Queued completion" }, ]) @@ -1038,7 +1034,7 @@ describe("Session.prompt", () => { resume: false, }) - yield* SessionPending.promote(db, bus, sessionID, "steer") + yield* SessionInbox.promote(db, bus, sessionID, "steer") expect( (yield* session.messages({ sessionID, order: "asc" })).map((message) => @@ -1049,11 +1045,11 @@ describe("Session.prompt", () => { ) }) -describe("Session.pending", () => { +describe("Session.inbox", () => { it.effect("fails for an unknown session", () => Effect.gen(function* () { const session = yield* Session.Service - expect(yield* session.pending(Session.ID.make("ses_missing")).pipe(Effect.flip)).toMatchObject({ + expect(yield* session.inbox(Session.ID.make("ses_missing")).pipe(Effect.flip)).toMatchObject({ _tag: "Session.NotFoundError", }) }), @@ -1075,34 +1071,34 @@ describe("Session.pending", () => { }) const second = yield* session.prompt({ sessionID, text: "Second steer", resume: false }) - expect(yield* session.pending(sessionID)).toMatchObject([ + expect(yield* session.inbox(sessionID)).toMatchObject([ { id: first.id, type: "user", delivery: "steer" }, { id: queued.id, type: "synthetic", delivery: "queue" }, { id: second.id, type: "user", delivery: "steer" }, ]) - expect(yield* SessionPending.promote(db, bus, sessionID, "input")).toBe(2) - expect(yield* session.pending(sessionID)).toMatchObject([{ id: queued.id, type: "synthetic" }]) + expect(yield* SessionInbox.promote(db, bus, sessionID, "input")).toBe(2) + expect(yield* session.inbox(sessionID)).toMatchObject([{ id: queued.id, type: "synthetic" }]) - expect(yield* SessionPending.promote(db, bus, sessionID, "input")).toBe(1) - expect(yield* session.pending(sessionID)).toEqual([]) + expect(yield* SessionInbox.promote(db, bus, sessionID, "input")).toBe(1) + expect(yield* session.inbox(sessionID)).toEqual([]) }), ) - it.effect("lists an unhandled compaction barrier until it settles", () => + it.effect("lists an unhandled compaction until it is cancelled", () => Effect.gen(function* () { yield* setup const session = yield* Session.Service const { db } = yield* Database.Service const barrier = yield* session.compact({ sessionID }) - expect(yield* SessionPending.has(db, sessionID, "any")).toBe(true) - expect(yield* SessionPending.has(db, sessionID, "input")).toBe(false) - expect(yield* session.pending(sessionID)).toMatchObject([{ id: barrier.id, type: "compaction" }]) + expect(yield* SessionInbox.has(db, sessionID, "any")).toBe(true) + expect(yield* SessionInbox.has(db, sessionID, "input")).toBe(true) + expect(yield* session.inbox(sessionID)).toMatchObject([{ id: barrier.id, type: "compaction" }]) - yield* SessionPending.settleCompaction(db, { sessionID }) - expect(yield* SessionPending.has(db, sessionID, "any")).toBe(false) - expect(yield* session.pending(sessionID)).toEqual([]) + yield* session.cancelInbox({ sessionID, inboxID: barrier.id }) + expect(yield* SessionInbox.has(db, sessionID, "any")).toBe(false) + expect(yield* session.inbox(sessionID)).toEqual([]) }), ) @@ -1119,16 +1115,16 @@ describe("Session.pending", () => { resume: false, }) - yield* session.cancelPending({ sessionID, inputID }) + yield* session.cancelInbox({ sessionID, inboxID: inputID }) - expect(yield* session.pending(sessionID)).toEqual([]) - expect(yield* eventCount(Bus.versionedType(SessionEvent.InputCancelled.type, 1))).toBe(1) - expect(yield* session.cancelPending({ sessionID, inputID }).pipe(Effect.flip)).toMatchObject({ - _tag: "Session.PendingInputConflictError", + expect(yield* session.inbox(sessionID)).toEqual([]) + expect(yield* eventCount(Bus.versionedType(SessionEvent.InboxCancelled.type, 1))).toBe(1) + expect(yield* session.cancelInbox({ sessionID, inboxID: inputID }).pipe(Effect.flip)).toMatchObject({ + _tag: "Session.InboxConflictError", sessionID, - inputID, + inboxID: inputID, }) - expect(yield* eventCount(Bus.versionedType(SessionEvent.InputCancelled.type, 1))).toBe(1) + expect(yield* eventCount(Bus.versionedType(SessionEvent.InboxCancelled.type, 1))).toBe(1) const retried = yield* session.prompt({ id: inputID, @@ -1154,33 +1150,33 @@ describe("Session.pending", () => { const alreadySteered = yield* session.prompt({ sessionID, text: "Already steer", resume: false }) wakeCalls.length = 0 - yield* session.steerPending({ sessionID, inputID: queued.id }) + yield* session.steerInbox({ sessionID, inboxID: queued.id }) - expect(yield* session.pending(sessionID)).toMatchObject([ + expect(yield* session.inbox(sessionID)).toMatchObject([ { id: queued.id, delivery: "steer" }, { id: alreadySteered.id, delivery: "steer" }, ]) expect(wakeCalls).toEqual([sessionID]) - expect(yield* eventCount(Bus.versionedType(SessionEvent.InputSteered.type, 1))).toBe(1) + expect(yield* eventCount(Bus.versionedType(SessionEvent.InboxDeliveryChanged.type, 1))).toBe(1) wakeCalls.length = 0 - yield* session.queuePending({ sessionID, inputID: queued.id }) - expect(yield* session.pending(sessionID)).toMatchObject([ + yield* session.queueInbox({ sessionID, inboxID: queued.id }) + expect(yield* session.inbox(sessionID)).toMatchObject([ { id: queued.id, delivery: "queue" }, { id: alreadySteered.id, delivery: "steer" }, ]) expect(wakeCalls).toEqual([]) - expect(yield* eventCount(Bus.versionedType(SessionEvent.InputQueued.type, 1))).toBe(1) + expect(yield* eventCount(Bus.versionedType(SessionEvent.InboxDeliveryChanged.type, 1))).toBe(2) - expect(yield* session.steerPending({ sessionID, inputID: alreadySteered.id }).pipe(Effect.flip)).toMatchObject({ - _tag: "Session.PendingInputConflictError", + expect(yield* session.steerInbox({ sessionID, inboxID: alreadySteered.id }).pipe(Effect.flip)).toMatchObject({ + _tag: "Session.InboxConflictError", sessionID, - inputID: alreadySteered.id, + inboxID: alreadySteered.id, }) - yield* session.cancelPending({ sessionID, inputID: alreadySteered.id }) + yield* session.cancelInbox({ sessionID, inboxID: alreadySteered.id }) expect(wakeCalls).toEqual([]) - expect(yield* eventCount(Bus.versionedType(SessionEvent.InputSteered.type, 1))).toBe(1) - expect(yield* eventCount(Bus.versionedType(SessionEvent.InputCancelled.type, 1))).toBe(1) + expect(yield* eventCount(Bus.versionedType(SessionEvent.InboxDeliveryChanged.type, 1))).toBe(2) + expect(yield* eventCount(Bus.versionedType(SessionEvent.InboxCancelled.type, 1))).toBe(1) }), ) }) diff --git a/packages/core/test/session-runner-message.test.ts b/packages/core/test/session-runner-message.test.ts index ce49a72714a..f624c402de8 100644 --- a/packages/core/test/session-runner-message.test.ts +++ b/packages/core/test/session-runner-message.test.ts @@ -11,6 +11,8 @@ import { Shell } from "@opencode-ai/schema/shell" import { Location } from "@opencode-ai/schema/location" import { AbsolutePath } from "@opencode-ai/schema/schema" import { DateTime } from "effect" +import path from "path" +import { pathToFileURL } from "url" const created = DateTime.makeUnsafe(0) const id = (value: string) => SessionMessage.ID.make(`msg_${value}`) @@ -267,12 +269,13 @@ Recent work ]) }) - test("lowers directory attachments as directory context", () => { + test("exposes admitted reference directory source paths in model context", () => { + const location = path.resolve("/references/harness-engineering") const directory = FileAttachment.make({ data: Base64.make(Buffer.from("lib/\nindex.ts").toString("base64")), mime: "application/x-directory", - source: { type: "uri", uri: "file:///project/src" }, - name: "src/", + source: { type: "uri", uri: pathToFileURL(location).href }, + name: "harness-engineering", }) const messages = toLLMMessages( [ @@ -295,14 +298,15 @@ Recent work { type: "text", text: "Review this directory" }, { type: "text", - text: "\n\nAttached directory: src/\n\nlib/\nindex.ts", - metadata: { attachment: { source: directory.source, name: "src/" } }, + text: `\n\nAttached directory: ${location}\n\nlib/\nindex.ts`, + metadata: { attachment: { source: directory.source, name: "harness-engineering" } }, }, ], }) }) test("preserves attachment order after the prompt", () => { + const directory = path.resolve("/project/src") const messages = toLLMMessages( [ SessionMessage.User.make({ @@ -313,7 +317,7 @@ Recent work FileAttachment.make({ data: Base64.make(Buffer.from("index.ts").toString("base64")), mime: "application/x-directory", - source: { type: "uri", uri: "file:///project/src" }, + source: { type: "uri", uri: pathToFileURL(directory).href }, name: "src/", }), FileAttachment.make({ @@ -332,12 +336,13 @@ Recent work expect(messages).toHaveLength(1) expect(messages[0]?.content.map((part) => (part.type === "text" ? part.text : part.type))).toEqual([ "Review these attachments", - "\n\nAttached directory: src/\n\nindex.ts", + `\n\nAttached directory: ${directory}\n\nindex.ts`, "\n\nAttached file: main.ts\n\nexport const value = 1", ]) }) test("omits empty prompt text before an attachment", () => { + const directory = path.resolve("/project/src") const messages = toLLMMessages( [ SessionMessage.User.make({ @@ -348,7 +353,7 @@ Recent work FileAttachment.make({ data: Base64.make(Buffer.from("index.ts").toString("base64")), mime: "application/x-directory", - source: { type: "uri", uri: "file:///project/src" }, + source: { type: "uri", uri: pathToFileURL(directory).href }, name: "src/", }), ], @@ -359,7 +364,9 @@ Recent work ) expect(messages).toHaveLength(1) - expect(messages[0]?.content).toMatchObject([{ type: "text", text: "\n\nAttached directory: src/\n\nindex.ts" }]) + expect(messages[0]?.content).toMatchObject([ + { type: "text", text: `\n\nAttached directory: ${directory}\n\nindex.ts` }, + ]) }) test("uses materialized image data as provider media and drops unsupported attachments", () => { @@ -391,6 +398,108 @@ Recent work ]) }) + test("exposes admitted local image source paths before provider media", () => { + const data = Base64.make("AAECAw==") + const location = path.resolve("/project/IMG_3480.JPG") + const image = FileAttachment.make({ + data, + mime: "image/png", + source: { type: "uri", uri: pathToFileURL(location).href }, + name: "IMG_3480.JPG", + }) + + const messages = toLLMMessages( + [ + SessionMessage.User.make({ + id: id("user-local-image-path"), + type: "user", + text: "Inspect this image", + files: [image], + time: { created }, + }), + ], + model, + ) + + expect(messages[0]?.content).toEqual([ + { type: "text", text: "Inspect this image" }, + { type: "text", text: `Attached file: ${location}` }, + { type: "media", mediaType: "image/png", data, filename: "IMG_3480.JPG" }, + ]) + }) + + test("falls back to attachment names for invalid local source paths", () => { + const data = Base64.make("AAECAw==") + const messages = toLLMMessages( + [ + SessionMessage.User.make({ + id: id("user-invalid-local-paths"), + type: "user", + text: "Inspect these attachments", + files: [ + FileAttachment.make({ + data: Base64.make(Buffer.from("index.ts").toString("base64")), + mime: "application/x-directory", + source: { type: "uri", uri: "file:///project/src%2Flib" }, + name: "src/", + }), + FileAttachment.make({ + data, + mime: "image/png", + source: { type: "uri", uri: "file:///project/image%2Fpreview.png" }, + name: "preview.png", + }), + ], + time: { created }, + }), + ], + model, + ) + + expect(messages[0]?.content).toEqual([ + { type: "text", text: "Inspect these attachments" }, + { + type: "text", + text: "\n\nAttached directory: src/\n\nindex.ts", + metadata: { + attachment: { + source: { type: "uri", uri: "file:///project/src%2Flib" }, + name: "src/", + }, + }, + }, + { type: "media", mediaType: "image/png", data, filename: "preview.png" }, + ]) + }) + + test("does not add attachment location text for non-local provider media", () => { + const data = Base64.make("AAECAw==") + const messages = toLLMMessages( + [ + SessionMessage.User.make({ + id: id("user-remote-image"), + type: "user", + text: "Inspect this image", + files: [ + FileAttachment.make({ + data, + mime: "image/png", + source: { type: "uri", uri: "https://example.com/image.png" }, + name: "image.png", + }), + ], + time: { created }, + }), + ], + model, + ) + + expect(messages[0]?.content).toEqual([ + { type: "text", text: "Inspect this image" }, + { type: "media", mediaType: "image/png", data, filename: "image.png" }, + ]) + }) + test("deduplicates provider media while preserving durable attachment references", () => { const data = Base64.make("AAECAw==") const messages = toLLMMessages( @@ -468,7 +577,7 @@ Recent work FileAttachment.make({ data, mime: "image/png", - source: { type: "uri", uri: "file:///project/image.png" }, + source: { type: "uri", uri: pathToFileURL(path.resolve("/project/image.png")).href }, name: "image.png", mention: { start: 0, end: 9, text: "[Image 1]" }, }), diff --git a/packages/core/test/session-runner-recorded.test.ts b/packages/core/test/session-runner-recorded.test.ts index 02bec18ed26..74613a505fb 100644 --- a/packages/core/test/session-runner-recorded.test.ts +++ b/packages/core/test/session-runner-recorded.test.ts @@ -22,7 +22,7 @@ import { SessionTitle } from "@opencode-ai/core/session/title" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionExecution } from "@opencode-ai/core/session/execution" import { SessionRunCoordinator } from "@opencode-ai/core/session/run-coordinator" -import { SessionRunner } from "@opencode-ai/core/session/runner" +import { SessionRunner } from "@opencode-ai/core/session/runner/index" import * as SessionRunnerLLM from "@opencode-ai/core/session/runner/llm" import { SessionRunnerModel } from "@opencode-ai/core/session/runner/model" import { Tool } from "@opencode-ai/core/tool" @@ -31,7 +31,7 @@ import { SessionStore } from "@opencode-ai/core/session/store" import { Location } from "@opencode-ai/core/location" import { InstructionBuiltIns } from "@opencode-ai/core/instructions/builtins" import { InstructionDiscovery } from "@opencode-ai/core/instruction-discovery" -import { Instructions } from "@opencode-ai/core/instructions" +import { Instructions } from "@opencode-ai/core/instructions/index" import { SkillInstructions } from "@opencode-ai/core/skill/instructions" import { ReferenceInstructions } from "@opencode-ai/core/reference/instructions" import { McpInstructions } from "@opencode-ai/core/mcp/instructions" @@ -129,7 +129,7 @@ const execution = (llmClient: Layer.Layer) => Effect.gen(function* () { const sessionRunner = yield* SessionRunner.Service const coordinator = yield* SessionRunCoordinator.make({ - drain: (sessionID, force) => sessionRunner.drain({ sessionID, force }), + drain: (sessionID, force) => sessionRunner.drain({ sessionID, force }).pipe(Effect.asVoid), }) return SessionExecution.Service.of({ active: coordinator.active, @@ -243,9 +243,9 @@ describe("SessionRunnerLLM recorded", () => { .orderBy(EventTable.seq) .all()).map((event) => event.type), ).toEqual([ - "session.input.admitted.1", + "session.inbox.enqueued.1", "session.instructions.updated.2", - "session.input.promoted.1", + "session.inbox.delivered.1", "session.step.started.1", "session.text.started.1", "session.text.ended.1", diff --git a/packages/core/test/session-runner-tool-registry.test.ts b/packages/core/test/session-runner-tool-registry.test.ts index b3fb1029a0b..a1be5eddab1 100644 --- a/packages/core/test/session-runner-tool-registry.test.ts +++ b/packages/core/test/session-runner-tool-registry.test.ts @@ -110,6 +110,28 @@ describe("Tool", () => { }), ) + it.effect("rejects invalid tool definitions before installing any tools", () => + Effect.gen(function* () { + const service = yield* Tool.Service + const error = yield* service + .transform((draft) => { + draft.add({ ...make(), name: "healthy", options: { codemode: false } }) + draft.add({ + name: "phone_type", + input: Schema.Struct({}), + execute: () => Effect.succeed({ content: "ok" }), + options: { codemode: false }, + } as unknown as Info) + }) + .pipe(Effect.flip) + + expect(error).toBeInstanceOf(Tool.RegistrationError) + expect(error.name).toBe("phone_type") + expect(error.message).toContain('Expected string, got undefined\n at ["description"]') + expect((yield* service.snapshot()).definitions.map((tool) => tool.name)).toEqual(["execute"]) + }), + ) + it.effect("canonicalizes effective definitions and keeps Code Mode last", () => Effect.gen(function* () { const service = yield* Tool.Service diff --git a/packages/core/test/session-runner.test.ts b/packages/core/test/session-runner.test.ts index fa068812bb6..592ac806fb9 100644 --- a/packages/core/test/session-runner.test.ts +++ b/packages/core/test/session-runner.test.ts @@ -32,13 +32,13 @@ import { AbsolutePath } from "@opencode-ai/core/schema" import { Session } from "@opencode-ai/core/session" import { Snapshot } from "@opencode-ai/core/snapshot" import { SessionEvent } from "@opencode-ai/core/session/event" -import { SessionPending } from "@opencode-ai/core/session/pending" +import { SessionInbox } from "@opencode-ai/core/session/inbox" import { SessionMessage } from "@opencode-ai/core/session/message" import { Money } from "@opencode-ai/schema/money" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionExecution } from "@opencode-ai/core/session/execution" import { SessionRunCoordinator } from "@opencode-ai/core/session/run-coordinator" -import { SessionRunner } from "@opencode-ai/core/session/runner" +import { SessionRunner } from "@opencode-ai/core/session/runner/index" import * as SessionRunnerLLM from "@opencode-ai/core/session/runner/llm" import { SessionRunnerModel } from "@opencode-ai/core/session/runner/model" import { PromptCacheDiagnostics } from "@opencode-ai/core/session/prompt-cache-diagnostics" @@ -55,13 +55,13 @@ import { Tool } from "@opencode-ai/core/tool" import type { Info as ToolInfo } from "@opencode-ai/schema/tool" import { InstructionStateTable, - SessionPendingTable, + SessionInboxTable, SessionMessageTable, SessionTable, } from "@opencode-ai/core/session/sql" import { InstructionEntry } from "@opencode-ai/core/session/instruction-entry" import { SessionStore } from "@opencode-ai/core/session/store" -import { Instructions } from "@opencode-ai/core/instructions" +import { Instructions } from "@opencode-ai/core/instructions/index" import { InstructionBuiltIns } from "@opencode-ai/core/instructions/builtins" import { InstructionDiscovery } from "@opencode-ai/core/instruction-discovery" import { SkillInstructions } from "@opencode-ai/core/skill/instructions" @@ -72,7 +72,7 @@ import { Location } from "@opencode-ai/core/location" import { Provider } from "@opencode-ai/core/provider" import { Cause, DateTime, Deferred, Effect, Exit, Fiber, Layer, Schema, Scope, Stream } from "effect" import { TestClock } from "effect/testing" -import { asc, eq } from "drizzle-orm" +import { asc, desc, eq } from "drizzle-orm" import { testEffect } from "./lib/effect" import { agentHost, catalogHost, host } from "./plugin/host" import PROMPT_DEFAULT from "../src/session/runner/prompt/base.txt" @@ -387,8 +387,21 @@ const execution = Layer.effect( SessionExecution.Service, Effect.gen(function* () { const sessionRunner = yield* SessionRunner.Service + function drain( + sessionID: Session.ID, + force: boolean, + continuation?: SessionRunner.Continuation, + ): Effect.Effect { + return sessionRunner + .drain({ sessionID, force, continuation }) + .pipe( + Effect.flatMap((result) => + result.type === "complete" ? Effect.void : drain(sessionID, false, result.continuation), + ), + ) + } const coordinator = yield* SessionRunCoordinator.make({ - drain: (sessionID, force) => sessionRunner.drain({ sessionID, force }), + drain: (sessionID, force) => drain(sessionID, force), }) return SessionExecution.Service.of({ active: coordinator.active, @@ -515,7 +528,11 @@ const providerUnavailable = () => new AIError({ module: "test", method: "stream", - reason: new TransportReason({ message: "Provider unavailable" }), + reason: new TransportReason({ + message: "Provider unavailable", + transport: "http", + operation: "request", + }), }) const incompleteStream = () => @@ -625,7 +642,7 @@ const replaySessionProjection = (id: Session.ID) => yield* bus.remove(id) yield* db.delete(InstructionStateTable).where(eq(InstructionStateTable.session_id, id)).run().pipe(Effect.orDie) - yield* db.delete(SessionPendingTable).where(eq(SessionPendingTable.session_id, id)).run().pipe(Effect.orDie) + yield* db.delete(SessionInboxTable).where(eq(SessionInboxTable.session_id, id)).run().pipe(Effect.orDie) yield* db.delete(SessionMessageTable).where(eq(SessionMessageTable.session_id, id)).run().pipe(Effect.orDie) yield* bus.replayAll( recorded.map((event) => ({ @@ -812,7 +829,7 @@ const verifyPartialFlushOnInterruption = (kind: FragmentKind) => }) describe("SessionRunnerLLM", () => { - it.effect("retries title generation from the first prompt after execution and title failures", () => + it.effect("generates the title while the first model step is still running", () => Effect.gen(function* () { const session = yield* setup const agents = yield* Agent.Service @@ -827,16 +844,48 @@ describe("SessionRunnerLLM", () => { ) yield* admit(session, "First prompt") - yield* TestLLM.push(Stream.fail(invalidRequest())) + yield* TestLLM.push(TestLLM.text("Generated title", "text-title"), Stream.never) + const bus = yield* Bus.Service + const renamed = yield* bus.subscribe(SessionEvent.Renamed).pipe( + Stream.filter((event) => event.data.sessionID === sessionID), + Stream.take(1), + Stream.runDrain, + Effect.forkScoped({ startImmediately: true }), + ) + const runner = yield* SessionRunner.Service + const fiber = yield* runner.drain({ sessionID, force: true }).pipe(Effect.forkChild) + yield* Fiber.join(renamed) + + expect((yield* session.get(sessionID)).title).toBe("Generated title") + yield* Fiber.interrupt(fiber) + }), + ) + + it.effect("retries title generation from the first prompt after title and execution failures", () => + Effect.gen(function* () { + const session = yield* setup + const agents = yield* Agent.Service + const { db } = yield* Database.Service + yield* db.update(SessionTable).set({ title: null }).where(eq(SessionTable.id, sessionID)).run().pipe(Effect.orDie) + yield* agents.transform((draft) => + draft.update(Agent.ID.make("title"), (agent) => { + agent.mode = "primary" + agent.hidden = true + agent.system = "Generate a title." + }), + ) + + yield* admit(session, "First prompt") + yield* TestLLM.push(Stream.fail(invalidRequest()), Stream.fail(invalidRequest())) expect((yield* session.resume(sessionID).pipe(Effect.exit))._tag).toBe("Failure") yield* admit(session, "Second prompt") const titleFailed = yield* Deferred.make() yield* TestLLM.push( - TestLLM.text("Recovered", "text-recovered"), Stream.make(LLMEvent.providerError({ message: "Title provider unavailable" })).pipe( Stream.ensuring(Deferred.succeed(titleFailed, undefined)), ), + TestLLM.text("Recovered", "text-recovered"), ) yield* session.resume(sessionID) yield* Deferred.await(titleFailed) @@ -852,13 +901,13 @@ describe("SessionRunnerLLM", () => { ) yield* admit(session, "Third prompt") yield* TestLLM.push( - TestLLM.text("Recovered again", "text-recovered-again"), TestLLM.text("Generated title", "text-title"), + TestLLM.text("Recovered again", "text-recovered-again"), ) yield* session.resume(sessionID) yield* Fiber.join(renamed) - expect(requests).toHaveLength(5) + expect(requests).toHaveLength(6) expect(requests[2]?.messages).toContainEqual(Message.user("First prompt")) expect(requests[4]?.messages).toContainEqual(Message.user("First prompt")) expect((yield* session.get(sessionID)).title).toBe("Generated title") @@ -1150,7 +1199,7 @@ describe("SessionRunnerLLM", () => { expect(Exit.isFailure(exit)).toBe(true) if (Exit.isFailure(exit)) expect(Cause.squash(exit.cause)).toBeInstanceOf(Instructions.InitializationBlocked) expect(requests).toHaveLength(0) - expect(yield* SessionPending.has(db, sessionID, "steer")).toBe(true) + expect(yield* SessionInbox.has(db, sessionID, "steer")).toBe(true) expect( yield* db.select().from(InstructionStateTable).where(eq(InstructionStateTable.session_id, sessionID)).get(), ).toBeUndefined() @@ -1174,6 +1223,7 @@ describe("SessionRunnerLLM", () => { yield* bus.publish(SessionEvent.Moved, { sessionID, location: Location.Ref.make({ directory: AbsolutePath.make("/moved") }), + projectID: Project.ID.global, }) expect( yield* db.select().from(InstructionStateTable).where(eq(InstructionStateTable.session_id, sessionID)).get(), @@ -1184,7 +1234,78 @@ describe("SessionRunnerLLM", () => { expect(Exit.isFailure(exit) && Cause.hasInterruptsOnly(exit.cause)).toBe(true) expect(requests).toHaveLength(1) - expect(yield* SessionPending.has(db, sessionID, "steer")).toBe(true) + expect(yield* SessionInbox.has(db, sessionID, "steer")).toBe(true) + }), + ) + + it.effect("delivers a queued move atomically at the idle boundary", () => + Effect.gen(function* () { + const session = yield* setup + const bus = yield* Bus.Service + const { db } = yield* Database.Service + const inboxID = SessionMessage.ID.create() + yield* SessionInbox.admit(db, bus, { + id: inboxID, + sessionID, + item: { + type: "move", + payload: { + location: Location.Ref.make({ directory: AbsolutePath.make("/moved") }), + projectID: Project.ID.global, + }, + delivery: "queue", + }, + }) + + yield* session.resume(sessionID) + + expect((yield* session.get(sessionID)).location.directory).toBe(AbsolutePath.make("/moved")) + expect(yield* session.inbox(sessionID)).toEqual([]) + expect(requests).toEqual([]) + expect( + (yield* db + .select({ type: EventTable.type }) + .from(EventTable) + .where(eq(EventTable.aggregate_id, sessionID)) + .orderBy(desc(EventTable.seq)) + .limit(2) + .all()).map((event) => event.type), + ).toEqual([Bus.versionedType(SessionEvent.Moved.type, 1), Bus.versionedType(SessionEvent.InboxDelivered.type, 1)]) + }), + ) + + it.effect("preserves a tool continuation across a steered move", () => + Effect.gen(function* () { + const session = yield* setup + const bus = yield* Bus.Service + const { db } = yield* Database.Service + yield* admit(session, "Echo before moving") + yield* TestLLM.push( + TestLLM.tool("call-move", "echo", { text: "moving" }), + TestLLM.text("Done", "text-after-move"), + ) + const tools = yield* blockTools() + const run = yield* session.resume(sessionID).pipe(Effect.forkChild) + yield* tools.started + yield* SessionInbox.admit(db, bus, { + id: SessionMessage.ID.create(), + sessionID, + item: { + type: "move", + payload: { + location: Location.Ref.make({ directory: AbsolutePath.make("/project") }), + projectID: Project.ID.global, + }, + delivery: "steer", + }, + }) + + yield* tools.release + yield* Fiber.join(run) + + expect(requests).toHaveLength(2) + expect(requests.map(messageRoles).at(1)?.slice(0, 3)).toEqual(["user", "assistant", "tool"]) + expect(yield* session.inbox(sessionID)).toEqual([]) }), ) @@ -1789,15 +1910,15 @@ describe("SessionRunnerLLM", () => { }), ) - it.effect("runs one durable compaction barrier after tool settlement and before later inputs", () => + it.effect("runs steers before queued compaction and later queued input", () => Effect.gen(function* () { const session = yield* setup currentModel = recoveryModel const stream = yield* TestLLM.gate yield* TestLLM.push( TestLLM.tool("call-active", "echo", { text: "active" }), - [LLMEvent.textDelta({ id: "summary", text: "durable summary" })], TestLLM.text("Steer complete", "text-steer"), + [LLMEvent.textDelta({ id: "summary", text: "durable summary" })], TestLLM.text("Queue complete", "text-queue"), ) yield* admit(session, "Active work") @@ -1805,9 +1926,7 @@ describe("SessionRunnerLLM", () => { yield* stream.started const first = yield* session.compact({ sessionID }) - const second = yield* session.compact({ sessionID }) - expect(second.id).toBe(first.id) - expect(yield* SessionPending.compaction((yield* Database.Service).db, sessionID)).toMatchObject({ + expect(yield* SessionInbox.find((yield* Database.Service).db, first.id)).toMatchObject({ id: first.id, }) expect((yield* session.messages({ sessionID })).find((message) => message.id === first.id)).toBeUndefined() @@ -1820,17 +1939,17 @@ describe("SessionRunnerLLM", () => { delivery: "queue", resume: false, }) - expect(yield* SessionPending.has((yield* Database.Service).db, sessionID, "steer")).toBe(false) + expect(yield* SessionInbox.has((yield* Database.Service).db, sessionID, "steer")).toBe(true) yield* stream.release yield* Fiber.join(active) expect(requests).toHaveLength(4) - expect(userTexts(requests[1])[0]).toContain("Create a new anchored summary") - expect(userTexts(requests[2])).toContain("Steer after compaction") - expect(userTexts(requests[2])).toContain("Completion after compaction") + expect(userTexts(requests[1])).toContain("Steer after compaction") + expect(userTexts(requests[1])).toContain("Completion after compaction") + expect(userTexts(requests[2])[0]).toContain("Create a new anchored summary") expect(userTexts(requests[3])).toContain("Queue after compaction") - expect(yield* SessionPending.compaction((yield* Database.Service).db, sessionID)).toBeUndefined() + expect(yield* SessionInbox.find((yield* Database.Service).db, first.id)).toBeUndefined() expect((yield* session.messages({ sessionID })).find((message) => message.id === first.id)).toMatchObject({ type: "compaction", status: "completed", @@ -1865,7 +1984,7 @@ describe("SessionRunnerLLM", () => { expect(requests).toHaveLength(3) expect(userTexts(requests[2])).toContain("Continue after failure") - expect(yield* SessionPending.compaction((yield* Database.Service).db, sessionID)).toBeUndefined() + expect(yield* SessionInbox.find((yield* Database.Service).db, compaction.id)).toBeUndefined() expect((yield* session.messages({ sessionID })).find((message) => message.id === compaction.id)).toMatchObject({ type: "compaction", status: "failed", @@ -1887,7 +2006,7 @@ describe("SessionRunnerLLM", () => { yield* session.resume(sessionID) - expect(yield* SessionPending.compaction((yield* Database.Service).db, sessionID)).toBeUndefined() + expect(yield* SessionInbox.find((yield* Database.Service).db, compaction.id)).toBeUndefined() expect((yield* session.messages({ sessionID })).find((message) => message.id === compaction.id)).toMatchObject({ type: "compaction", status: "failed", @@ -1902,7 +2021,7 @@ describe("SessionRunnerLLM", () => { }), ) - it.effect("manually compacts when the model has no context limit", () => + it.effect("delivers steered manual compaction when the model has no context limit", () => Effect.gen(function* () { const session = yield* setup yield* TestLLM.push(TestLLM.text("Earlier answer", "text-manual-unknown-history")) @@ -1910,7 +2029,7 @@ describe("SessionRunnerLLM", () => { requests.length = 0 yield* TestLLM.push(TestLLM.text("Manual summary", "text-manual-unknown-summary")) - const compaction = yield* session.compact({ sessionID }) + const compaction = yield* session.compact({ sessionID, delivery: "steer" }) yield* session.resume(sessionID) expect(requests).toHaveLength(1) @@ -1979,7 +2098,7 @@ describe("SessionRunnerLLM", () => { yield* session.interrupt(sessionID) yield* Fiber.await(run) - expect(yield* SessionPending.compaction((yield* Database.Service).db, sessionID)).toBeUndefined() + expect(yield* SessionInbox.find((yield* Database.Service).db, compaction.id)).toBeUndefined() expect((yield* session.messages({ sessionID })).find((message) => message.id === compaction.id)).toMatchObject({ type: "compaction", status: "failed", @@ -2000,7 +2119,7 @@ describe("SessionRunnerLLM", () => { expect(yield* Effect.exit(session.resume(sessionID))).toMatchObject({ _tag: "Failure" }) - expect(yield* SessionPending.compaction((yield* Database.Service).db, sessionID)).toBeUndefined() + expect(yield* SessionInbox.find((yield* Database.Service).db, compaction.id)).toBeUndefined() expect((yield* session.messages({ sessionID })).find((message) => message.id === compaction.id)).toMatchObject({ type: "compaction", status: "failed", @@ -2828,7 +2947,7 @@ describe("SessionRunnerLLM", () => { yield* session.interrupt(sessionID) expect(yield* Fiber.await(run)).toMatchObject({ _tag: "Failure" }) expect(requests).toHaveLength(1) - expect(yield* SessionPending.has(db, sessionID, "queue")).toBe(true) + expect(yield* SessionInbox.has(db, sessionID, "queue")).toBe(true) const resumed = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* stream.started yield* stream.release @@ -2858,7 +2977,7 @@ describe("SessionRunnerLLM", () => { yield* session.interrupt(sessionID) expect(yield* Fiber.await(run)).toMatchObject({ _tag: "Failure" }) expect(requests).toHaveLength(1) - expect(yield* SessionPending.has(db, sessionID, "steer")).toBe(true) + expect(yield* SessionInbox.has(db, sessionID, "steer")).toBe(true) const resumed = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* stream.started @@ -3011,7 +3130,7 @@ describe("SessionRunnerLLM", () => { const session = yield* setup const bus = yield* Bus.Service yield* admit(session, "Recover interrupted tool") - yield* SessionPending.promote((yield* Database.Service).db, bus, sessionID, "steer") + yield* SessionInbox.promote((yield* Database.Service).db, bus, sessionID, "steer") const assistantMessageID = SessionMessage.ID.create() yield* bus.publish(SessionEvent.Step.Started, { sessionID, @@ -3068,7 +3187,7 @@ describe("SessionRunnerLLM", () => { const session = yield* setup const bus = yield* Bus.Service yield* admit(session, "Recover interrupted hosted tool") - yield* SessionPending.promote((yield* Database.Service).db, bus, sessionID, "steer") + yield* SessionInbox.promote((yield* Database.Service).db, bus, sessionID, "steer") const assistantMessageID = SessionMessage.ID.create() yield* bus.publish(SessionEvent.Step.Started, { sessionID, @@ -3119,7 +3238,7 @@ describe("SessionRunnerLLM", () => { const session = yield* setup const bus = yield* Bus.Service yield* admit(session, "Recover interrupted tool input") - yield* SessionPending.promote((yield* Database.Service).db, bus, sessionID, "steer") + yield* SessionInbox.promote((yield* Database.Service).db, bus, sessionID, "steer") const assistantMessageID = SessionMessage.ID.create() yield* bus.publish(SessionEvent.Step.Started, { sessionID, @@ -3172,7 +3291,7 @@ describe("SessionRunnerLLM", () => { const bus = yield* Bus.Service const defect = new Error("fail after prompt promotion") let fail = true - yield* bus.project(SessionEvent.InputPromoted, () => (fail ? Effect.die(defect) : Effect.void)) + yield* bus.project(SessionEvent.InboxDelivered, () => (fail ? Effect.die(defect) : Effect.void)) yield* admit(session, "Recover promoted input") expect(yield* session.resume(sessionID).pipe(Effect.catchDefect(Effect.succeed))).toBe(defect) @@ -3194,7 +3313,7 @@ describe("SessionRunnerLLM", () => { const session = yield* setup const bus = yield* Bus.Service yield* bus.listen((event) => - event.type === SessionEvent.InputPromoted.type + event.type === SessionEvent.InboxDelivered.type ? Effect.die("fail after prompt promotion commits") : Effect.void, ) @@ -3947,7 +4066,7 @@ describe("SessionRunnerLLM", () => { }), ) - it.effect("retries eligible pre-output failures after exponential backoff", () => + it.effect("bounds jittered exponential backoff for eligible pre-output failures", () => Effect.gen(function* () { const session = yield* setup yield* admit(session, "Retry transport") @@ -3956,9 +4075,9 @@ describe("SessionRunnerLLM", () => { const run = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* TestLLM.wait(1) - yield* TestClock.adjust("1999 millis") + yield* TestClock.adjust("1599 millis") expect(requests).toHaveLength(1) - yield* TestClock.adjust("1 millis") + yield* TestClock.adjust("801 millis") yield* Fiber.join(run) expect(requests).toHaveLength(2) @@ -3983,7 +4102,7 @@ describe("SessionRunnerLLM", () => { const run = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* TestLLM.wait(1) - yield* TestClock.adjust("2 seconds") + yield* TestClock.adjust("2400 millis") yield* Fiber.join(run) expect(requests).toHaveLength(2) @@ -4028,7 +4147,7 @@ describe("SessionRunnerLLM", () => { const run = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* TestLLM.wait(1) - yield* TestClock.adjust("2 seconds") + yield* TestClock.adjust("2400 millis") yield* Fiber.join(run) expect(requests).toHaveLength(2) @@ -4085,7 +4204,7 @@ describe("SessionRunnerLLM", () => { const run = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* TestLLM.wait(1) - yield* TestClock.adjust("2 seconds") + yield* TestClock.adjust("2400 millis") yield* Fiber.join(run) expect(requests[1]?.messages.at(-2)).toMatchObject({ @@ -4126,7 +4245,7 @@ describe("SessionRunnerLLM", () => { const run = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* TestLLM.wait(1) while (!(yield* recordedEventTypes(sessionID)).includes("session.retry.scheduled.1")) yield* Effect.yieldNow - yield* TestClock.adjust("2 seconds") + yield* TestClock.adjust("2400 millis") yield* Fiber.join(run) expect(executions).toEqual(["settled"]) @@ -4165,7 +4284,7 @@ describe("SessionRunnerLLM", () => { const run = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* TestLLM.wait(1) while (!(yield* recordedEventTypes(sessionID)).includes("session.retry.scheduled.1")) yield* Effect.yieldNow - yield* TestClock.adjust("2 seconds") + yield* TestClock.adjust("2400 millis") yield* Fiber.join(run) expect(messageRoles(requests[1])).toEqual(["user", "assistant", "tool", "user"]) @@ -4203,7 +4322,7 @@ describe("SessionRunnerLLM", () => { const run = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* TestLLM.wait(1) - for (const [index, delay] of [2_000, 4_000, 8_000, 16_000].entries()) { + for (const [index, delay] of [2_400, 4_800, 9_600, 19_200].entries()) { yield* TestClock.adjust(delay) yield* TestLLM.wait(index + 2) } @@ -4224,7 +4343,7 @@ describe("SessionRunnerLLM", () => { const run = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* TestLLM.wait(1) - for (const [index, delay] of [2_000, 4_000, 8_000, 16_000].entries()) { + for (const [index, delay] of [2_400, 4_800, 9_600, 19_200].entries()) { yield* TestClock.adjust(delay) yield* TestLLM.wait(index + 2) } @@ -4239,12 +4358,15 @@ describe("SessionRunnerLLM", () => { .orderBy(asc(EventTable.seq)) .all() .pipe(Effect.orDie) - expect(retries.map((event) => event.data)).toMatchObject([ - { attempt: 2, at: 2_000 }, - { attempt: 3, at: 6_000 }, - { attempt: 4, at: 14_000 }, - { attempt: 5, at: 30_000 }, - ]) + for (const [index, range] of [ + [1_600, 2_400], + [4_800, 7_200], + [11_200, 16_800], + [24_000, 36_000], + ].entries()) { + expect(retries[index]?.data.at).toBeGreaterThanOrEqual(range[0]!) + expect(retries[index]?.data.at).toBeLessThanOrEqual(range[1]!) + } expect((yield* recordedEventTypes(sessionID)).filter((type) => type === "session.step.started.1")).toHaveLength(5) const assistant = requireAssistant(yield* session.context(sessionID)) expect(yield* recordedStepSettlementEvents(sessionID, assistant.id)).toMatchObject([ @@ -4274,7 +4396,7 @@ describe("SessionRunnerLLM", () => { const run = yield* session.resume(sessionID).pipe(Effect.forkChild) yield* TestLLM.wait(1) - yield* TestClock.adjust("2 seconds") + yield* TestClock.adjust("2400 millis") yield* Fiber.join(run) expect(requests).toHaveLength(3) diff --git a/packages/core/test/session-skill.test.ts b/packages/core/test/session-skill.test.ts index f949be452d6..db30e530611 100644 --- a/packages/core/test/session-skill.test.ts +++ b/packages/core/test/session-skill.test.ts @@ -15,7 +15,7 @@ import { SessionExecution } from "@opencode-ai/core/session/execution" import { SessionMessage } from "@opencode-ai/core/session/message" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionStore } from "@opencode-ai/core/session/store" -import { SessionPending } from "@opencode-ai/core/session/pending" +import { SessionInbox } from "@opencode-ai/core/session/inbox" import { Skill } from "@opencode-ai/core/skill" import { testEffect } from "./lib/effect" @@ -71,7 +71,7 @@ describe("Session.skill", () => { skills: [{ id: Skill.ID.make("effect"), mention: { start: 20, end: 27, text: "/effect" } }], resume: false, }) - yield* SessionPending.promote(database.db, bus, session.id, "steer") + yield* SessionInbox.promote(database.db, bus, session.id, "steer") expect(yield* sessions.messages({ sessionID: session.id })).toContainEqual( expect.objectContaining({ diff --git a/packages/core/test/session-title.test.ts b/packages/core/test/session-title.test.ts index 9a537f02f55..b32e98e5ea6 100644 --- a/packages/core/test/session-title.test.ts +++ b/packages/core/test/session-title.test.ts @@ -114,14 +114,14 @@ const prompt = (sessionID: Session.ID, text: string) => Effect.gen(function* () { const bus = yield* Bus.Service const messageID = SessionMessage.ID.create() - yield* bus.publish(SessionEvent.InputAdmitted, { + yield* bus.publish(SessionEvent.InboxEnqueued, { sessionID, - inputID: messageID, - input: { type: "user", data: { text }, delivery: "steer" }, + inboxID: messageID, + item: { type: "user", payload: { text }, delivery: "steer" }, }) - yield* bus.publish(SessionEvent.InputPromoted, { + yield* bus.publish(SessionEvent.InboxDelivered, { sessionID, - inputID: messageID, + inboxID: messageID, }) }) diff --git a/packages/core/test/shared-schema.test.ts b/packages/core/test/shared-schema.test.ts index db01613be70..7b2bda8d5fb 100644 --- a/packages/core/test/shared-schema.test.ts +++ b/packages/core/test/shared-schema.test.ts @@ -9,7 +9,7 @@ import { Project } from "@opencode-ai/schema/project" import { ProjectDirectories } from "@opencode-ai/schema/project-directories" import { PermissionV1 } from "@opencode-ai/schema/permission-v1" import { Prompt } from "@opencode-ai/schema/prompt" -import { SessionPending } from "@opencode-ai/schema/session-pending" +import { SessionInbox } from "@opencode-ai/schema/session-inbox" import { SessionMessage } from "@opencode-ai/schema/session-message" import { Workspace } from "@opencode-ai/schema/workspace" import { Command } from "@opencode-ai/schema/command" @@ -44,7 +44,7 @@ test("Core reuses the canonical shared schemas", async () => { coreProject, coreProvider, coreReference, - coreSessionPending, + coreSessionInbox, coreSessionMessage, coreSkill, coreSchema, @@ -65,7 +65,7 @@ test("Core reuses the canonical shared schemas", async () => { import("@opencode-ai/core/project/schema"), import("@opencode-ai/core/provider"), import("@opencode-ai/core/reference"), - import("@opencode-ai/core/session/pending"), + import("@opencode-ai/core/session/inbox"), import("@opencode-ai/core/session/message"), import("@opencode-ai/core/skill"), import("@opencode-ai/core/schema"), @@ -126,10 +126,10 @@ test("Core reuses the canonical shared schemas", async () => { [Session.ID, schemaSession.Session.ID], [Session.Info, schemaSession.Session.Info], [Session.ListAnchor, schemaSession.Session.ListAnchor], - [coreSessionPending.Delivery, SessionPending.Delivery], - [coreSessionPending.Message, SessionPending.Message], - [coreSessionPending.User, SessionPending.User], - [coreSessionPending.Synthetic, SessionPending.Synthetic], + [coreSessionInbox.Delivery, SessionInbox.Delivery], + [coreSessionInbox.Item, SessionInbox.Item], + [coreSessionInbox.User, SessionInbox.User], + [coreSessionInbox.Synthetic, SessionInbox.Synthetic], [coreSessionMessage.ID, SessionMessage.ID], [coreSessionMessage.AssistantRetry, SessionMessage.AssistantRetry], [coreSessionMessage.AgentSelected, SessionMessage.AgentSelected], diff --git a/packages/core/test/snapshot.test.ts b/packages/core/test/snapshot.test.ts index 678f68313e4..09269a9f60e 100644 --- a/packages/core/test/snapshot.test.ts +++ b/packages/core/test/snapshot.test.ts @@ -143,44 +143,47 @@ describe("Snapshot", () => { ), ) - testEffect(Layer.empty).live("isolates snapshot indexes by canonical Git worktree", () => - Effect.acquireUseRelease( - Effect.promise(() => tmpdir()), - (tmp) => - Effect.gen(function* () { - const project = path.join(tmp.path, "project") - const linked = path.join(tmp.path, "linked") - yield* Effect.promise(async () => { - await fs.mkdir(project) - await fs.writeFile(path.join(project, "tracked.txt"), "main\n") - await initGit(project, true) - await $`git -c core.fsmonitor=false worktree add --detach ${linked} HEAD`.cwd(project).quiet() - }) + testEffect(Layer.empty).live( + "isolates snapshot indexes by canonical Git worktree", + () => + Effect.acquireUseRelease( + Effect.promise(() => tmpdir()), + (tmp) => + Effect.gen(function* () { + const project = path.join(tmp.path, "project") + const linked = path.join(tmp.path, "linked") + yield* Effect.promise(async () => { + await fs.mkdir(project) + await fs.writeFile(path.join(project, "tracked.txt"), "main\n") + await initGit(project, true) + await $`git -c core.fsmonitor=false worktree add --detach ${linked} HEAD`.cwd(project).quiet() + }) - const capture = (directory: string) => - Effect.gen(function* () { - const snapshot = yield* Snapshot.Service - return yield* snapshot.capture() - }).pipe(Effect.provide(snapshotLayer(tmp.path, directory))) - expect(yield* capture(project)).toBeDefined() - expect(yield* capture(linked)).toBeDefined() + const capture = (directory: string) => + Effect.gen(function* () { + const snapshot = yield* Snapshot.Service + return yield* snapshot.capture() + }).pipe(Effect.provide(snapshotLayer(tmp.path, directory))) + expect(yield* capture(project)).toBeDefined() + expect(yield* capture(linked)).toBeDefined() - const projectID = yield* Effect.gen(function* () { - return (yield* Location.Service).project.id - }).pipe( - Effect.provide( - AppNodeBuilder.build(Location.boundNode(Location.Ref.make({ directory: AbsolutePath.make(project) }))), - ), - ) - expect( - yield* Effect.promise(() => fs.stat(path.join(tmp.path, "snapshot", projectID, Hash.fast(project)))), - ).toBeDefined() - expect( - yield* Effect.promise(() => fs.stat(path.join(tmp.path, "snapshot", projectID, Hash.fast(linked)))), - ).toBeDefined() - }), - (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()), - ), + const projectID = yield* Effect.gen(function* () { + return (yield* Location.Service).project.id + }).pipe( + Effect.provide( + AppNodeBuilder.build(Location.boundNode(Location.Ref.make({ directory: AbsolutePath.make(project) }))), + ), + ) + expect( + yield* Effect.promise(() => fs.stat(path.join(tmp.path, "snapshot", projectID, Hash.fast(project)))), + ).toBeDefined() + expect( + yield* Effect.promise(() => fs.stat(path.join(tmp.path, "snapshot", projectID, Hash.fast(linked)))), + ).toBeDefined() + }), + (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()), + ), + { timeout: 15_000 }, ) }) diff --git a/packages/core/test/sqlite-workerd.test.ts b/packages/core/test/sqlite-workerd.test.ts index 64194b04187..e539b5efe8a 100644 --- a/packages/core/test/sqlite-workerd.test.ts +++ b/packages/core/test/sqlite-workerd.test.ts @@ -1,63 +1,19 @@ import { describe, expect, test } from "bun:test" -import { Database } from "bun:sqlite" import { Effect, Layer } from "effect" import { SqlClient } from "effect/unstable/sql" import { SqlError } from "effect/unstable/sql/SqlError" import { sqliteLayer } from "@opencode-ai/core/database/sqlite.workerd" import type { DurableObjectStorage } from "@opencode-ai/core/database/sqlite.workerd" +import { makeDurableObjectStorage } from "./fixture/durable-object-storage" import { tempGlobalLayer } from "./fixture/global" -// Emulates the Durable Object storage API over bun:sqlite so the adapter can -// be verified without workerd or Cloudflare runtime dependencies. -const makeFakeStorage = () => { - const native = new Database(":memory:") - const toSqlStorageValue = (value: unknown) => { - if (!(value instanceof Uint8Array)) return value as ArrayBuffer | string | number | null - const buffer = new ArrayBuffer(value.byteLength) - new Uint8Array(buffer).set(value) - return buffer - } - const storage: DurableObjectStorage = { - sql: { - exec(query: string, ...bindings: Array) { - const statement = native.query(query) - const rows = (statement.values(...(bindings as never[])) ?? []).map((row) => row.map(toSqlStorageValue)) - const columnNames = statement.columnNames - return { - columnNames, - raw: () => rows[Symbol.iterator](), - toArray: () => rows.map((row) => Object.fromEntries(columnNames.map((name, i) => [name, row[i]]))), - } - }, - }, - transaction(closure: (txn: { rollback(): void }) => Promise): Promise { - native.run("BEGIN") - let rolledBack = false - return closure({ rollback: () => (rolledBack = true) }).then( - (result) => { - native.run(rolledBack ? "ROLLBACK" : "COMMIT") - return result - }, - (error) => { - native.run("ROLLBACK") - throw error - }, - ) - }, - transactionSync(closure: () => T): T { - return native.transaction(closure)() - }, - } - return storage -} - const run = (storage: DurableObjectStorage, effect: Effect.Effect) => Effect.runPromise(effect.pipe(Effect.provide(sqliteLayer({ storage })), Effect.scoped)) describe("sqlite.workerd", () => { test("executes statements with bindings and maps rows to records", async () => { const rows = await run( - makeFakeStorage(), + makeDurableObjectStorage(), Effect.gen(function* () { const sql = yield* SqlClient.SqlClient yield* sql`CREATE TABLE item (id INTEGER PRIMARY KEY, name TEXT NOT NULL)` @@ -73,7 +29,7 @@ describe("sqlite.workerd", () => { test("normalizes ArrayBuffer blob values to Uint8Array", async () => { const rows = await run( - makeFakeStorage(), + makeDurableObjectStorage(), Effect.gen(function* () { const sql = yield* SqlClient.SqlClient yield* sql`CREATE TABLE blob (data BLOB NOT NULL)` @@ -86,7 +42,7 @@ describe("sqlite.workerd", () => { }) test("withTransaction commits on success and rolls back on failure", async () => { - const storage = makeFakeStorage() + const storage = makeDurableObjectStorage() const count = await run( storage, Effect.gen(function* () { @@ -109,7 +65,7 @@ describe("sqlite.workerd", () => { test("nested withTransaction fails with SqlError", async () => { const error = await run( - makeFakeStorage(), + makeDurableObjectStorage(), Effect.gen(function* () { const sql = yield* SqlClient.SqlClient yield* sql`CREATE TABLE t (value TEXT NOT NULL)` @@ -122,7 +78,7 @@ describe("sqlite.workerd", () => { }) test("boots the full database layer with migrations over injected storage", async () => { - const storage = makeFakeStorage() + const storage = makeDurableObjectStorage() const core = await import("@opencode-ai/core/database/database") await Effect.runPromise( Effect.scoped( diff --git a/packages/core/test/tool-edit.test.ts b/packages/core/test/tool-edit.test.ts index e730ebf53dd..10bb94f8179 100644 --- a/packages/core/test/tool-edit.test.ts +++ b/packages/core/test/tool-edit.test.ts @@ -4,7 +4,7 @@ import { describe, expect } from "bun:test" import { Effect, Layer } from "effect" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNode } from "@opencode-ai/util/effect/layer-node" -import { Environment } from "@opencode-ai/core/environment" +import { Environment } from "@opencode-ai/core/environment/index" import { FileMutation } from "@opencode-ai/core/file-mutation" import { Formatter } from "@opencode-ai/core/formatter" import { Location } from "@opencode-ai/core/location" diff --git a/packages/core/test/tool-patch.test.ts b/packages/core/test/tool-patch.test.ts index 5a08fc8dfc6..9c1cc590905 100644 --- a/packages/core/test/tool-patch.test.ts +++ b/packages/core/test/tool-patch.test.ts @@ -4,7 +4,7 @@ import { describe, expect } from "bun:test" import { Effect, Exit, Layer, Schema } from "effect" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNode } from "@opencode-ai/util/effect/layer-node" -import { Environment } from "@opencode-ai/core/environment" +import { Environment } from "@opencode-ai/core/environment/index" import { FSUtil } from "@opencode-ai/util/fs-util" import { Formatter } from "@opencode-ai/core/formatter" import { FileMutation } from "@opencode-ai/core/file-mutation" diff --git a/packages/core/test/tool-read-filesystem.test.ts b/packages/core/test/tool-read-filesystem.test.ts index 624258e0ce5..5c313f9229e 100644 --- a/packages/core/test/tool-read-filesystem.test.ts +++ b/packages/core/test/tool-read-filesystem.test.ts @@ -1,7 +1,7 @@ import { describe, expect } from "bun:test" import fs from "fs/promises" import path from "path" -import { Environment } from "@opencode-ai/core/environment" +import { Environment } from "@opencode-ai/core/environment/index" import { AbsolutePath } from "@opencode-ai/core/schema" import { ReadToolFileSystem } from "@opencode-ai/core/tool/read-filesystem" import { CrossSpawnSpawner } from "@opencode-ai/util/cross-spawn-spawner" diff --git a/packages/core/test/tool-read.test.ts b/packages/core/test/tool-read.test.ts index b2d2f091b32..de490f57eb8 100644 --- a/packages/core/test/tool-read.test.ts +++ b/packages/core/test/tool-read.test.ts @@ -21,7 +21,7 @@ import { ReadTool } from "@opencode-ai/core/tool/plugin/read" import { ReadToolFileSystem } from "@opencode-ai/core/tool/read-filesystem" import { makeLocationNode } from "@opencode-ai/util/effect/app-node" import { SessionInstructions } from "@opencode-ai/core/session/instructions" -import { Environment } from "@opencode-ai/core/environment" +import { Environment } from "@opencode-ai/core/environment/index" import { testEffect } from "./lib/effect" import { toolIdentity, executeTool, registerToolPlugin, toolDefinitions } from "./lib/tool" diff --git a/packages/core/test/tool-search.test.ts b/packages/core/test/tool-search.test.ts index 03d195a0e4c..a87c45cd883 100644 --- a/packages/core/test/tool-search.test.ts +++ b/packages/core/test/tool-search.test.ts @@ -5,7 +5,7 @@ import { Effect, Layer } from "effect" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { makeLocationNode } from "@opencode-ai/util/effect/app-node" import { LayerNode } from "@opencode-ai/util/effect/layer-node" -import { Environment } from "@opencode-ai/core/environment" +import { Environment } from "@opencode-ai/core/environment/index" import { FileSystem } from "@opencode-ai/core/filesystem" import { Location } from "@opencode-ai/core/location" import { LocationMutation } from "@opencode-ai/core/location-mutation" diff --git a/packages/core/test/tool-shell.test.ts b/packages/core/test/tool-shell.test.ts index ca982164814..0e6ac46cb2e 100644 --- a/packages/core/test/tool-shell.test.ts +++ b/packages/core/test/tool-shell.test.ts @@ -12,7 +12,7 @@ import { filesystem } from "@opencode-ai/util/effect/app-node-platform" import { Database } from "@opencode-ai/core/database/database" import { Bus } from "@opencode-ai/core/bus" import { Config } from "@opencode-ai/core/config" -import { Environment } from "@opencode-ai/core/environment" +import { Environment } from "@opencode-ai/core/environment/index" import { FSUtil } from "@opencode-ai/util/fs-util" import { Global } from "@opencode-ai/util/global" import { Location } from "@opencode-ai/core/location" @@ -387,57 +387,63 @@ describe("ShellTool", () => { ), ) - it.live("approves an explicit external workdir before shell execution", () => - Effect.acquireUseRelease( - Effect.promise(() => Promise.all([tmpdir(), tmpdir()])), - ([active, outside]) => { - reset() - return withSession(active.path, (registry) => - executeTool(registry, call({ command: cwdCommand, workdir: outside.path })), - ).pipe( - Effect.andThen( - Effect.sync(() => { - expect(assertions.map((item) => item.action)).toEqual(["external_directory", "shell"]) - expect(assertions[0]).toMatchObject({ - resources: [path.join(realpathSync(outside.path), "*").replaceAll("\\", "/")], - }) - }), + it.live( + "approves an explicit external workdir before shell execution", + () => + Effect.acquireUseRelease( + Effect.promise(() => Promise.all([tmpdir(), tmpdir()])), + ([active, outside]) => { + reset() + return withSession(active.path, (registry) => + executeTool(registry, call({ command: cwdCommand, workdir: outside.path })), + ).pipe( + Effect.andThen( + Effect.sync(() => { + expect(assertions.map((item) => item.action)).toEqual(["external_directory", "shell"]) + expect(assertions[0]).toMatchObject({ + resources: [path.join(realpathSync(outside.path), "*").replaceAll("\\", "/")], + }) + }), + ), + ) + }, + ([active, outside]) => + Effect.promise(() => + Promise.all([active[Symbol.asyncDispose](), outside[Symbol.asyncDispose]()]).then(() => undefined), ), - ) - }, - ([active, outside]) => - Effect.promise(() => - Promise.all([active[Symbol.asyncDispose](), outside[Symbol.asyncDispose]()]).then(() => undefined), - ), - ), + ), + { timeout: 15_000 }, ) - it.live("approves an external directory used by a directory-change command", () => - Effect.acquireUseRelease( - Effect.promise(() => Promise.all([tmpdir(), tmpdir()])), - ([active, outside]) => { - reset() - const command = isWindows - ? `Set-Location -LiteralPath '${outside.path}'; (Get-Location).Path` - : `cd '${outside.path}' && pwd` - return withSession(active.path, (registry) => - executeTool(registry, call({ command }, "call-external-cd")), - ).pipe( - Effect.andThen( - Effect.sync(() => { - expect(assertions.map((item) => item.action)).toEqual(["external_directory", "shell"]) - expect(assertions[0]).toMatchObject({ - resources: [path.join(realpathSync(outside.path), "*").replaceAll("\\", "/")], - }) - }), + it.live( + "approves an external directory used by a directory-change command", + () => + Effect.acquireUseRelease( + Effect.promise(() => Promise.all([tmpdir(), tmpdir()])), + ([active, outside]) => { + reset() + const command = isWindows + ? `Set-Location -LiteralPath '${outside.path}'; (Get-Location).Path` + : `cd '${outside.path}' && pwd` + return withSession(active.path, (registry) => + executeTool(registry, call({ command }, "call-external-cd")), + ).pipe( + Effect.andThen( + Effect.sync(() => { + expect(assertions.map((item) => item.action)).toEqual(["external_directory", "shell"]) + expect(assertions[0]).toMatchObject({ + resources: [path.join(realpathSync(outside.path), "*").replaceAll("\\", "/")], + }) + }), + ), + ) + }, + ([active, outside]) => + Effect.promise(() => + Promise.all([active[Symbol.asyncDispose](), outside[Symbol.asyncDispose]()]).then(() => undefined), ), - ) - }, - ([active, outside]) => - Effect.promise(() => - Promise.all([active[Symbol.asyncDispose](), outside[Symbol.asyncDispose]()]).then(() => undefined), - ), - ), + ), + { timeout: 15_000 }, ) it.live("approves an expanded external home directory", () => @@ -459,28 +465,31 @@ describe("ShellTool", () => { ), ) - it.live("does not execute after external-directory or shell denial", () => - Effect.acquireUseRelease( - Effect.promise(() => Promise.all([tmpdir(), tmpdir()])), - ([active, outside]) => - Effect.gen(function* () { - reset() - denyAction = "external_directory" - yield* withSession(active.path, (registry) => - executeTool(registry, call({ command: cwdCommand, workdir: outside.path })), - ) - expect(assertions.map((item) => item.action)).toEqual(["external_directory"]) + it.live( + "does not execute after external-directory or shell denial", + () => + Effect.acquireUseRelease( + Effect.promise(() => Promise.all([tmpdir(), tmpdir()])), + ([active, outside]) => + Effect.gen(function* () { + reset() + denyAction = "external_directory" + yield* withSession(active.path, (registry) => + executeTool(registry, call({ command: cwdCommand, workdir: outside.path })), + ) + expect(assertions.map((item) => item.action)).toEqual(["external_directory"]) - reset() - denyAction = "shell" - yield* withSession(active.path, (registry) => executeTool(registry, call({ command: cwdCommand }))) - expect(assertions.map((item) => item.action)).toEqual(["shell"]) - }), - ([active, outside]) => - Effect.promise(() => - Promise.all([active[Symbol.asyncDispose](), outside[Symbol.asyncDispose]()]).then(() => undefined), - ), - ), + reset() + denyAction = "shell" + yield* withSession(active.path, (registry) => executeTool(registry, call({ command: cwdCommand }))) + expect(assertions.map((item) => item.action)).toEqual(["shell"]) + }), + ([active, outside]) => + Effect.promise(() => + Promise.all([active[Symbol.asyncDispose](), outside[Symbol.asyncDispose]()]).then(() => undefined), + ), + ), + { timeout: 15_000 }, ) it.live("keeps non-zero exits useful", () => @@ -619,7 +628,7 @@ describe("ShellTool", () => { }, (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]().then(() => undefined)), ), - { timeout: 10_000 }, + { timeout: 15_000 }, ) it.live( @@ -630,7 +639,7 @@ describe("ShellTool", () => { (tmp) => { reset() return withSession(tmp.path, (registry) => - executeTool(registry, call({ command: timeoutOutputCommand, timeout: isWindows ? 3_000 : 50 })), + executeTool(registry, call({ command: timeoutOutputCommand, timeout: isWindows ? 3_000 : 500 })), ).pipe( Effect.andThen((settled) => Effect.sync(() => { @@ -660,8 +669,8 @@ describe("ShellTool", () => { return withSession(tmp.path, (registry) => Effect.gen(function* () { const bus = yield* Bus.Service - const admitted = yield* bus.subscribe(SessionEvent.InputAdmitted).pipe( - Stream.filter((event) => event.data.sessionID === sessionID && event.data.input.type === "synthetic"), + const admitted = yield* bus.subscribe(SessionEvent.InboxEnqueued).pipe( + Stream.filter((event) => event.data.sessionID === sessionID && event.data.item.type === "synthetic"), Stream.runHead, Effect.forkScoped({ startImmediately: true }), ) @@ -675,7 +684,7 @@ describe("ShellTool", () => { const id = ShellSchema.ID.make(shellID) expect((yield* shell.list()).map((info) => info.id)).toContain(id) expect((yield* shell.wait(id)).status).toBe("timeout") - expect((yield* Fiber.join(admitted)).valueOrUndefined?.data.input.data).toMatchObject({ + expect((yield* Fiber.join(admitted)).valueOrUndefined?.data.item.payload).toMatchObject({ description: idleCommand, metadata: { source: "shell", diff --git a/packages/core/test/tool-subagent.test.ts b/packages/core/test/tool-subagent.test.ts index 4317f383090..9e970eb7be2 100644 --- a/packages/core/test/tool-subagent.test.ts +++ b/packages/core/test/tool-subagent.test.ts @@ -19,7 +19,7 @@ import { LocationServiceMap } from "@opencode-ai/core/location-service-map" import { Session } from "@opencode-ai/core/session" import { SessionEvent } from "@opencode-ai/core/session/event" import { SessionExecution } from "@opencode-ai/core/session/execution" -import { SessionPending } from "@opencode-ai/core/session/pending" +import { SessionInbox } from "@opencode-ai/core/session/inbox" import { SessionMessage } from "@opencode-ai/core/session/message" import { SessionRunnerModel } from "@opencode-ai/core/session/runner/model" import { SessionStore } from "@opencode-ai/core/session/store" @@ -304,7 +304,7 @@ describe("SubagentTool", () => { agent: "reviewer", model: childModel, }) - expect((yield* sessions.pending(child.id)).find((message) => message.type === "user")?.data.text).toBe( + expect((yield* sessions.inbox(child.id)).find((message) => message.type === "user")?.payload.text).toBe( "You are a subagent spawned by another session.\nreview this", ) @@ -376,8 +376,8 @@ describe("SubagentTool", () => { const locations = yield* LocationServiceMap.Service const registry = yield* Tool.Service.pipe(Effect.provide(locations.get(parent.location))) const bus = yield* Bus.Service - const admitted = yield* bus.subscribe(SessionEvent.InputAdmitted).pipe( - Stream.filter((event) => event.data.sessionID === parent.id && event.data.input.type === "synthetic"), + const admitted = yield* bus.subscribe(SessionEvent.InboxEnqueued).pipe( + Stream.filter((event) => event.data.sessionID === parent.id && event.data.item.type === "synthetic"), Stream.take(1), Stream.runCollect, Effect.forkScoped({ startImmediately: true }), @@ -401,8 +401,10 @@ describe("SubagentTool", () => { expect(settled.content).toEqual([{ type: "text", text: expect.stringContaining(`id: ${childID}`) }]) const admission = Array.from(yield* Fiber.join(admitted))[0] - expect(admission?.data.input.data.text).toContain(` { }, }) const database = yield* Database.Service - yield* SessionPending.promote(database.db, bus, parent.id, "steer") + yield* SessionInbox.promote(database.db, bus, parent.id, "steer") const synthetic = (yield* sessions.context(parent.id)).filter((message) => message.type === "synthetic") expect(synthetic).toHaveLength(1) expect(synthetic[0]?.text).toContain(` ui.screenshot("home")) +``` + +```sh +opencode-drive run ./drive.ts +``` + +`run` accepts exactly one module path. It rejects `--command.*` flags, other +command flags, and application arguments after `--`. Backend and UI behavior +belongs in the Effect program. + +`OpenCodeDriver.use` is the safe default. It owns the scope, observes backend +failure, settles queued LLM work, closes every TUI, and exports recordings +whether the program succeeds or fails: + +```ts +import { Effect } from "effect" +import { Llm, OpenCodeDriver } from "opencode-drive" + +export default OpenCodeDriver.use( + { + project: { + git: true, + files: { "src/value.ts": "export const value = 1\n" }, + }, + }, + ({ ui, llm }) => + Effect.gen(function* () { + yield* llm.queue(Llm.text("The value is 1.")) + yield* ui.submit("Read src/value.ts") + yield* ui.waitFor("The value is 1.") + }), +) +``` + +Use `OpenCodeDriver.useReport` when the program also needs structured evidence. +It returns the program value plus a schema-validated report containing branded +artifact and recording paths, retention, and the negotiated or legacy +compatibility of every simulation endpoint: + +```ts +const result = yield * OpenCodeDriver.useReport(options, program) +yield * Effect.log(result.report) +``` + +Drive prefers `simulation.handshake` and explicitly records legacy fallback. +Require negotiation when protocol skew must fail before the program runs: + +```ts +OpenCodeDriver.use( + { + opencode: { compatibility: "required" }, + }, + program, +) +``` + +Additional TUIs share the same server and LLM controller: + +```ts +import { Effect } from "effect" +import { OpenCodeDriver } from "opencode-drive" + +export default OpenCodeDriver.use((oc) => + Effect.gen(function* () { + const secondary = yield* oc.tuis.launch({ + viewport: { cols: 120, rows: 40 }, + }) + yield* oc.ui.screenshot("primary") + yield* secondary.ui.screenshot("secondary") + }), +) +``` + +The generated OpenCode SDK client is exposed as `opencode`; launched frontend +processes are `tui` and `tuis`. This keeps SDK calls distinct from terminal UI +control: + +```ts +const health = yield * opencode.health.get() +const frame = yield * tui.ui.capture() +``` + +Enable recording per TUI. Settlement finishes each timeline and exports its +video automatically: + +```ts +import { Effect } from "effect" +import { OpenCodeDriver } from "opencode-drive" + +export default OpenCodeDriver.use({ tui: { recording: true } }, (oc) => + Effect.gen(function* () { + yield* oc.ui.screenshot("recorded-home") + yield* Effect.log(`recording will be exported to ${oc.tui.recording?.path}`) + }), +) +``` + +Settlement errors are program failures. For example, output after a terminal +LLM event fails the run while `use` still closes TUIs and attempts recording +export: + +```ts +import { Effect } from "effect" +import { Llm, OpenCodeDriver } from "opencode-drive" + +export default OpenCodeDriver.use(({ ui, llm }) => + Effect.gen(function* () { + yield* llm.queue(Llm.finish(), Llm.text("too late")) + yield* ui.submit("trigger a response") + }), +) +``` + +Use `OpenCodeDriver.make` only when the program needs explicit terminal +settlement. It requires a scope, and `driver.settle()` must run before leaving +that scope: + +```ts +import { Effect } from "effect" +import { OpenCodeDriver } from "opencode-drive" + +export default Effect.scoped( + Effect.gen(function* () { + const driver = yield* OpenCodeDriver.make() + yield* driver.ui.screenshot("home") + yield* driver.settle() + }), +) +``` + +Use `opencode-drive check ./drive.ts` and `start --script` for the Effect-native +`defineScript` workflow described below. + +## OpenCode development + +Run this: + +```sh +OPENCODE_DRIVE=1 bun run dev +``` + +If you installed the skill file, OpenCode will be able to see and interact with the running instance. + +## Using with agents + +Install the skill file above and ask the agent to test various flows with the app. Start with `--record` when you want a video; `opencode-drive stop` then exports the complete session and prints its path. + +Screenshots and videos are written beneath `/opencode-drive/output//`, so named outputs cannot overwrite media from earlier runs or restarts. Set `OPENCODE_DRIVE_MEDIA_DIR` to use a different media root. + +Captured frames use the official full Commit Mono v1.143 faces at 16px with bundled Noto Symbols, Symbols 2, and Math fallbacks in a fixed 10x20 cell grid. Set `OPENCODE_DRIVE_FONT` to a comma-separated list of font files (for example regular, bold, italic, and bold-italic faces) to use a different primary capture font without changing the symbol fallback or cell geometry. + +## UI development + +If you are doing UI development in OpenCode, you might want to run it in a simulated mode. This allows `opencode-drive` to drive it and always put it into a state that you want to see. + +Run it in visible mode: + +```sh +opencode-drive start --visible --dev ~/projects/opencode +``` + +Initialize first when you need to customize the isolated environment before OpenCode starts: + +```sh +artifacts=$(opencode-drive init --name demo) +cp -R ./fixtures/home/. "$artifacts/" +cp -R ./fixtures/project/. "$artifacts/files/" +opencode-drive start --name demo --visible --dev ~/projects/opencode +``` + +`start` reuses the prepared artifacts for that name. If `init` was not run, `start` initializes them automatically. + +Drive uses an in-memory OpenCode database by default. Set +`OPENCODE_DRIVE_DB` when a test restarts the OpenCode service and needs sessions +to survive the replacement process. Relative paths resolve inside the isolated +run's OpenCode data directory: + +```sh +OPENCODE_DRIVE_DB=restart.sqlite \ + opencode-drive start --name restart-demo --script ./restart.ts +``` + +Remove artifact directories left by sessions that are no longer active: + +```sh +opencode-drive prune +``` + +Prune one inactive instance's artifacts by instance name, or force removal of all artifact directories: + +```sh +opencode-drive prune --name demo +opencode-drive prune --force +``` + +While developing, you can run `opencode-drive restart` to restart only the UI (the server will persist as a separate process). Do this with agents, and they will always restart and get the UI where you want it to be automatically. + +View the [skills file](https://github.com/anomalyco/opencode/blob/v2/.opencode/skills/opencode-drive/SKILL.md) for more details about the CLI. + +## Effect script API + +Scripted runs use one fully typed, Effect-only definition. `setup` and `run` +return Effects; Promise callbacks are not part of the API: + +```sh +opencode-drive script init ./drive.ts +``` + +This creates a canonical starter without overwriting an existing file. The +generated script is ready for `opencode-drive check ./drive.ts` and +`start --script ./drive.ts`. + +```ts +import { defineScript, Effect, Llm } from "opencode-drive" + +export default defineScript({ + config: { + autoupdate: false, + }, + tuiConfig: { + theme: "system", + }, + project: { + git: true, + files: { + "src/example.ts": "export const value = 1\n", + }, + }, + setup: ({ config, tuiConfig }) => + Effect.sync(() => { + config.username = "Drive" + tuiConfig.scroll_speed = 1 + }), + run: ({ ui, llm }) => + Effect.gen(function* () { + yield* ui.submit("Read src/example.ts") + yield* llm.send(Llm.text("The value is 1.")) + yield* ui.waitFor("The value is 1.") + }), +}) +``` + +`project.files` seeds the isolated project before `setup` runs. With +`project.git: true`, Drive creates a fresh repository and commits the complete +pre-launch state, including files written in `setup`. A prepared repository is +never replaced; omit `project.git` when an `init` step supplies Git history. +Declared `config` and `tuiConfig` values are deeply merged over fixture +`.opencode/opencode.jsonc` and `.opencode/tui.jsonc` files. Arrays replace +instead of merging, and mutations made in `setup` take final precedence. + +Attach arbitrary provider-backed tools at runtime with their JSON schemas, then +take and settle native OpenCode invocations by model call ID. `attach` replaces +the complete dynamic set atomically; it does not affect the built-in adapters +configured through the driver or script `tools` option. + +```ts +import { Effect } from "effect" +import { Llm, OpenCodeDriver } from "opencode-drive" + +export default OpenCodeDriver.use(({ tools, llm, ui }) => + Effect.gen(function* () { + yield* tools.attach({ + tools: [ + { + name: "lookup", + description: "Look up a value", + inputSchema: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, + outputSchema: { + type: "object", + properties: { answer: { type: "number" } }, + required: ["answer"], + }, + options: { codemode: false }, + }, + ], + }) + yield* llm.queue( + Llm.toolCall({ + index: 0, + id: "call_lookup", + name: "lookup", + input: { query: "meaning" }, + }), + Llm.finish("tool-calls"), + ) + yield* ui.submit("Look up the meaning") + + const lookup = yield* tools.take("call_lookup") + yield* lookup.progress({ + structured: { phase: "searching" }, + content: [{ type: "text", text: "Searching" }], + }) + yield* lookup.finish({ + structured: { answer: 42 }, + content: [{ type: "text", text: "42" }], + }) + }), +) +``` + +Drive owns progress sequence numbers and retries uncertain operations without +rerunning a claimed call. `awaitCancelled()` completes when OpenCode interrupts +the native invocation before `finish` or `fail`. Dynamic registrations survive +the tool-only controller reconnecting; an intentional server generation change +cancels unresolved calls and reapplies the desired set after launch. + +Declare which built-in tools Drive should intercept with `tools`, then control +their invocations inside `run`. Each tool controller accepts calls in arrival +order or by the stable call ID chosen in `Llm.toolCall`: + +```ts +import { Effect } from "effect" +import { defineScript, Llm } from "opencode-drive" + +export default defineScript({ + tools: ["shell"], + run: ({ ui, llm, tools }) => + Effect.gen(function* () { + const shells = yield* tools.control("shell") + yield* llm.queue( + Llm.toolCall({ + index: 0, + id: "call_shell", + name: "shell", + input: { command: "deploy production" }, + }), + Llm.finish("tool-calls"), + ) + yield* ui.submit("Deploy production") + const shell = yield* shells.take("call_shell") + yield* shell.progress(`Running: ${shell.input.command}...\n`) + yield* shell.succeed({ output: "Controlled output\n", exit: 0 }) + }), +}) +``` + +Use `calls.take(id)` to coordinate known parallel calls independently, or +`calls.take()` to accept the next unclaimed invocation. A controlled call can +emit progress and then succeed or fail exactly once. `awaitInterrupted()` +observes OpenCode interruption or transport disconnection. Drive interrupts +all unresolved calls when it shuts down. + +The original `tools(registry)` callback remains available for fixed handlers +that do not need orchestration from `run`. Foreground handler Effects are +interrupted when OpenCode interrupts the session, the transport disconnects, +or Drive shuts down. Detached background shell handlers continue after their +launch response and are interrupted when Drive shuts down. + +Only declared or registered tools are replaced. Unhandled tools continue to +use OpenCode's real implementations. Each `progress` value replaces the +visible tool output; send accumulated output when earlier lines should remain +visible. +Supported adapters are `shell`, `webfetch`, and `websearch`; each handler +receives its canonical typed V2 input and maintains an independent call index. +When a shell call sets `background: true`, Drive returns immediately with the +OpenCode tool call ID as `shellID`, keeps the handler running, and injects the +terminal `completed`, `error`, or `cancelled` result into the session +automatically. Background handlers are cancelled when Drive shuts down. + +Type-check every new or edited script before running it: + +```sh +opencode-drive check ./drive.ts +``` + +Drive resolves its script API, Effect, Bun declarations, and `tsgo` from the +launching installation without installing packages or modifying the script's +directory. When it detects an old Promise-style `setup`, `run`, or `ui.waitFor` +callback, it prints the equivalent Effect shape after the TypeScript +diagnostics. Use `Effect.sleep(milliseconds)` for unconditional delays. + +The `fs`, `ui`, `llm`, `tools`, `server`, and `tuis` capabilities expose +Effect-returning operations. Compose them with `yield*`, `Effect.flatMap`, or +other Effect operators. Scripts receive the same `Ui`, `Tui`, `Tuis`, and TUI +options as `OpenCodeDriver`; `defineScript` does not define a second +programmatic interface. Predicates passed to `ui.waitFor` may return a boolean +or an Effect. Set `launch: "manual"` to launch the shared OpenCode server and +every TUI explicitly: + +```ts +import { Effect } from "effect" +import { defineScript } from "opencode-drive" + +export default defineScript({ + launch: "manual", + run: ({ ui, server, tuis }) => + Effect.gen(function* () { + // ui is null in manual mode. + yield* server.launch() + const alice = yield* tuis.launch("alice") + const bob = yield* tuis.launch("bob") + yield* alice.ui.submit("Hello from Alice") + yield* bob.ui.screenshot("bob-view") + }), +}) +``` + +Only one server may be launched per script. All TUIs share its LLM backend. TUI +processes and compiled script artifacts are cleaned up when the script ends. + +`yield* server.kill()` stops the server so it can be launched again later. +`yield* tui.close()` closes a TUI, after which its name may be reused. + +Pass `{ recording: true }` to record an individual TUI: + +```ts +const alice = yield * tuis.launch("alice", { recording: true }) +yield * alice.ui.submit("Hello") +yield * alice.close() +``` + +Recordings are exported when the script settles. Call +`alice.recording.finish()` only when the video is needed before settlement. + +Background title requests receive `OpenCode Drive` by default and do not +consume `llm.queue`, `llm.send`, or `llm.serve` responses. Manual-launch +scripts can customize them before starting the server: + +```ts +yield * llm.title(() => Effect.succeed("Custom title")) +yield * server.launch() +``` + +Use `yield* llm.send(...)` to wait for and complete the next request or `yield* +llm.queue(...)` to declare future responses upfront. For ongoing responses, +the handler passed to `llm.serve` returns an Effect `Stream`: + +```ts +import { Stream } from "effect" +import { Llm } from "opencode-drive" + +yield * llm.serve((_request, index) => Stream.make(Llm.text(`Response ${index + 1}`))) +``` + +The backend connection, default `finish("stop")`, and cleanup are automatic. +Cancellation is represented by Effect interruption: interrupting the script or +the fiber running an operation interrupts its in-flight work and runs scoped +finalizers. There is no Promise compatibility shim or separate cancellation +API. All public script types are canonically defined in +[`src/script/types.ts`](./src/script/types.ts), which can be provided directly +to an authoring agent. + +`Llm.text()` streams text in randomized chunks. It defaults to a 2 ms delay and +a target chunk size of 15 characters, varied by plus or minus 5 per chunk: + +```ts +Llm.text("A deliberately slower response", { delay: 20, chunkSize: 10 }) +``` + +`Llm.reasoning()` accepts the same streaming options. Use +`Llm.pause(milliseconds)` to add timing between any two outputs. + +`Llm.toolCall()` emits a complete call atomically by default. Pass the same +streaming options to expose partial JSON input while it is generated: + +```ts +Llm.toolCall( + { + index: 0, + id: "call_patch", + name: "patch", + input: { patchText: "*** Begin Patch\n*** End Patch" }, + }, + { delay: 40, chunkSize: 12 }, +) +``` + +Finish a tool-calling response with `Llm.finish("tool-calls")`. Streamed calls +drive OpenCode's normal tool-input start, delta, and end lifecycle; `Llm.raw()` +remains available for provider-wire scenarios not covered by these helpers. + +Current OpenCode simulation endpoints expose a semantic UI tree alongside +renderer state and terminal capture. Use `ui.snapshot()` for the complete +versioned tree or `ui.getNode()` to poll for one exact semantic match. Semantic +nodes carry stable IDs, optional occurrence identity, role, label, hierarchy, +component-owned state, and a transient element handle that `ui.click()` can +resolve safely: + +```ts +const allow = + yield * + ui.getNode({ + role: "option", + label: "Allow once", + selected: true, + disabled: false, + }) + +yield * ui.click(allow) +``` + +`ui.snapshot` and atomic semantic clicks are negotiated as optional +capabilities so ordinary operations remain compatible with older OpenCode +checkouts. Calling `ui.snapshot()`, `ui.getNode()`, or `ui.click(node)` when its +required capability is unavailable fails locally with `UiCapabilityError`. + +Capability errors are typed and the concrete classes are grouped under +`Errors`. UI timeouts remain owner-fatal even when caught; recover locally +from errors for which the script has a truthful fallback: + +Polling timeouts from `ui.waitFor`, `ui.getElement`, and `ui.getNode` make one +best-effort, bounded `ui.capture` request. When it succeeds, the resulting +normalized terminal frame is available as `error.frame` without creating or +retaining a screenshot file. RPC-level timeouts and failed diagnostic captures +leave `error.frame` undefined. + +```ts +import { Effect } from "effect" +import { Errors } from "opencode-drive" + +yield * + ui + .getElement({ editor: true }) + .pipe(Effect.catchTag("UiElementAmbiguousError", (error) => Effect.logWarning(`Matched ${error.count} editors`))) + +const isFileSystemError = (error: unknown) => error instanceof Errors.FileSystemError +``` + +## Release validation + +Before publishing a release, run the non-publishing validation command to +check, test, and inspect the packed artifact: + +```sh +bun run release:validate +``` diff --git a/packages/drive/RELEASING.md b/packages/drive/RELEASING.md new file mode 100644 index 00000000000..734ae592d91 --- /dev/null +++ b/packages/drive/RELEASING.md @@ -0,0 +1,27 @@ +# Releasing opencode-drive + +`opencode-drive` keeps its own version line. OpenCode product releases must not rewrite its version. + +The imported baseline is `1.4.3` and the workspace package remains `private` until release setup is complete. +Do not remove that guard or publish from this repository until both release gates are complete: + +1. The versions of `@opencode-ai/client` and `@opencode-ai/protocol` written into the packed Drive manifest are available on npm, including the `@opencode-ai/protocol/simulation` export. +2. npm package administration and trusted publishing move from `anomalyco/opencode-drive` to `anomalyco/opencode`. + +The npm package is currently maintained by `jlongster`, and its trusted publisher is the old repository's +`publish.yml`. James must add the destination release operator as an npm owner or update the trusted publisher +himself. Keep James as an owner through the first successful release from this repository. + +The first destination release will be `1.4.4`, which contains the pending special-key fix after `1.4.3`. Use a +dedicated GitHub-hosted workflow named `publish-drive.yml` with Node 24, npm trusted publishing, and +`id-token: write`. Its tag must be `opencode-drive-v1.4.4`; bare `v1.4.4` already belongs to OpenCode. + +Before enabling that workflow: + +1. Pack Drive and inspect the rewritten `package.json` inside the tarball. +2. Install the tarball in a clean Bun consumer and import every public export. +3. Run the installed `opencode-drive` binary and one scripted flow. +4. Configure npm's trusted publisher for `anomalyco/opencode` and `publish-drive.yml`. +5. Publish the namespaced tag and verify npm provenance points at this repository and workflow. + +After the first successful destination release, disable the old publish workflow and archive the old repository. diff --git a/packages/drive/assets/fonts/commit-mono/CommitMono-400-Italic.otf b/packages/drive/assets/fonts/commit-mono/CommitMono-400-Italic.otf new file mode 100644 index 00000000000..94a5a7653d4 Binary files /dev/null and b/packages/drive/assets/fonts/commit-mono/CommitMono-400-Italic.otf differ diff --git a/packages/drive/assets/fonts/commit-mono/CommitMono-400-Regular.otf b/packages/drive/assets/fonts/commit-mono/CommitMono-400-Regular.otf new file mode 100644 index 00000000000..9984c70889d Binary files /dev/null and b/packages/drive/assets/fonts/commit-mono/CommitMono-400-Regular.otf differ diff --git a/packages/drive/assets/fonts/commit-mono/CommitMono-700-Italic.otf b/packages/drive/assets/fonts/commit-mono/CommitMono-700-Italic.otf new file mode 100644 index 00000000000..90aabfa51d0 Binary files /dev/null and b/packages/drive/assets/fonts/commit-mono/CommitMono-700-Italic.otf differ diff --git a/packages/drive/assets/fonts/commit-mono/CommitMono-700-Regular.otf b/packages/drive/assets/fonts/commit-mono/CommitMono-700-Regular.otf new file mode 100644 index 00000000000..4e6e24e94b4 Binary files /dev/null and b/packages/drive/assets/fonts/commit-mono/CommitMono-700-Regular.otf differ diff --git a/packages/drive/assets/fonts/commit-mono/license.txt b/packages/drive/assets/fonts/commit-mono/license.txt new file mode 100644 index 00000000000..a81f7dd5956 --- /dev/null +++ b/packages/drive/assets/fonts/commit-mono/license.txt @@ -0,0 +1,90 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/packages/drive/assets/fonts/noto/NotoSansMath-Regular.ttf b/packages/drive/assets/fonts/noto/NotoSansMath-Regular.ttf new file mode 100644 index 00000000000..7e505c9bad2 Binary files /dev/null and b/packages/drive/assets/fonts/noto/NotoSansMath-Regular.ttf differ diff --git a/packages/drive/assets/fonts/noto/NotoSansSymbols.ttf b/packages/drive/assets/fonts/noto/NotoSansSymbols.ttf new file mode 100644 index 00000000000..a0061bfbcbb Binary files /dev/null and b/packages/drive/assets/fonts/noto/NotoSansSymbols.ttf differ diff --git a/packages/drive/assets/fonts/noto/NotoSansSymbols2-Regular.ttf b/packages/drive/assets/fonts/noto/NotoSansSymbols2-Regular.ttf new file mode 100644 index 00000000000..caf89dd0e60 Binary files /dev/null and b/packages/drive/assets/fonts/noto/NotoSansSymbols2-Regular.ttf differ diff --git a/packages/drive/assets/fonts/noto/license.txt b/packages/drive/assets/fonts/noto/license.txt new file mode 100644 index 00000000000..258bf7c6bac --- /dev/null +++ b/packages/drive/assets/fonts/noto/license.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Noto Project Authors (https://github.com/notofonts/symbols) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/packages/drive/bin/opencode-drive b/packages/drive/bin/opencode-drive new file mode 100755 index 00000000000..e0df131d5ee --- /dev/null +++ b/packages/drive/bin/opencode-drive @@ -0,0 +1,2 @@ +#!/usr/bin/env bun +import "../src/cli/index.js" diff --git a/packages/drive/compile/public-api.ts b/packages/drive/compile/public-api.ts new file mode 100644 index 00000000000..7e716f94530 --- /dev/null +++ b/packages/drive/compile/public-api.ts @@ -0,0 +1,46 @@ +import * as Effect from "effect/Effect" +import { OpenCodeDriver, Tool } from "../src/index.js" +import type { Frontend, Project, Tui, Tuis, Ui } from "../src/index.js" +import type { ScriptContext } from "../src/script/types.js" + +type Equal = + (() => Value extends Left ? 1 : 2) extends () => Value extends Right ? 1 : 2 ? true : false + +type Assert = Value + +export type ScriptUiIsCanonical = Assert> +export type ScriptTuiIsCanonical = Assert> +export type ScriptTuisAreCanonical = Assert> +export type ScriptToolsAreCanonical = Assert> +export type DriverToolsAreCanonical = Assert> +export type LaunchedTuiIsCanonical = Assert>, Tui>> +export type ResizeIsCanonicalAction = Assert< + Equal< + Extract, + { + readonly type: "ui.resize" + readonly cols: number + readonly rows: number + } + > +> +export type DriverProjectIsCanonical = Assert, Project>> + +const zeroConfig = OpenCodeDriver.use(() => Effect.void) +export type ZeroConfigUseIsRunnable = Assert, never>> + +const controlledOptions: OpenCodeDriver.Options = { tools: ["shell"] } +declare const controls: Tool.Controls +const shellCalls = controls.control("shell") +declare const dynamicTools: Tool.AttachParams +const attached = controls.attach(dynamicTools) +const dynamicCall = controls.take("call_lookup") +declare const toolName: Tool.Name +controls.control(toolName) +export type ShellControlIsTyped = Assert< + Equal, Tool.ControlledCalls> +> +export type DynamicAttachIsTyped = Assert, void>> +export type DynamicCallIsTyped = Assert, Tool.Invocation>> +const controlled = OpenCodeDriver.use(controlledOptions, ({ tools }) => tools.control("shell").pipe(Effect.asVoid)) +export type ControlledUseIsRunnable = Assert, never>> diff --git a/packages/drive/docs/open-code-driver-api.md b/packages/drive/docs/open-code-driver-api.md new file mode 100644 index 00000000000..4278ab02bcc --- /dev/null +++ b/packages/drive/docs/open-code-driver-api.md @@ -0,0 +1,500 @@ +# OpenCode Driver API + +Status: exploratory implementation, settled call sites only + +This document records interface shapes that have been accepted during design. It intentionally omits unresolved alternatives rather than presenting them as competing proposals. + +Internal resource ownership and desugaring are documented in [OpenCode Driver Architecture](./open-code-driver-architecture.md). + +## Run Effect programs from the CLI + +`opencode-drive run ` is the primary CLI entrypoint. The module must +default-export an `Effect<_, _, never>`. Before importing the module, Drive +generates and type-checks a contract entrypoint that assigns its default export +to that fully provided Effect type. Drive then imports the module, verifies the +value with `Effect.isEffect`, and yields it directly from the command handler. +There is no nested runtime or detached owner. + +```ts +import { OpenCodeDriver } from "opencode-drive" + +export default OpenCodeDriver.use(({ ui }) => ui.screenshot("home")) +``` + +```sh +opencode-drive run ./drive.ts +``` + +The command accepts no flags and no arguments after `--`. Use the driver API in +the module for simulation control. `opencode-drive check` validates Effect-only +`defineScript` modules, and `start --script` executes them. + +## `use` settles one scoped driver + +`OpenCodeDriver.use(run)` is the zero-configuration top-level interface; +`OpenCodeDriver.use(options, run)` configures the same lifecycle. Both acquire +the driver returned by `make`, run the program, validate queued LLM work, +finish recordings, close TUIs, export videos, and then release the server +and project scope. + +`OpenCodeDriver.useReport(run)` and `useReport(options, run)` have the same lifecycle semantics and +returns both the user value and a compact `RunReport`. The report contains +validated artifact and recording paths, retention, and endpoint compatibility. +Set `opencode.compatibility` to `"required"` or `"preferred"`; +the default is `"preferred"`, which negotiates when supported and reports an +explicit legacy profile otherwise. + +```ts +import { NodeRuntime } from "@effect/platform-node" +import { Effect } from "effect" +import { Llm, OpenCodeDriver } from "opencode-drive" + +const program = OpenCodeDriver.use( + { + project: { + git: true, + files: { + "src/example.ts": "export const value = 1\n", + }, + }, + config: { + autoupdate: false, + }, + tui: { + viewport: { + cols: 96, + rows: 32, + }, + recording: false, + }, + }, + ({ ui, llm }) => + Effect.gen(function* () { + yield* llm.queue(Llm.text("The value is 1.")) + + yield* ui.submit("Read src/example.ts") + yield* ui.waitFor("The value is 1.") + }), +) + +NodeRuntime.runMain(program) +``` + +`OpenCodeDriver.make(...)` remains the lower-level scoped constructor for programs that need to control settlement explicitly. Call `driver.settle()` before leaving its scope. `settle()` is terminal: it rejects new TUIs and LLM responses, validates queued work, stops TUIs, and exports recordings. + +```ts +const program = Effect.scoped( + Effect.gen(function* () { + const driver = yield* OpenCodeDriver.make(options) + yield* driver.ui.submit("Hello") + yield* driver.settle() + }), +) +``` + +Capture font size is not part of this interface. The current renderer uses a fixed 16px font in 10-by-20 cells; the terminal catalog's `OPENCODE_DRIVE_FONT_SIZE=14` environment variable is currently ignored. + +The generated SDK client is `opencode`. The primary frontend process is `tui`, +its UI is also available directly as `ui`, and `tuis` launches more frontend +processes: + +```ts +const health = yield * driver.opencode.health.get() +const frame = yield * driver.tui.ui.capture() +const secondary = yield * driver.tuis.launch() +``` + +## The driver has one primary TUI and optional additional TUIs + +The `tui` section configures the primary frontend created by `make`. Its UI is exposed directly as `ui` for the common case. + +Additional TUIs connect to the same server and expose their own UI: + +```ts +const program = Effect.scoped( + Effect.gen(function* () { + const oc = yield* OpenCodeDriver.make({ + tui: { + viewport: { + cols: 96, + rows: 32, + }, + }, + }) + + const secondary = yield* oc.tuis.launch({ + viewport: { + cols: 120, + rows: 40, + }, + recording: true, + }) + + yield* oc.ui.submit("Prompt from the primary TUI") + yield* secondary.ui.submit("Prompt from the secondary TUI") + yield* oc.settle() + }), +) +``` + +`tuis.launch(options)` generates an identity. Pass a name as the first argument +when a stable identity is useful for logs, recordings, or closing and +relaunching the same TUI: `tuis.launch(name, options)`. + +```text + ╭────────────────╮ + │ OpenCodeDriver ├───────────────────────╮ + ╰────────┬───────╯ │ + ╭────────────────╰──────────────────╮ │ + ▼ ▼ │ +╭────────────────────────╮ ╭────────────────────╮ │ +│ Shared OpenCode Server │ │ Shared LLM Control │ │ +╰────────────┬───────────╯ ╰────────────────────╯ │ + ╰───────────────────────────────╮ │ + ▼ ▼ │ + ╭────────────────╮ ╭────────────────────╮ │ + │ Primary TUI │◀───────────│ Additional TUIs │◀─────╯ + ╰────────┬───────╯ ╰──────────┬─────────╯ + ╰───╮ ╭──────╯ + ▼ ▼ + ╭────╮ ╭───────────╮ + │ ui │ │ tui.ui │ + ╰────╯ ╰───────────╯ +``` + +## Common scripts destructure UI and LLM control + +Scripts that only need the primary TUI should normally destructure the driver: + +```ts +const driver = yield * OpenCodeDriver.make() +const { ui, llm } = driver + +yield * llm.queue(Llm.text("Hello from the simulated model.")) + +yield * ui.submit("Hello") +yield * ui.waitFor("Hello from the simulated model.") +yield * driver.settle() +``` + +Keep the aggregate value only when driver-wide capabilities such as `tuis` are needed: + +```ts +const oc = yield * OpenCodeDriver.make() +const secondary = yield * oc.tuis.launch() + +yield * oc.ui.screenshot("primary") +yield * secondary.ui.screenshot("secondary") +yield * oc.settle() +``` + +## Runtime tool control uses statically declared adapters + +Declare the built-in tool names Drive should intercept before OpenCode starts, +then control each invocation through the live `tools` capability. Undeclared +tools keep their real OpenCode implementations. + +```ts +const program = OpenCodeDriver.use({ tools: ["shell"] }, ({ tools, llm, ui }) => + Effect.gen(function* () { + const shells = yield* tools.control("shell") + yield* llm.queue( + Llm.toolCall({ + index: 0, + id: "call_build", + name: "shell", + input: { command: "bun run build" }, + }), + Llm.toolCall({ + index: 1, + id: "call_test", + name: "shell", + input: { command: "bun run test" }, + }), + Llm.finish("tool-calls"), + ) + yield* ui.submit("Build and test") + + const build = yield* shells.take("call_build") + const test = yield* shells.take("call_test") + yield* test.succeed({ output: "Tests passed\n", exit: 0 }) + yield* build.succeed({ output: "Build passed\n", exit: 0 }) + }), +) +``` + +`take(callID)` reserves and accepts one known invocation independently of +arrival order. `take()` accepts the oldest unclaimed invocation. Exact-ID +waiters take precedence over generic waiters, so parallel calls may settle in +any deliberate order. Each call may emit serialized progress and then succeed +or fail exactly once. `awaitInterrupted()` completes when transport or +controller interruption wins before terminal settlement. + +The program must take and terminally settle every intercepted invocation it +expects. Driver scope closure fails blocked `take` operations, interrupts +unresolved calls, and waits for transport cleanup. The callback-style +`tools(registry)` configuration remains available +for fixed handlers; callback-controlled tools are not also available through +the runtime `tools.control` capability. + +## Arbitrary tools use the provider-backed lifecycle + +`tools.attach({ tools })` atomically replaces the complete dynamic registration +set for the current run. Registrations use OpenCode's canonical JSON Schema, +permission, namespace, and CodeMode options. Static `shell`, `webfetch`, and +`websearch` adapters remain installed separately. + +```ts +yield * + tools.attach({ + tools: [ + { + name: "lookup", + description: "Look up a value", + inputSchema: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, + options: { codemode: false }, + }, + ], + }) + +const invocation = yield * tools.take("call_lookup") +yield * + invocation.progress({ + structured: { phase: "searching" }, + content: [{ type: "text", text: "Searching" }], + }) +yield * + invocation.finish({ + structured: { answer: 42 }, + content: [{ type: "text", text: "42" }], + }) +``` + +`take(callID)` matches `context.callID`, the model call ID supplied to +`Llm.toolCall`; `invocation.id` is the producer's transport identity. Drive +deduplicates invocation replay after a controller reconnect and retries +progress or terminal operations with the same producer identity and progress +sequence. `awaitCancelled()` observes OpenCode's native interruption. There is +no public cancel operation because cancellation flows from OpenCode to Drive. + +Attaching a dynamic effective name that collides with a configured static +adapter fails locally. Calling `attach({ tools: [] })` clears the dynamic set. +Older OpenCode revisions remain compatible with static adapters and ordinary +LLM control; dynamic attachment fails with `Tool.LifecycleError` when the six +tool lifecycle capabilities are unavailable. + +## LLM response description is separate from live LLM control + +`Llm` is a pure data module. `llm` is the live capability that queues, sends, and serves responses. + +```ts +yield * + llm.queue( + Llm.reasoning("Inspecting the file"), + Llm.pause(20), + Llm.text("The value is 1.", { + delay: 2, + chunkSize: 15, + }), + Llm.finish("stop"), + ) +``` + +Each constructor returns an ordinary serializable value. Raw values with the same schema remain accepted. + +Tool calls remain atomic when options are omitted. Supplying stream options +serializes the input to JSON and emits provider-neutral partial tool input when +the endpoint advertises that capability. Older endpoints retain the existing +OpenAI-compatible fallback: + +```ts +Llm.toolCall( + { + index: 0, + id: "call_patch", + name: "patch", + input: { patchText: "*** Begin Patch\n*** End Patch" }, + }, + { delay: 40, chunkSize: 12 }, +) +``` + +The authoritative schema is a manual union of independently named variants: + +```ts +export const Text = Schema.Struct({ + type: Schema.Literal("text"), + text: Schema.String, + options: Schema.optionalKey(StreamOptions), +}) +export interface Text extends Schema.Schema.Type {} + +export const Reasoning = Schema.Struct({ + type: Schema.Literal("reasoning"), + text: Schema.String, + options: Schema.optionalKey(StreamOptions), +}) +export interface Reasoning extends Schema.Schema.Type {} + +export const Pause = Schema.Struct({ + type: Schema.Literal("pause"), + milliseconds: NonNegativeMilliseconds, +}) +export interface Pause extends Schema.Schema.Type {} + +export const Finish = Schema.Struct({ + type: Schema.Literal("finish"), + reason: Schema.optionalKey(FinishReason), +}) +export interface Finish extends Schema.Schema.Type {} + +export const Output = Schema.Union([Text, Reasoning, Pause, Finish, ToolCall, Raw, Disconnect]) +export type Output = Schema.Schema.Type +``` + +Pure constructors delegate to those individual schemas: + +```ts +export const text = (text: string, options?: StreamOptions): Text => + Text.make({ + type: "text", + text, + ...(options ? { options } : {}), + }) +``` + +No `.cases` interface appears in userland. + +## One `queue` call describes one future model response + +Multiple outputs in one call are ordered events within one response: + +```ts +yield * + llm.queue( + Llm.toolCall({ + index: 0, + id: "call_permission_capture", + name: "patch", + input: { + patchText, + }, + }), + Llm.finish("tool-calls"), + ) +``` + +A second call queues a response for the next model request: + +```ts +yield * llm.queue(Llm.text("The fixture was updated.")) +``` + +Responses without an explicit terminal output finish with `"stop"`. Title requests remain separate and do not consume this queue. + +## `defineScript` is Effect-only + +`defineScript` does not provide a Promise adapter. Its `setup` and `run` +callbacks return Effects, as do operations on `fs`, `ui`, `llm`, `server`, +and `tuis`. Compose script operations in the same runtime with +`yield*` or Effect operators. + +### Primary UI + +```ts +import { Effect } from "effect" +import { defineScript, Llm } from "opencode-drive" + +export default defineScript({ + run: ({ ui, llm }) => + Effect.gen(function* () { + yield* llm.queue(Llm.text("The value is 1.")) + yield* ui.submit("Read src/example.ts") + yield* ui.waitFor("The value is 1.") + }), +}) +``` + +`llm.serve` accepts a handler that returns an Effect `Stream`. The registration +itself is also an Effect: + +```ts +import { Stream } from "effect" +import { Llm } from "opencode-drive" + +yield * llm.serve((_request, index) => Stream.make(Llm.text(`Response ${index + 1}`))) +``` + +Predicates passed to `ui.waitFor` may return a boolean or an Effect. +Capability methods expose typed error channels. Concrete tagged errors are +available from the `Errors` namespace. + +`ui.snapshot()` returns the endpoint's versioned semantic tree. `ui.getNode()` +polls for one exact match and fails with `UiNodeAmbiguousError` when more than +one node matches. Semantic snapshots and identity-checked semantic clicks are +optional during negotiation, so older OpenCode checkouts retain ordinary UI +control while unsupported semantic operations fail locally with +`UiCapabilityError`. + +```ts +const option = + yield * + ui.getNode({ + role: "option", + label: "Allow once", + selected: true, + }) +yield * ui.click(option) +``` + +### Additional TUI + +```ts +yield * server.launch() +const alice = yield * tuis.launch("alice") +const bob = yield * tuis.launch("bob") + +yield * alice.ui.submit("Hello from Alice") +yield * bob.ui.screenshot("bob-view") +``` + +### TUI configuration + +```ts +export default defineScript({ + tui: { + viewport: { + cols: 118, + rows: 34, + }, + }, + run: ({ ui }) => ui.screenshot("home").pipe(Effect.asVoid), +}) +``` + +Script cancellation uses Effect interruption. Interrupting the script or an +operation's fiber interrupts in-flight work and runs its scoped finalizers; +there is no `AbortSignal`, Promise cancellation convention, or compatibility +shim. + +## Settled interface + +- `OpenCodeDriver.use(run)` and `use(options, run)` are the safe top-level brackets and perform typed settlement. +- `OpenCodeDriver.make(options)` is the primary scoped constructor. +- `opencode` is the generated OpenCode SDK client. +- Programs that call `make` directly call terminal `driver.settle()` before leaving the scope. +- Direct library programs run the same Effect without any export convention. +- The `tui` section configures one primary TUI. +- The primary TUI's UI is exposed as `ui` and `oc.ui`. +- The common case destructures `{ ui, llm }`. +- `oc.tuis.launch(options?)` creates an additional TUI with a generated identity. +- `oc.tuis.launch(name, options?)` creates a TUI with a stable identity. +- Additional TUIs expose their UI as `tui.ui`. +- Drivers and scripts share the same `Tui`, `Tuis`, `Ui`, and option types. +- `Llm` exposes pure constructors over manually composed Effect Schemas. +- Raw schema-compatible LLM output objects remain accepted. +- One `llm.queue(...)` call describes one future model response. diff --git a/packages/drive/docs/open-code-driver-architecture.md b/packages/drive/docs/open-code-driver-architecture.md new file mode 100644 index 00000000000..919e2abcc38 --- /dev/null +++ b/packages/drive/docs/open-code-driver-architecture.md @@ -0,0 +1,228 @@ +# OpenCode Driver Architecture + +This guide describes the current Effect-native architecture. The public call +sites are documented in [OpenCode Driver API](./open-code-driver-api.md). + +## Domain Model + +`OpenCodeDriver` composes these resources: + +```text +OpenCodeDriver + project isolated files and configuration + opencode generated OpenCode SDK client + tui primary frontend process + tuis additional frontend process factory + ui convenience alias for tui.ui + llm shared simulated-model control + tools runtime control for static adapters and arbitrary tools +``` + +The names distinguish the two kinds of client involved: + +- `opencode` is the generated `@opencode-ai/client` SDK value. +- `Tui` is a launched OpenCode frontend process with `ui`, `close`, and an + optional `recording`. +- `Tuis` launches and supervises additional frontend processes connected to + the same server. +- `tools.control` accepts independently controlled invocations for adapters + declared before OpenCode starts. +- `tools.attach` and `tools.take` control arbitrary native tools through the + canonical provider-backed lifecycle. +- Transport-level JSON-RPC clients remain private implementation details. + +`defineScript` consumes these exact capabilities. It adds a branded module +contract, restart behavior, filesystem access, and explicit manual launch. It +does not define another UI, TUI, LLM, or project vocabulary. + +## Ownership + +```text +Effect Scope + OpenCodeProject + artifact root + isolated project files + OpenCodeInstance + server process + TUI processes + launch descriptors and logs + CLI script ToolController + controlled invocation exchanges + OpenCodeServer + backend simulation connection + reconnecting tool-only backend connection + LLM controller + dynamic ToolProducer + generated OpenCode SDK connection + TUI supervisor + primary TUI scope + additional TUI scopes + Library ToolController + controlled invocation exchanges +``` + +Library drivers create their ToolController before project preparation and +pass that controller into `OpenCodeInstance`. CLI scripts create the controller +inside `OpenCodeInstance`. Prepared drivers and script contexts combine the +instance's static controller with the server's dynamic producer. The static +controller that wrote plugin configuration remains the one exposed through +`tools.control`. + +`OpenCodeDriver.make(options)` requires `Scope.Scope`. It returns once the +server, generated SDK client, primary TUI, and simulation connections are +ready. `OpenCodeDriver.use` supplies that scope and performs terminal +settlement even when the user program fails. + +## Settlement + +Settlement is one shared terminal operation. It runs in this order: + +1. Validate that queued LLM work was consumed. +2. Validate that native dynamic-tool invocations were settled. +3. Shut down the LLM controller. +4. Finish active recording timelines. +5. Close all TUI scopes and processes. +6. Export completed recordings. +7. Decode the schema-validated `RunReport`. + +`driver.settle()` is shared and idempotent. Once settlement starts, `tuis` +rejects new launches and `llm` rejects new responses. `OpenCodeDriver.use` +combines a user-program failure with a settlement failure rather than hiding +either cause. + +## Tool Control Lifecycle + +`ToolController` installs only statically declared or callback-registered +adapters into OpenCode's project configuration. Each runtime-controlled tool +owns one exchange that matches incoming requests to exact-ID or FIFO waiters. +Each accepted call owns a terminal Deferred, an interruption Deferred, and a +one-permit Semaphore that serializes progress with terminal commitment. + +Controller scope release closes blocked waiters, marks unresolved calls +interrupted, aborts active HTTP transports, and waits for handler finalizers. +Terminal commitment uses a synchronous first-writer-wins Deferred completion; +Drive guarantees exactly-once acceptance inside the controller, not delivery +across a transport disconnect. + +`ToolProducer` owns a separate backend socket because LLM chunks are not +idempotent and an LLM socket closure is terminal to `LlmController`. Dynamic +tool progress and terminal RPCs are idempotent by producer invocation ID and +sequence, so the tool-only connection may reconnect and replay pending +invocations safely. One ordered event stream preserves invocation-before- +cancellation order. The desired registration set survives reconnects and +manual server relaunches; invocation records are scoped to one server +generation because producer IDs may be reused by a new process. +Settlement first clears the dynamic registration set on OpenCode, then drains +the ordered local event stream before checking for unresolved invocations. The +clear acts as the server-side barrier that prevents a native invocation from +appearing after a successful settlement snapshot. Settlement is terminal for +dynamic attachment. Reconnects remain available while the clear is in flight; +the final connection gate drains any reconnect that landed during settlement +before preventing further backend creation. If the server generation has +already ended, its teardown has cleared the generation-scoped invocation +records, so settlement does not wait for a replacement backend. + +## TUI Lifecycle + +`Tuis.launch(options)` generates an internal identity. `Tuis.launch(name, +options)` uses a stable caller-supplied identity. Both return the same value: + +```ts +interface Tui { + readonly ui: Ui + readonly close: () => Effect.Effect + readonly recording?: Recording +} +``` + +Each TUI owns one frontend process, one negotiated UI connection, and +optionally one recording timeline. Closing a named TUI releases its identity +for reuse. An unexpected process exit fails the owning driver or script. + +The primary TUI is not a special interface. `driver.tui` and values returned +by `driver.tuis` have exactly the same `Tui` type. `driver.ui` is only +`driver.tui.ui` exposed for the common single-TUI call site. + +## OpenCode SDK + +The server process writes an authenticated service registration into its +isolated state directory. `driver/opencode.ts` discovers that registration and +constructs the generated Effect SDK client with the project directory header. +Passwords and registration paths remain internal. The resulting value is +exposed as `driver.opencode` and `ScriptContext.opencode`. + +## Canonical Protocol + +`@opencode-ai/protocol/simulation` contains the single schema definition for OpenCode's +handshake, frontend, and backend simulation messages. `client/protocol.ts` +publishes those namespaces without redefining their data types. + +```text +Frontend protocol schemas + -> driver/ui.ts Effect Ui capability + -> driver/client.ts Tui and Tuis lifecycle + -> driver/index.ts OpenCodeDriver aggregate + -> script/types.ts exact capability reuse +``` + +CLI `--command.ui.*` names are exhaustively checked against +`Frontend.Capabilities`. The Promise transport under `opencode-drive/client` +is separate from the Effect programmatic model but consumes the same protocol +schemas. + +## Transport Seam + +`SimulationConnector` owns WebSocket acquisition, handshake negotiation, +schema validation, request correlation, interruption, and connection failure. +The driver receives the connector through an Effect service and does not +expose it in userland. + +The UI connection is request-response JSON-RPC. The LLM backend additionally +receives unsolicited `llm.request` notifications. The tool-only backend keeps +ordered `tool.invocation` and `tool.cancel` notifications on one validated +stream and does not call `llm.attach`. + +## Project Setup + +Neutral project contracts live in `src/project.ts` so neither the driver nor +scripts own the shared vocabulary: + +```text +Project +Setup +SetupContext +ProjectFileSystem +OpenCodeConfig +OpenCodeTuiConfig +``` + +Configuration is applied in this order: + +1. Write declared project files. +2. Read fixture `opencode.jsonc` and `tui.jsonc` values. +3. Deep-merge `config` and `tuiConfig`; arrays replace existing arrays. +4. Run Effect-only `setup`, which may mutate both merged objects. +5. Write normalized JSON and optionally commit the Git baseline. + +## Dependency Direction + +```text +project -> Effect and Schema +simulation -> canonical protocol and Effect RPC +driver -> project + simulation + instance + recording +script -> project + driver capabilities +cli -> script + driver + Promise transport +``` + +Lower-level modules do not import the package root or the driver/script +barrels. `script/types.ts` may reference driver capabilities; driver modules +must not reference script types. + +## Public Entry Points + +- `opencode-drive`: Effect driver, scripts, project contracts, LLM constructors. +- `opencode-drive/driver`: complete Effect driver namespace. +- `opencode-drive/script`: `defineScript` and script contracts. +- `opencode-drive/client`: Promise simulation transport. +- `opencode-drive/llm`: pure LLM output constructors and schemas. +- `opencode-drive/recording`: recording decode, replay, and export utilities. diff --git a/packages/drive/examples/multiple-clients.ts b/packages/drive/examples/multiple-clients.ts new file mode 100644 index 00000000000..6e898996977 --- /dev/null +++ b/packages/drive/examples/multiple-clients.ts @@ -0,0 +1,58 @@ +import { Effect, Stream } from "effect" +import { defineScript, Llm } from "opencode-drive" + +export default defineScript({ + launch: "manual", + + run: ({ server, tuis, llm }) => + Effect.gen(function* () { + yield* server.launch() + + yield* llm.serve((_request, index) => Stream.make(Llm.text(`Response for request ${index + 1}`))) + + const [alice, bob] = yield* Effect.all( + [tuis.launch("alice", { recording: true }), tuis.launch("bob", { recording: true })], + { concurrency: "unbounded" }, + ) + + yield* Effect.all([alice.ui.submit("Reply to Alice"), bob.ui.submit("Reply to Bob")], { + concurrency: "unbounded", + }) + yield* Effect.all( + [alice.ui.screenshot("multiple-clients-alice-submitted"), bob.ui.screenshot("multiple-clients-bob-submitted")], + { concurrency: "unbounded" }, + ) + yield* Effect.all( + [ + alice.ui.waitFor("Response for request", { timeout: 30_000 }), + bob.ui.waitFor("Response for request", { timeout: 30_000 }), + ], + { concurrency: "unbounded" }, + ) + + yield* Effect.all( + [alice.ui.screenshot("multiple-clients-alice-complete"), bob.ui.screenshot("multiple-clients-bob-complete")], + { concurrency: "unbounded" }, + ) + + yield* server.kill() + yield* Effect.sleep(500) + yield* Effect.all( + [ + alice.ui.screenshot("multiple-clients-alice-server-stopped"), + bob.ui.screenshot("multiple-clients-bob-server-stopped"), + ], + { concurrency: "unbounded" }, + ) + + yield* server.launch() + yield* Effect.sleep(1000) + yield* Effect.all( + [ + alice.ui.screenshot("multiple-clients-alice-server-relaunched"), + bob.ui.screenshot("multiple-clients-bob-server-relaunched"), + ], + { concurrency: "unbounded" }, + ) + }), +}) diff --git a/packages/drive/examples/serve.ts b/packages/drive/examples/serve.ts new file mode 100644 index 00000000000..9cc8aafe929 --- /dev/null +++ b/packages/drive/examples/serve.ts @@ -0,0 +1,43 @@ +import { Effect, Stream } from "effect" +import { defineScript, Llm } from "opencode-drive" + +export default defineScript({ + setup: ({ fs }) => + fs.writeFile( + "src/greeting.ts", + ["export function greeting(name: string) {", " return `Welcome, ${name}!`", "}", ""].join("\n"), + ), + + run: ({ llm, ui }) => + Effect.gen(function* () { + let turn = 0 + + yield* llm.title(() => Effect.succeed("Understanding the greeting")) + yield* llm.serve(() => { + if (turn++ === 0) + return Stream.make( + Llm.reasoning("I should read the implementation before explaining it."), + Llm.toolCall({ + index: 0, + id: "call_read_greeting", + name: "read", + input: { filePath: "src/greeting.ts" }, + }), + Llm.finish("tool-calls"), + ) + + return Stream.make( + Llm.text("The function accepts a name, "), + Llm.pause(150), + Llm.text("places it into a welcome message, "), + Llm.pause(150), + Llm.text("and adds an exclamation mark."), + Llm.pause(150), + Llm.finish("stop"), + ) + }) + + yield* ui.submit("Read src/greeting.ts and explain what it does.") + yield* ui.waitFor("adds an exclamation mark") + }), +}) diff --git a/packages/drive/examples/simple.ts b/packages/drive/examples/simple.ts new file mode 100644 index 00000000000..085d3243492 --- /dev/null +++ b/packages/drive/examples/simple.ts @@ -0,0 +1,32 @@ +import { Effect } from "effect" +import { defineScript, Llm } from "opencode-drive" + +export default defineScript({ + setup: ({ fs }) => fs.writeFile("src/message.ts", 'export const message = "Hello from OpenCode Drive"\n'), + + run: ({ llm, ui }) => + Effect.gen(function* () { + yield* ui.waitFor((state) => state.focused.editor) + const editor = yield* ui.getElement({ editor: true, focused: true }) + yield* ui.focus(editor) + + yield* ui.submit("What does src/message.ts export?") + yield* llm.send( + Llm.reasoning("I should inspect the small source file first.", { + delay: 5, + chunkSize: 10, + }), + Llm.pause(100), + Llm.text('src/message.ts exports `message` with the value "Hello from OpenCode Drive".', { + delay: 10, + chunkSize: 12, + }), + ) + yield* llm.send(Llm.text("Message export")) + + yield* ui.waitFor("Hello from OpenCode Drive") + if (!(yield* ui.matches("OpenCode Drive"))) throw new Error("the expected response was not visible") + + yield* ui.screenshot("simple-response") + }), +}) diff --git a/packages/drive/examples/viewport-resize.ts b/packages/drive/examples/viewport-resize.ts new file mode 100644 index 00000000000..d2c5522291c --- /dev/null +++ b/packages/drive/examples/viewport-resize.ts @@ -0,0 +1,43 @@ +import { Effect } from "effect" +import { defineScript, Llm } from "opencode-drive" + +export default defineScript({ + tui: { viewport: { cols: 120, rows: 36 } }, + + setup: ({ fs }) => fs.writeFile("src/viewport.ts", `export const viewportSequence = ["120x36", "80x24", "50x18"]\n`), + + run: ({ ui, llm }) => + Effect.gen(function* () { + yield* ui.submit("Show a compact status report for the viewport resize demo.") + yield* llm.send( + Llm.text( + "Viewport demo: starting wide at 120 columns by 36 rows. The file src/viewport.ts lists the planned sequence. This first response should have plenty of horizontal room before the terminal narrows.", + ), + ) + yield* Effect.sleep(900) + + yield* ui.resize({ cols: 80, rows: 24 }) + yield* Effect.sleep(900) + + yield* ui.submit("Now describe the medium viewport.") + yield* llm.send( + Llm.text( + "Medium viewport: resized to 80 columns by 24 rows. Lines should wrap sooner, the composer has less vertical breathing room, and the conversation should reflow without losing focus.", + ), + ) + yield* ui.waitFor("resized to 80 columns") + yield* Effect.sleep(900) + + yield* ui.resize({ cols: 50, rows: 18 }) + yield* Effect.sleep(900) + + yield* ui.submit("Finish with the narrow viewport summary.") + yield* llm.send( + Llm.text( + "Narrow viewport: now 50 columns by 18 rows. This final state is intentionally cramped so modal, wrapping, and footer behavior are easy to inspect in the recording.", + ), + ) + yield* ui.waitFor("now 50 columns") + yield* Effect.sleep(1200) + }), +}) diff --git a/packages/drive/package.json b/packages/drive/package.json new file mode 100644 index 00000000000..c121f775acb --- /dev/null +++ b/packages/drive/package.json @@ -0,0 +1,80 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "name": "opencode-drive", + "version": "1.4.3", + "private": true, + "description": "Drive real and simulated OpenCode instances", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/anomalyco/opencode.git", + "directory": "packages/drive" + }, + "homepage": "https://github.com/anomalyco/opencode/tree/v2/packages/drive#readme", + "bugs": "https://github.com/anomalyco/opencode/issues", + "type": "module", + "packageManager": "bun@1.3.14", + "engines": { + "bun": ">=1.3.14" + }, + "bin": { + "opencode-drive": "bin/opencode-drive" + }, + "exports": { + ".": "./src/index.ts", + "./client": "./src/client/index.ts", + "./driver": "./src/driver/index.ts", + "./frame": "./src/frame/index.ts", + "./llm": "./src/llm/index.ts", + "./recording": "./src/recording/index.ts", + "./script": "./src/script/index.ts" + }, + "files": [ + "assets/fonts", + "bin/opencode-drive", + "docs", + "src/cli", + "src/client", + "src/driver", + "src/frame", + "src/instance", + "src/llm", + "src/log.ts", + "src/project.ts", + "src/recording", + "src/script", + "src/simulation", + "src/tool", + "src/index.ts", + "LICENSE", + "README.md" + ], + "scripts": { + "drive": "bun run src/cli/index.ts", + "lint": "cd ../.. && bun run lint -- packages/drive/src", + "test": "bun run test:effect && bun run test:cli", + "test:effect": "bun run --bun vitest run", + "test:cli": "bun test test/cli/integration.test.ts", + "typecheck": "tsgo --noEmit", + "check": "bun run lint && bun run typecheck", + "release:validate": "bun run check && bun run test && bun pm pack --dry-run" + }, + "dependencies": { + "@effect/platform-node": "catalog:", + "@napi-rs/canvas": "1.0.2", + "@opencode-ai/client": "workspace:*", + "@opencode-ai/protocol": "workspace:*", + "@types/bun": "catalog:", + "@typescript/native-preview": "catalog:", + "@wterm/core": "0.3.0", + "@wterm/ghostty": "0.3.0", + "effect": "catalog:" + }, + "devDependencies": { + "@effect/vitest": "4.0.0-beta.101", + "@tsconfig/bun": "catalog:", + "oxlint": "1.60.0", + "typescript": "catalog:", + "vitest": "4.1.10" + } +} diff --git a/packages/drive/src/cli/check.ts b/packages/drive/src/cli/check.ts new file mode 100644 index 00000000000..ec46107b388 --- /dev/null +++ b/packages/drive/src/cli/check.ts @@ -0,0 +1,74 @@ +import { rm } from "node:fs/promises" +import { initializeInstance } from "../instance/instance.js" +import { checkScript } from "../script/tooling.js" + +export async function check(file: string) { + const artifacts = await initializeInstance() + try { + try { + await checkScript(artifacts, file) + } catch (error) { + const source = await Bun.file(file) + .slice(0, 256 * 1024) + .text() + .catch(() => "") + const hint = effectScriptHint(source, message(error)) + if (hint !== undefined) throw new Error(`${message(error)}\n\n${hint}`, { cause: error }) + throw error + } + } finally { + await rm(artifacts, { recursive: true, force: true }) + } +} + +export function effectScriptHint(source: string, diagnostics: string) { + if (!/\bPromise(?:Like)? state.focused.editor) + +Use: + ui.waitFor((state) => Effect.succeed(state.focused.editor))` + if (/\bsetup\s*:|\basync\s+setup\s*\(/.test(relevant)) + return `${heading} + +Instead of: + setup: async ({ fs }) => { + await fs.writeFile("src/example.ts", "export {}") + } + +Use: + setup: ({ fs }) => fs.writeFile("src/example.ts", "export {}")` + if (/\brun\s*:|\basync\s+run\s*\(/.test(relevant)) + return `${heading} + +Instead of: + run: async ({ ui }) => { + await ui.submit("Hello") + } + +Use: + run: ({ ui }) => + Effect.gen(function* () { + yield* ui.submit("Hello") + })` + return undefined +} + +const heading = "OpenCode Drive scripts are Effect-only. Promise callbacks are not supported." + +function diagnosticSource(source: string, diagnostics: string) { + const lines = source.split("\n") + const numbers = [...diagnostics.matchAll(/(?::(\d+):\d+|\((\d+),\d+\))/g)] + .map((match) => Number(match[1] ?? match[2])) + .filter((line) => Number.isInteger(line) && line > 0) + return numbers.length === 0 ? source : numbers.map((line) => lines[line - 1] ?? "").join("\n") +} + +function message(error: unknown) { + return error instanceof Error ? error.message : String(error) +} diff --git a/packages/drive/src/cli/commands.ts b/packages/drive/src/cli/commands.ts new file mode 100644 index 00000000000..602f80585dc --- /dev/null +++ b/packages/drive/src/cli/commands.ts @@ -0,0 +1,204 @@ +import * as Cause from "effect/Cause" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import { Frontend } from "../client/protocol.js" +import { recordLog } from "../log.js" +import * as SimulationConnector from "../simulation/connector.js" +import type { DriveCommand } from "./types.js" + +export const commandInfo = { + "ui.type": { value: true, description: "Type text using JSON params" }, + "ui.press": { value: true, description: "Press a key using JSON params" }, + "ui.enter": { value: false, description: "Press Enter" }, + "ui.arrow": { + value: true, + description: "Press an arrow key using JSON params", + }, + "ui.focus": { + value: true, + description: "Focus an element using JSON params", + }, + "ui.click": { value: true, description: "Click using JSON params" }, + "ui.resize": { + value: true, + description: "Resize terminal viewport using JSON params", + }, + "ui.screenshot": { + value: "optional", + description: "Take a screenshot with optional JSON params and return its path", + }, + "ui.capture": { + value: false, + description: "Capture the terminal frame as JSON", + }, + "ui.state": { + value: false, + description: "Return focus, elements, and available UI actions", + }, + "ui.snapshot": { + value: false, + description: "Return the semantic UI tree as JSON", + }, + "ui.matches": { + value: true, + description: "Check for literal screen text using JSON params", + }, + "ui.recording.finish": { + value: false, + description: "Finish recording and return the timeline path", + }, +} as const satisfies Record< + Exclude, + { readonly value: boolean | "optional"; readonly description: string } +> + +type CommandName = Exclude + +export function isCommandName(operation: string): operation is CommandName { + return Object.hasOwn(commandInfo, operation) +} + +export function commandAcceptsValue(operation: CommandName) { + return commandInfo[operation].value +} + +export function commandNames() { + return Object.keys(commandInfo).sort() +} + +export class SimulationError extends Error { + constructor( + message: string, + readonly method?: string, + ) { + super(message) + this.name = "SimulationError" + } +} + +export class CommandBatchError extends Error { + constructor( + readonly results: ReadonlyArray<{ + readonly command: string + readonly result: unknown + }>, + readonly reason: unknown, + ) { + super(reason instanceof Error ? reason.message : String(reason)) + this.name = "CommandBatchError" + } +} + +const callTimeout = 30_000 + +export async function executeCommands(endpoint: string, commands: ReadonlyArray) { + const exit = await Effect.runPromiseExit(Effect.scoped(executeBatch(endpoint, commands))) + if (Exit.isSuccess(exit)) return exit.value + const reason = Cause.squash(exit.cause) + throw reason instanceof CommandBatchError ? reason : new CommandBatchError([], reason) +} + +const executeBatch = Effect.fn("DriveCli.executeBatch")(function* ( + endpoint: string, + commands: ReadonlyArray, +) { + const connection = yield* SimulationConnector.ui(endpoint, { + connectTimeout: callTimeout, + }).pipe( + Effect.mapError( + (cause) => new SimulationError(cause instanceof Error ? cause.message : `cannot connect to ${endpoint}`), + ), + ) + const results: Array<{ readonly command: string; readonly result: unknown }> = [] + for (const command of commands) { + const result = yield* execute(connection, command).pipe( + Effect.mapError((error) => new CommandBatchError(results, error)), + ) + results.push({ command: command.operation, result }) + } + return { results } +}) + +const execute = ( + connection: SimulationConnector.UiConnection, + command: DriveCommand, +): Effect.Effect => + Effect.suspend(() => { + recordLog("INFO", `ui command ${command.operation} params=${command.value ?? "undefined"}`) + return dispatch(connection, decodeCommand(command)) + }).pipe( + Effect.timeoutOrElse({ + duration: callTimeout, + orElse: () => Effect.fail(new SimulationError(`timed out after ${callTimeout}ms`, command.operation)), + }), + Effect.mapError((cause) => + cause instanceof SimulationError + ? cause + : new SimulationError(cause instanceof Error ? cause.message : String(cause), command.operation), + ), + Effect.tap(() => Effect.sync(() => recordLog("INFO", `ui command ${command.operation} completed`))), + Effect.tapError((error) => + Effect.sync(() => recordLog("ERROR", `ui command ${command.operation} failed: ${error.message}`)), + ), + ) + +function decodeCommand(command: DriveCommand): Frontend.Request { + if (command.value === undefined && commandInfo[command.operation].value === true) + throw new Error(`${command.operation} requires a value`) + return Frontend.decodeRequest( + { + jsonrpc: "2.0", + method: command.operation, + ...(command.value === undefined ? {} : { params: JSON.parse(command.value) }), + }, + { onExcessProperty: "error" }, + ) +} + +function dispatch( + connection: SimulationConnector.UiConnection, + request: Frontend.Request, +): Effect.Effect { + if ( + request.method === "ui.snapshot" && + !SimulationConnector.supportsCapability(connection.compatibility, "ui.snapshot") + ) + return Effect.fail(new SimulationError("ui.snapshot is not available on this OpenCode endpoint", request.method)) + if ( + request.method === "ui.click" && + request.params.semantic !== undefined && + !SimulationConnector.supportsCapability(connection.compatibility, "ui.click.semantic") + ) + return Effect.fail( + new SimulationError("semantic ui.click is not available on this OpenCode endpoint", request.method), + ) + switch (request.method) { + case "ui.type": + return connection.rpc["ui.type"](request.params) + case "ui.press": + return connection.rpc["ui.press"](request.params) + case "ui.enter": + return connection.rpc["ui.enter"]() + case "ui.arrow": + return connection.rpc["ui.arrow"](request.params) + case "ui.focus": + return connection.rpc["ui.focus"](request.params) + case "ui.click": + return connection.rpc["ui.click"](request.params) + case "ui.resize": + return connection.rpc["ui.resize"](request.params) + case "ui.screenshot": + return connection.rpc["ui.screenshot"](request.params) + case "ui.capture": + return connection.rpc["ui.capture"]() + case "ui.state": + return connection.rpc["ui.state"]() + case "ui.snapshot": + return connection.rpc["ui.snapshot"]() + case "ui.matches": + return connection.rpc["ui.matches"](request.params) + case "ui.recording.finish": + return connection.rpc["ui.recording.finish"]() + } + throw new Error(`unsupported UI method ${request.method}`) +} diff --git a/packages/drive/src/cli/dir.ts b/packages/drive/src/cli/dir.ts new file mode 100644 index 00000000000..3485edc4f01 --- /dev/null +++ b/packages/drive/src/cli/dir.ts @@ -0,0 +1,6 @@ +import { resolveInstance } from "../instance/registry.js" + +export async function dir(name?: string) { + const manifest = await resolveInstance(name) + console.log(manifest.artifacts) +} diff --git a/packages/drive/src/cli/index.ts b/packages/drive/src/cli/index.ts new file mode 100644 index 00000000000..8e8385e8234 --- /dev/null +++ b/packages/drive/src/cli/index.ts @@ -0,0 +1,257 @@ +#!/usr/bin/env bun +import * as NodeRuntime from "@effect/platform-node/NodeRuntime" +import * as NodeServices from "@effect/platform-node/NodeServices" +import { Effect, Option } from "effect" +import { Argument, Command, Flag } from "effect/unstable/cli" +import packageJson from "../../package.json" with { type: "json" } +import { extractCommands } from "./parse.js" +import { check } from "./check.js" +import { dir } from "./dir.js" +import { init } from "./init.js" +import { list } from "./list.js" +import { prune } from "./prune.js" +import { restart } from "./restart.js" +import { runProgram } from "./run.js" +import { send } from "./send.js" +import { initScript } from "./script-init.js" +import { start } from "./start.js" +import { stop } from "./stop.js" +import { logError } from "../log.js" +import type { DriveCommand, SendOptions, StartOptions } from "./types.js" + +const extracted = extract() +const initName = Flag.string("name").pipe(Flag.withDescription("Instance name")) +const startName = Flag.string("name").pipe( + Flag.optional, + Flag.withDescription("Instance name (optional with --visible)"), +) +const name = Flag.string("name").pipe( + Flag.optional, + Flag.withDescription("Instance name (defaults to the visible instance)"), +) +const pruneName = Flag.string("name").pipe(Flag.optional, Flag.withDescription("Instance name")) + +const initCommand = Command.make("init", { name: initName }, (config) => execute(() => init(config.name))).pipe( + Command.withDescription("Initialize an instance without launching OpenCode"), + Command.withExamples([ + { + command: "opencode-drive init --name demo", + description: "Create an instance and print its artifact directory", + }, + ]), +) + +const checkCommand = Command.make("check", { file: Argument.string("script") }, (config) => + execute(() => check(config.file)), +).pipe( + Command.withDescription("Type-check an OpenCode Drive script"), + Command.withExamples([ + { + command: "opencode-drive check ./drive.ts", + description: "Type-check a script with the bundled script API", + }, + ]), +) + +const scriptInitCommand = Command.make("init", { file: Argument.string("file") }, (config) => + execute(() => initScript(config.file)), +).pipe( + Command.withDescription("Create an Effect-native OpenCode Drive script"), + Command.withExamples([ + { + command: "opencode-drive script init ./drive.ts", + description: "Create a type-checkable script without overwriting existing files", + }, + ]), +) + +const scriptCommand = Command.make("script").pipe( + Command.withDescription("Create and manage OpenCode Drive scripts"), + Command.withSubcommands([scriptInitCommand]), +) + +const runCommand = Command.make("run", { module: Argument.string("module") }, (config) => + executeEffect( + Effect.try({ + try: () => toRunModule(config.module, extracted.commands, extracted.app), + catch: (error) => error, + }).pipe(Effect.flatMap(runProgram), Effect.asVoid), + ), +).pipe( + Command.withDescription("Type-check and run a fully provided Effect program"), + Command.withExamples([ + { + command: "opencode-drive run ./drive.ts", + description: "Run a default-exported Effect program", + }, + ]), +) + +const startCommand = Command.make( + "start", + { + name: startName, + daemon: Flag.boolean("daemon").pipe(Flag.withHidden, Flag.withDescription("Run as detached instance owner")), + script: Flag.string("script").pipe( + Flag.optional, + Flag.withDescription("JavaScript or TypeScript automation module"), + ), + visible: Flag.boolean("visible").pipe(Flag.withDescription("Show OpenCode in the terminal")), + record: Flag.boolean("record").pipe( + Flag.withDescription("Record the complete headless session and export it on stop"), + ), + dev: Flag.string("dev").pipe(Flag.optional, Flag.withDescription("Path to an OpenCode development checkout")), + }, + (config) => + executeEffect( + Effect.try({ + try: () => toStartOptions(config, extracted.commands, extracted.app), + catch: (error) => error, + }).pipe(Effect.flatMap(start)), + ), +).pipe( + Command.withDescription("Launch a local simulated OpenCode instance"), + Command.withExamples([ + { + command: "opencode-drive start --name demo", + description: "Launch headless OpenCode on the default ports", + }, + { + command: "opencode-drive start --visible", + description: "Launch visible OpenCode on the default ports", + }, + { + command: "opencode-drive start --name demo --script ./drive.ts", + description: "Launch headless OpenCode and run a script", + }, + ]), +) + +const sendCommand = Command.make("send", { name }, (config) => + execute(() => send(toSendOptions(Option.getOrUndefined(config.name), extracted.commands, extracted.app))), +).pipe( + Command.withDescription("Send UI commands to OpenCode on the default port"), + Command.withExamples([ + { + command: 'opencode-drive send --command.ui.type \'{"text":"hello"}\' --command.ui.state', + description: "Execute an ordered UI command batch", + }, + ]), +) + +const restartCommand = Command.make("restart", { name }, (config) => + execute(() => restart(Option.getOrUndefined(config.name))), +).pipe(Command.withDescription("Restart a named OpenCode instance and rerun its script")) + +const stopCommand = Command.make("stop", { name }, (config) => + execute(() => stop(Option.getOrUndefined(config.name))), +).pipe(Command.withDescription("Stop a named OpenCode instance")) + +const dirCommand = Command.make("dir", { name }, (config) => + execute(() => dir(Option.getOrUndefined(config.name))), +).pipe(Command.withDescription("Print the artifact directory for a named OpenCode instance")) + +const listCommand = Command.make("list", {}, () => execute(list)).pipe( + Command.withDescription("List active OpenCode instances"), +) + +const pruneCommand = Command.make( + "prune", + { + name: pruneName, + force: Flag.boolean("force").pipe( + Flag.withDescription("Delete all matching artifact directories, including active ones"), + ), + }, + (config) => execute(() => prune({ name: Option.getOrUndefined(config.name), force: config.force })), +).pipe(Command.withDescription("Delete artifact directories for inactive OpenCode instances")) + +const root = Command.make("opencode-drive").pipe( + Command.withDescription("Drive real and simulated OpenCode instances"), + Command.withSubcommands([ + initCommand, + scriptCommand, + checkCommand, + runCommand, + startCommand, + sendCommand, + listCommand, + pruneCommand, + dirCommand, + restartCommand, + stopCommand, + ]), +) + +Command.runWith(root, { version: packageJson.version })(extracted.args).pipe( + Effect.provide(NodeServices.layer), + NodeRuntime.runMain, +) + +function toStartOptions( + config: { + readonly script: Option.Option + readonly name: Option.Option + readonly daemon: boolean + readonly visible: boolean + readonly record: boolean + readonly dev: Option.Option + }, + commands: ReadonlyArray, + app: ReadonlyArray, +): StartOptions { + if (commands.length > 0) throw new Error("start does not accept command flags; use send or --script") + const name = Option.getOrUndefined(config.name) + if (name === undefined && !config.visible) throw new Error("start requires --name unless --visible is passed") + const options = { + kind: "start" as const, + name: name ?? `visible-${process.pid}`, + daemon: config.daemon, + script: Option.getOrUndefined(config.script), + visible: config.visible, + record: config.record, + dev: Option.getOrUndefined(config.dev), + command: app, + } + if (options.dev !== undefined && app.length > 0) throw new Error("--dev cannot be combined with a command after --") + return options +} + +function toRunModule(module: string, commands: ReadonlyArray, app: ReadonlyArray) { + if (commands.length > 0) throw new Error("run does not accept command flags") + if (app.length > 0) throw new Error("run does not accept arguments after --") + return module +} + +function toSendOptions( + name: string | undefined, + commands: ReadonlyArray, + app: ReadonlyArray, +): SendOptions { + if (app.length > 0) throw new Error("send does not accept a command after --") + return { kind: "send", name, commands } +} + +function execute(task: () => Promise) { + return executeEffect(Effect.tryPromise({ try: task, catch: (error) => error })) +} + +function executeEffect(task: Effect.Effect) { + return task.pipe( + Effect.catch((error) => + Effect.sync(() => { + logError(error instanceof Error ? error.message : String(error)) + process.exitCode = 1 + }), + ), + ) +} + +function extract() { + try { + return extractCommands(process.argv.slice(2)) + } catch (error) { + logError(error instanceof Error ? error.message : String(error)) + return process.exit(1) + } +} diff --git a/packages/drive/src/cli/init.ts b/packages/drive/src/cli/init.ts new file mode 100644 index 00000000000..49d7a270f6e --- /dev/null +++ b/packages/drive/src/cli/init.ts @@ -0,0 +1,10 @@ +import { initializeInstance } from "../instance/instance.js" +import { initializeManifest } from "../instance/registry.js" +import { configureLogFile, logSuccess } from "../log.js" + +export async function init(name: string) { + const manifest = await initializeManifest(name, process.cwd(), () => initializeInstance(name)) + configureLogFile(manifest.artifacts) + logSuccess(`initialized ${name}`) + console.log(manifest.artifacts) +} diff --git a/packages/drive/src/cli/list.ts b/packages/drive/src/cli/list.ts new file mode 100644 index 00000000000..c791f9ec3f5 --- /dev/null +++ b/packages/drive/src/cli/list.ts @@ -0,0 +1,6 @@ +import { listManifests, manifestPath } from "../instance/registry.js" + +export async function list() { + const instances = await listManifests() + console.log(instances.map((instance) => `${instance.name}: ${manifestPath(instance.name)}`).join("\n")) +} diff --git a/packages/drive/src/cli/mock-backend.ts b/packages/drive/src/cli/mock-backend.ts new file mode 100644 index 00000000000..60a25ab0c32 --- /dev/null +++ b/packages/drive/src/cli/mock-backend.ts @@ -0,0 +1,72 @@ +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as Scope from "effect/Scope" +import * as Stream from "effect/Stream" +import type { Backend } from "../client/protocol.js" +import { logError } from "../log.js" +import * as SimulationConnector from "../simulation/connector.js" +import { generateResponse } from "./response-generator.js" +import type { createResponseSettings } from "./response-generator.js" + +const connectTimeout = 30_000 + +export async function connectMockBackend(endpoint: string, responses: ReturnType) { + const scope = await Effect.runPromise(Scope.make()) + const connect = Effect.gen(function* () { + const backend = yield* SimulationConnector.backend(endpoint, { + connectTimeout, + requestTimeout: connectTimeout, + attach: false, + }) + yield* backend.requests.pipe( + Stream.runForEach((request) => + respond(backend, request, responses).pipe( + Effect.matchCauseEffect({ + onFailure: (cause) => Effect.sync(() => logError(String(cause))), + onSuccess: () => Effect.void, + }), + Effect.forkIn(scope), + ), + ), + Effect.forkIn(scope), + ) + yield* backend.attach() + }) + try { + await Effect.runPromise(connect.pipe(Scope.provide(scope))) + } catch (cause) { + await Effect.runPromise(Scope.close(scope, Exit.void)) + throw cause + } + return { + close() { + Effect.runFork(Scope.close(scope, Exit.void)) + }, + } +} + +const respond = Effect.fn("DriveCli.mockRespond")(function* ( + backend: SimulationConnector.BackendConnection, + request: Backend.ProviderInvocation, + responses: ReturnType, +) { + const response = generateResponse(responses.current(), request) + for (const item of response.items) { + if (item.type !== "textDelta" && item.type !== "reasoningDelta") { + yield* backend.rpc["llm.chunk"]({ id: request.id, items: [item] }) + continue + } + for (const text of splitText(item.text)) { + yield* backend.rpc["llm.chunk"]({ id: request.id, items: [{ ...item, text }] }) + yield* Effect.sleep(45 + Math.floor(Math.random() * 35)) + } + } + yield* backend.rpc["llm.finish"]({ id: request.id, reason: response.finish }) +}) + +export function splitText(text: string) { + const words = text.match(/\S+\s*/g) ?? [text] + return Array.from({ length: Math.ceil(words.length / 3) }, (_, index) => + words.slice(index * 3, index * 3 + 3).join(""), + ) +} diff --git a/packages/drive/src/cli/parse.ts b/packages/drive/src/cli/parse.ts new file mode 100644 index 00000000000..8c38f0ce0ec --- /dev/null +++ b/packages/drive/src/cli/parse.ts @@ -0,0 +1,28 @@ +import { commandAcceptsValue, isCommandName } from "./commands.js" +import type { DriveCommand } from "./types.js" + +export function extractCommands(args: ReadonlyArray) { + const commands: DriveCommand[] = [] + const remaining: string[] = [] + const separator = args.indexOf("--") + const cli = separator === -1 ? args : args.slice(0, separator) + const app = separator === -1 ? [] : args.slice(separator + 1) + + for (let index = 0; index < cli.length; index++) { + const flag = cli[index]! + if (!flag.startsWith("--command.")) { + remaining.push(flag) + continue + } + const operation = flag.slice("--command.".length) + if (!isCommandName(operation)) throw new Error(`unknown drive command "${operation}"`) + const valueMode = commandAcceptsValue(operation) + const next = cli[index + 1] + const takesValue = valueMode === true || (valueMode === "optional" && next !== undefined && !next.startsWith("--")) + const value = takesValue ? cli[++index] : undefined + if (valueMode === true && (value === undefined || value.startsWith("--"))) + throw new Error(`${flag} requires a value`) + commands.push({ operation, ...(value === undefined ? {} : { value }) }) + } + return { args: remaining, app, commands } +} diff --git a/packages/drive/src/cli/prune.ts b/packages/drive/src/cli/prune.ts new file mode 100644 index 00000000000..d6f0be89bdb --- /dev/null +++ b/packages/drive/src/cli/prune.ts @@ -0,0 +1,41 @@ +import { readdir, rm } from "node:fs/promises" +import { join, resolve } from "node:path" +import { artifactDirectory } from "../instance/instance.js" +import { listManifests, validateName } from "../instance/registry.js" + +export async function prune(options: { readonly name?: string; readonly force?: boolean } = {}) { + if (options.name !== undefined) validateName(options.name) + const directory = artifactDirectory() + const entries = await readdir(directory, { withFileTypes: true }).catch((error: unknown) => { + if (isNodeError(error) && error.code === "ENOENT") return [] + throw error + }) + const manifests = await listManifests() + const active = new Set(manifests.map((manifest) => resolve(manifest.artifacts))) + const manifestNames = new Map(manifests.map((manifest) => [resolve(manifest.artifacts), manifest.name])) + const artifacts = entries + .filter((entry) => entry.isDirectory() && entry.name.startsWith("run-")) + .map((entry) => join(directory, entry.name)) + const matched = await Promise.all( + artifacts.map(async (artifacts) => { + if (options.name === undefined) return artifacts + const storedName = await Bun.file(join(artifacts, "drive", "name")) + .text() + .then((value) => value.trim()) + .catch(() => undefined) + return storedName === options.name || manifestNames.get(resolve(artifacts)) === options.name + ? artifacts + : undefined + }), + ) + const pruned = matched + .filter((artifacts): artifacts is string => artifacts !== undefined) + .filter((artifacts) => options.force || !active.has(resolve(artifacts))) + + await Promise.all(pruned.map((artifacts) => rm(artifacts, { recursive: true, force: true }))) + console.log(pruned.length) +} + +function isNodeError(error: unknown): error is NodeJS.ErrnoException { + return error instanceof Error && "code" in error +} diff --git a/packages/drive/src/cli/response-generator.ts b/packages/drive/src/cli/response-generator.ts new file mode 100644 index 00000000000..f928d073dd3 --- /dev/null +++ b/packages/drive/src/cli/response-generator.ts @@ -0,0 +1,302 @@ +import { Backend } from "../client/protocol.js" +import type { JsonValue } from "../project.js" + +export const responseTypes = ["text", "reasoning", "tool", "diff"] as const +export type ResponseType = (typeof responseTypes)[number] + +export interface ResponseConfiguration { + readonly types: ReadonlyArray + readonly tools: ReadonlyArray +} + +export interface ResponseUpdate { + readonly types?: ReadonlyArray + readonly tools?: ReadonlyArray +} + +const textResponses = [ + "I took a careful look at the problem and followed it through the parts of the system that actually shape the behavior. The result is simpler than it first appeared: one clear boundary, one owner, and fewer opportunities for state to drift. There is a quiet satisfaction in watching the pieces settle into place.", + "The important path is working now, and the surrounding behavior remains intact. I kept the change focused, made the failure case visible, and checked the point where control passes from one process to another. It is a small adjustment, but it lets a little more daylight into the design.", + "I traced the request from its first input to its final effect and found the useful seam in between. The implementation now says what it means without asking the reader to remember hidden state. Nothing dramatic happened, which is often the nicest possible ending for this kind of work.", + "The pieces fit together cleanly after the change. Inputs are handled where they arrive, ownership stays explicit, and cleanup follows the same path every time. The code feels calmer now, like a room after someone has opened a window and put the books back in order.", + "I checked the current behavior, made the narrow change, and followed it through the edge cases that mattered. The result is direct enough to explain and ordinary enough to trust. Somewhere in the background, the event loop continues its patient little orbit.", +] + +const reasoningResponses = [ + "I should inspect the available context before choosing the smallest reliable path through this.", + "I need to preserve the working behavior while checking the boundary where ownership changes hands.", + "The request contains enough information to proceed, though the assumptions deserve one careful pass first.", + "I will separate the observed behavior from the implementation detail, then test the seam between them.", + "The safest approach is to validate the current state, make one deliberate change, and follow its effects.", +] + +export function createResponseSettings() { + let configuration: ResponseConfiguration = { + types: ["text", "reasoning", "diff", "tool"], + tools: ["write", "apply_patch"], + } + return { + current: () => configuration, + update(input: ResponseUpdate) { + const updated = { + types: input.types ? parseTypes(input.types) : configuration.types, + tools: input.tools ? parseTools(input.tools) : configuration.tools, + } + if ( + updated.types.includes("diff") && + !updated.tools.includes("*") && + !updated.tools.some((tool) => diffTools.has(tool)) + ) + throw new Error("diff responses require apply_patch, write, or edit in --tools") + configuration = updated + return configuration + }, + } +} + +export function generateResponse( + configuration: ResponseConfiguration, + request: Backend.ProviderInvocation, +): { + readonly items: ReadonlyArray + readonly finish: Backend.FinishReason +} { + if (hasToolResult(request.body)) return textResponse() + const tools = offeredTools(request.body).filter( + (tool) => configuration.tools.includes("*") || configuration.tools.includes(tool.name), + ) + const available = configuration.types.filter( + (type) => + (type !== "tool" || tools.length > 0) && (type !== "diff" || tools.some((tool) => diffTools.has(tool.name))), + ) + const type = pick(available) + if (type === "reasoning") + return { + items: [ + { type: "reasoningDelta", text: pick(reasoningResponses) }, + { type: "textDelta", text: pick(textResponses) }, + ], + finish: "stop", + } + if (type === "tool") return toolResponse(tools.slice(0, 3), false) + if (type === "diff") + return toolResponse( + [ + ["apply_patch", "write", "edit"] + .map((name) => tools.find((tool) => tool.name === name)) + .find((tool) => tool !== undefined)!, + ], + true, + ) + if (type === "text") return textResponse() + return { + items: [ + { + type: "textDelta", + text: "No configured response type matched the tools offered by this request.", + }, + ], + finish: "stop", + } +} + +function textResponse() { + return { + items: [{ type: "textDelta" as const, text: pick(textResponses) }], + finish: "stop" as const, + } +} + +interface ToolDefinition { + readonly name: string + readonly parameters: unknown +} + +const diffTools = new Set(["apply_patch", "edit", "write"]) +let gardenExpanded = false + +function toolResponse(tools: ReadonlyArray, diff: boolean) { + return { + items: tools.map((tool, index) => ({ + type: "toolCall" as const, + index, + id: `call_${crypto.randomUUID().replaceAll("-", "").slice(0, 16)}`, + name: tool.name, + input: toolInput(tool, diff), + })), + finish: "tool-calls" as const, + } +} + +function offeredTools(body: unknown) { + if (!isRecord(body) || !Array.isArray(body.tools)) return [] + return body.tools.flatMap((value): ToolDefinition[] => { + if (!isRecord(value)) return [] + const definition = isRecord(value.function) ? value.function : value + if (typeof definition.name !== "string") return [] + return [ + { + name: definition.name, + parameters: definition.parameters ?? definition.inputSchema, + }, + ] + }) +} + +function toolInput(tool: ToolDefinition, diff: boolean) { + const generated = schemaValue(tool.parameters, "input") + const input = isJsonRecord(generated) ? generated : {} + const known = knownInput(tool.name, diff) + if (!isRecord(tool.parameters) || !isRecord(tool.parameters.properties)) return { ...input, ...known } + const properties = tool.parameters.properties + return { + ...input, + ...Object.fromEntries( + Object.entries(known).filter(([key, value]) => key in properties && acceptsValue(properties[key], value)), + ), + } +} + +function knownInput(name: string, diff: boolean): Record { + const suffix = crypto.randomUUID().slice(0, 8) + if (name === "apply_patch") + return { + patchText: gardenPatch(), + } + if (name === "write") + return { + path: "src/garden.js", + filePath: "src/garden.js", + content: + 'export function greet(name, punctuation = "!") {\n const visitor = name.trim() || "traveler"\n return `Hello, ${visitor}${punctuation}`\n}\n', + } + if (name === "edit") + return { + path: ".opencode/opencode.jsonc", + filePath: ".opencode/opencode.jsonc", + oldString: '"name": "Simulation"', + newString: `"name": "Simulation ${suffix}"`, + } + if (name === "read") + return { path: ".opencode/opencode.jsonc", filePath: ".opencode/opencode.jsonc", offset: 1, limit: 120 } + if (name === "glob") return { pattern: "**/*", path: ".", limit: 20 } + if (name === "grep") return { pattern: "simulation", path: ".opencode", include: "*.jsonc", limit: 20 } + if (name === "shell" || name === "bash") + return { command: diff ? "git diff --stat" : "pwd", description: "Inspect the workspace" } + return {} +} + +function gardenPatch() { + const patch = gardenExpanded + ? '*** Begin Patch\n*** Update File: src/garden.js\n@@\n-export function greet(name, punctuation = "!") {\n- const visitor = name.trim() || "traveler"\n- return `Hello, ${visitor}${punctuation}`\n+export function greet(name) {\n+ return `Hello, ${name}.`\n }\n*** End Patch' + : '*** Begin Patch\n*** Update File: src/garden.js\n@@\n-export function greet(name) {\n- return `Hello, ${name}.`\n+export function greet(name, punctuation = "!") {\n+ const visitor = name.trim() || "traveler"\n+ return `Hello, ${visitor}${punctuation}`\n }\n*** End Patch' + gardenExpanded = !gardenExpanded + return patch +} + +function schemaValue(schema: unknown, key: string, root: unknown = schema): JsonValue { + if (!isRecord(schema)) return {} + if (typeof schema.$ref === "string" && schema.$ref.startsWith("#/$defs/")) { + const name = schema.$ref.slice("#/$defs/".length) + if (isRecord(root) && isRecord(root.$defs)) return schemaValue(root.$defs[name], key, root) + } + if ("const" in schema && isJson(schema.const)) return schema.const + if (Array.isArray(schema.enum) && schema.enum.length > 0 && isJson(schema.enum[0])) return schema.enum[0] + const alternative = Array.isArray(schema.anyOf) + ? schema.anyOf[0] + : Array.isArray(schema.oneOf) + ? schema.oneOf[0] + : undefined + if (alternative !== undefined) return schemaValue(alternative, key, root) + if (Array.isArray(schema.allOf) && schema.allOf.length > 0 && schema.type === undefined) + return schemaValue(schema.allOf[0], key, root) + if (schema.type === "object" || isRecord(schema.properties)) { + const properties = isRecord(schema.properties) ? schema.properties : {} + const required = Array.isArray(schema.required) + ? schema.required.filter((value): value is string => typeof value === "string") + : [] + return Object.fromEntries(required.map((name) => [name, schemaValue(properties[name], name, root)])) + } + if (schema.type === "array") { + const count = typeof schema.minItems === "number" ? Math.max(1, schema.minItems) : 1 + return Array.from({ length: count }, () => schemaValue(schema.items, key, root)) + } + if (schema.type === "boolean") return false + if (schema.type === "integer" || schema.type === "number") { + if (typeof schema.minimum === "number") return schema.minimum + if (typeof schema.exclusiveMinimum === "number") return schema.exclusiveMinimum + 1 + return 1 + } + if (schema.type === "null") return null + if (key.toLowerCase().includes("path")) return "." + if (key.toLowerCase().includes("pattern")) return "TODO" + if (key.toLowerCase().includes("command")) return "pwd" + if (key.toLowerCase().includes("content")) return "Generated by the simulated model." + const value = "sample" + return typeof schema.minLength === "number" ? value.padEnd(schema.minLength, "x") : value +} + +function hasToolResult(body: unknown) { + if (!isRecord(body) || !Array.isArray(body.messages)) return false + const message = body.messages.at(-1) + if (!isRecord(message)) return false + if (message.role === "tool") return true + if (!Array.isArray(message.content)) return false + return message.content.some((part) => isRecord(part) && (part.type === "tool-result" || part.type === "tool")) +} + +function acceptsValue(schema: unknown, value: JsonValue) { + if (!isRecord(schema)) return true + if (Array.isArray(schema.enum) && !schema.enum.some((item) => item === value)) return false + if (schema.type === "string") return typeof value === "string" + if (schema.type === "number" || schema.type === "integer") return typeof value === "number" + if (schema.type === "boolean") return typeof value === "boolean" + if (schema.type === "array") return Array.isArray(value) + if (schema.type === "object") return isJsonRecord(value) + return true +} + +function parseTypes(values: ReadonlyArray) { + const types = unique(values) + if (types.length === 0) throw new Error("responses requires at least one type") + const valid = types.filter(isResponseType) + const unknown = types.filter((value) => !isResponseType(value)) + if (unknown.length > 0) throw new Error(`unknown response types: ${unknown.join(", ")}`) + return valid +} + +function parseTools(values: ReadonlyArray) { + const tools = unique(values) + if (tools.length === 0) throw new Error("responses requires at least one tool or *") + if (tools.some((tool) => tool !== "*" && !/^[a-zA-Z0-9_.:-]+$/.test(tool))) + throw new Error("tool names may contain only letters, numbers, dots, underscores, colons, or dashes") + return tools +} + +function unique(values: ReadonlyArray) { + return [...new Set(values.map((value) => value.trim()).filter(Boolean))] +} + +function pick(values: ReadonlyArray) { + return values[Math.floor(Math.random() * values.length)]! +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +function isJsonRecord(value: JsonValue): value is { readonly [key: string]: JsonValue } { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +function isJson(value: unknown): value is JsonValue { + if (value === null) return true + if (["boolean", "number", "string"].includes(typeof value)) return true + if (Array.isArray(value)) return value.every(isJson) + if (!isRecord(value)) return false + return Object.values(value).every(isJson) +} + +function isResponseType(value: string): value is ResponseType { + return responseTypes.some((type) => type === value) +} diff --git a/packages/drive/src/cli/restart.ts b/packages/drive/src/cli/restart.ts new file mode 100644 index 00000000000..618e189fb22 --- /dev/null +++ b/packages/drive/src/cli/restart.ts @@ -0,0 +1,11 @@ +import { request } from "../instance/control.js" +import { resolveInstance } from "../instance/registry.js" +import { configureLogFile, logSuccess } from "../log.js" + +export async function restart(name?: string) { + const manifest = await resolveInstance(name) + configureLogFile(manifest.artifacts) + logSuccess(`restarting ${manifest.name}`) + const recording = await request(manifest.control, "restart") + console.log(recording ?? "success") +} diff --git a/packages/drive/src/cli/run.ts b/packages/drive/src/cli/run.ts new file mode 100644 index 00000000000..e5ab6e16974 --- /dev/null +++ b/packages/drive/src/cli/run.ts @@ -0,0 +1,31 @@ +import { mkdtemp, rm } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join, resolve } from "node:path" +import * as Effect from "effect/Effect" +import * as Process from "../instance/process.js" +import { prepareProgram } from "../script/tooling.js" + +export const runProgram = Effect.fn("Cli.runProgram")((file: string) => + Effect.acquireUseRelease( + Effect.tryPromise({ + try: () => mkdtemp(join(tmpdir(), "opencode-drive-run-")), + catch: (cause) => cause, + }), + (artifacts) => + Effect.gen(function* () { + const runner = yield* Effect.tryPromise({ + try: () => prepareProgram(artifacts, resolve(file)), + catch: (cause) => cause, + }) + const result = yield* Process.run([process.execPath, runner], { + extendEnv: true, + stdin: "inherit", + stdout: "inherit", + stderr: "inherit", + }) + if (result.status !== 0) return yield* Effect.fail(new Error(`program exited with status ${result.status}`)) + return undefined + }), + (artifacts) => Effect.promise(() => rm(artifacts, { recursive: true, force: true })), + ), +) diff --git a/packages/drive/src/cli/script-init.ts b/packages/drive/src/cli/script-init.ts new file mode 100644 index 00000000000..152d5c0b75f --- /dev/null +++ b/packages/drive/src/cli/script-init.ts @@ -0,0 +1,44 @@ +import { mkdir, open, rm } from "node:fs/promises" +import { dirname, resolve } from "node:path" +import { logSuccess } from "../log.js" + +const template = `import { defineScript, Effect, Llm } from "opencode-drive" + +export default defineScript({ + project: { + files: { + "src/example.ts": "export const value = 1\\n", + }, + }, + run: ({ ui, llm }) => + Effect.gen(function* () { + yield* llm.queue(Llm.text("The value is 1.")) + yield* ui.submit("Read src/example.ts") + yield* ui.waitFor("The value is 1.") + yield* ui.screenshot("result") + }), +}) +` + +export async function initScript(path: string) { + const file = resolve(path) + await mkdir(dirname(file), { recursive: true }) + const handle = await open(file, "wx").catch((error: unknown) => { + if (isAlreadyExists(error)) throw new Error(`script already exists: ${file}`, { cause: error }) + throw error + }) + try { + await handle.writeFile(template) + } catch (error) { + await handle.close().catch(() => undefined) + await rm(file, { force: true }) + throw error + } + await handle.close() + logSuccess("created script") + console.log(file) +} + +function isAlreadyExists(error: unknown): error is NodeJS.ErrnoException { + return error instanceof Error && "code" in error && error.code === "EEXIST" +} diff --git a/packages/drive/src/cli/script.ts b/packages/drive/src/cli/script.ts new file mode 100644 index 00000000000..60ec73d81f7 --- /dev/null +++ b/packages/drive/src/cli/script.ts @@ -0,0 +1,199 @@ +import { join, resolve } from "node:path" +import { pathToFileURL } from "node:url" +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import * as Schema from "effect/Schema" +import * as OpenCodeDriver from "../driver/index.js" +import type * as OpenCodeTui from "../driver/client.js" +import * as OpenCodeUi from "../driver/ui.js" +import * as PreparedDriver from "../driver/prepared.js" +import type * as OpenCodeInstance from "../instance/runtime.js" +import { createScriptFileSystem } from "../script/filesystem.js" +import { hasGitMetadata } from "../script/project.js" +import { Names as ToolNames } from "../tool/types.js" +import type { AutomaticScriptDefinition, ScriptDefinition } from "../script/types.js" + +export const loadScript = Effect.fn("DriveCli.loadScript")((file: string) => + Effect.tryPromise({ + try: async () => { + const module: unknown = await import(pathToFileURL(resolve(file)).href) + return isRecord(module) ? { default: module.default } : {} + }, + catch: (cause) => cause, + }).pipe( + Effect.flatMap((module) => + isScriptDefinition(module.default) + ? Effect.succeed(module.default) + : Effect.fail(new Error("script must default-export defineScript(...)")), + ), + ), +) + +export const runScript = Effect.fn("DriveCli.runScript")(function* ( + script: ScriptDefinition, + instance: OpenCodeInstance.Instance, + onScreenshot?: (path: string) => void, + onRecording?: (path: string) => void, + onReady?: () => void, +) { + const prepared = yield* PreparedDriver.make(instance, { + visible: instance.visible, + launch: "launch" in script ? "manual" : "automatic", + tuiName: "default", + tui: script.tui, + }) + const protectGit = yield* Effect.promise(() => hasGitMetadata(join(instance.artifacts, "files"))) + const operationFailure = yield* Deferred.make() + const runUi = (effect: Effect.Effect) => + effect.pipe( + Effect.tapError((cause) => + cause instanceof OpenCodeDriver.UiTimeoutError + ? Deferred.fail(operationFailure, cause).pipe(Effect.asVoid) + : Effect.void, + ), + ) + const recordings = new Set() + const reportRecording = (path: string) => { + if (recordings.has(path)) return + recordings.add(path) + onRecording?.(path) + } + const adaptUi = (ui: OpenCodeUi.Ui): OpenCodeUi.Ui => { + const transformed = OpenCodeUi.transform(ui, runUi) + return { + ...transformed, + screenshot: (name) => + transformed.screenshot(name).pipe(Effect.tap((path) => Effect.sync(() => onScreenshot?.(path)))), + } + } + const adaptTui = (tui: OpenCodeTui.Tui): OpenCodeTui.Tui => { + const recording = tui.recording + return { + ui: adaptUi(tui.ui), + close: tui.close, + ...(recording === undefined + ? {} + : { + recording: { + path: recording.path, + timeline: recording.timeline, + finish: () => + runUi(recording.finish()).pipe(Effect.tap((path) => Effect.sync(() => reportRecording(path)))), + }, + }), + } + } + const tuiOptions = (options?: OpenCodeTui.TuiOptions) => ({ + ...("launch" in script ? script.tui : undefined), + ...options, + }) + function launchTui(options?: OpenCodeTui.TuiOptions): ReturnType + function launchTui(name: string, options?: OpenCodeTui.TuiOptions): ReturnType + function launchTui(nameOrOptions?: string | OpenCodeTui.TuiOptions, options?: OpenCodeTui.TuiOptions) { + const launched = + typeof nameOrOptions === "string" + ? prepared.tuis.launch(nameOrOptions, tuiOptions(options)) + : prepared.tuis.launch(tuiOptions(nameOrOptions)) + return launched.pipe( + Effect.tap(() => Effect.sync(() => onReady?.())), + Effect.map(adaptTui), + ) + } + const tuis: OpenCodeTui.Tuis = { launch: launchTui } + const context = { + fs: createScriptFileSystem(join(instance.artifacts, "files"), { + git: protectGit, + }), + tuis, + server: { + launch: prepared.server.launch, + kill: prepared.server.kill, + }, + llm: prepared.llm, + tools: prepared.tools, + artifacts: instance.artifacts, + } + const primaryTui = prepared.primary + const automatic = (definition: AutomaticScriptDefinition) => { + if (primaryTui === undefined || prepared.driver === undefined) + return Effect.fail(new Error("automatic script did not launch its primary TUI")) + const tui = adaptTui(primaryTui) + return definition.run({ + ...context, + opencode: prepared.driver.opencode, + tui, + ui: tui.ui, + }) + } + const execution = "launch" in script ? script.run({ ...context, tui: null, ui: null }) : automatic(script) + if (!Effect.isEffect(execution)) return yield* Effect.fail(new Error("script run must return an Effect")) + if (primaryTui !== undefined) onReady?.() + yield* Effect.raceAllFirst([ + execution, + Deferred.await(operationFailure), + prepared.failure.pipe(Effect.catchIf(isZeroStatusTuiExit, () => Effect.void)), + ]) + const report = yield* prepared.settle() + for (const path of report.recordings) reportRecording(path) + return undefined +}) + +function isZeroStatusTuiExit(cause: unknown) { + return ( + cause instanceof OpenCodeDriver.OpenCodeDriverError && + cause.operation === "tui.exit" && + cause.message.endsWith("status 0") + ) +} + +function isRecord(value: unknown): value is Readonly> { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +function isScriptDefinition(value: unknown): value is ScriptDefinition { + if (!isRecord(value)) return false + return ( + value.kind === "opencode-drive/script" && + typeof value.run === "function" && + (value.project === undefined || isScriptProject(value.project)) && + (value.config === undefined || isJsonObject(value.config)) && + (value.tuiConfig === undefined || isJsonObject(value.tuiConfig)) && + (value.setup === undefined || typeof value.setup === "function") && + (value.tools === undefined || isToolConfiguration(value.tools)) && + (value.tui === undefined || isTuiOptions(value.tui)) && + (!("launch" in value) || value.launch === "manual") + ) +} + +function isToolConfiguration(value: unknown) { + return typeof value === "function" || Schema.is(ToolNames)(value) +} + +function isTuiOptions(value: unknown) { + if (!isRecord(value)) return false + if (value.recording !== undefined && typeof value.recording !== "boolean") return false + if (value.viewport === undefined) return true + if (!isRecord(value.viewport)) return false + return ( + typeof value.viewport.cols === "number" && + Number.isFinite(value.viewport.cols) && + typeof value.viewport.rows === "number" && + Number.isFinite(value.viewport.rows) + ) +} + +function isJsonObject(value: unknown) { + if (!isRecord(value)) return false + const prototype = Object.getPrototypeOf(value) + return prototype === Object.prototype || prototype === null +} + +function isScriptProject(value: unknown) { + if (!isRecord(value)) return false + if (value.git !== undefined && typeof value.git !== "boolean") return false + if (value.files === undefined) return true + if (!isRecord(value.files)) return false + const prototype = Object.getPrototypeOf(value.files) + if (prototype !== Object.prototype && prototype !== null) return false + return Object.values(value.files).every((contents) => typeof contents === "string" || contents instanceof Uint8Array) +} diff --git a/packages/drive/src/cli/send.ts b/packages/drive/src/cli/send.ts new file mode 100644 index 00000000000..2926f082640 --- /dev/null +++ b/packages/drive/src/cli/send.ts @@ -0,0 +1,39 @@ +import { executeCommands } from "./commands.js" +import type { SendOptions } from "./types.js" +import { defaultPort } from "../client/index.js" +import { resolveInstance, resolveVisibleInstance } from "../instance/registry.js" +import { configureLogFile } from "../log.js" + +export async function send(options: SendOptions) { + if (options.commands.length === 0) throw new Error("send requires at least one --command.ui.* flag") + const result = await executeCommands(await resolveSendEndpoint(options.name), options.commands) + if ( + options.commands.length === 1 && + ["ui.screenshot", "ui.matches", "ui.recording.finish"].includes(options.commands[0]?.operation ?? "") + ) { + console.log(result.results[0]?.result) + return + } + if ( + options.commands.length === 1 && + ["ui.state", "ui.snapshot", "ui.capture"].includes(options.commands[0]?.operation ?? "") + ) { + console.log(JSON.stringify(result.results[0]?.result, undefined, 2)) + return + } + console.log("success") +} + +export async function resolveSendEndpoint(name?: string) { + if (name) { + const manifest = await resolveInstance(name) + configureLogFile(manifest.artifacts) + return manifest.endpoints.ui + } + const manifest = await resolveVisibleInstance() + if (manifest) { + configureLogFile(manifest.artifacts) + return manifest.endpoints.ui + } + return `ws://127.0.0.1:${defaultPort}` +} diff --git a/packages/drive/src/cli/start.ts b/packages/drive/src/cli/start.ts new file mode 100644 index 00000000000..9310f39834e --- /dev/null +++ b/packages/drive/src/cli/start.ts @@ -0,0 +1,485 @@ +import * as Effect from "effect/Effect" +import * as Cause from "effect/Cause" +import * as Exit from "effect/Exit" +import { toStringUnknown } from "effect/Inspectable" +import { initializeInstance } from "../instance/instance.js" +import * as DriveProcess from "../instance/process.js" +import * as OpenCodeInstance from "../instance/runtime.js" +import { mkdir, rm } from "node:fs/promises" +import { join } from "node:path" +import * as SimulationConnector from "../simulation/connector.js" +import { connectMockBackend } from "./mock-backend.js" +import { createResponseSettings } from "./response-generator.js" +import { loadScript, runScript } from "./script.js" +import type { ScriptDefinition } from "../script/types.js" +import { prepareScriptModule } from "../script/tooling.js" +import { finalizeRecording } from "../recording/finalize.js" +import { listenControl } from "../instance/control.js" +import { configureLogFile, logError, logReadyPaths, logSuccess } from "../log.js" +import { + controlPath, + markReady, + markStarting, + initializeManifest, + register, + registryDirectory, + resolveInstance, + unregister, +} from "../instance/registry.js" +import type { StartOptions } from "./types.js" + +export const start = Effect.fn("DriveCli.start")((options: StartOptions) => Effect.scoped(startScoped(options))) + +const startScoped = Effect.fn("DriveCli.startScoped")(function* (options: StartOptions) { + const initializerPid = Number.parseInt(options.daemon ? (process.env.OPENCODE_DRIVE_INITIALIZER_PID ?? "") : "", 10) + if (options.daemon) delete process.env.OPENCODE_DRIVE_INITIALIZER_PID + const initialized = yield* fromPromise(() => + initializeManifest(options.name, process.cwd(), () => initializeInstance(options.name), { + temporary: true, + ...(Number.isInteger(initializerPid) && initializerPid > 0 ? { adoptPid: initializerPid } : {}), + }), + ) + configureLogFile(initialized.artifacts) + logSuccess(`starting ${options.name}`) + logSuccess(`using artifacts ${initialized.artifacts}`) + if (!options.visible && !options.script && !options.daemon) + return yield* startDetached(options, initialized.artifacts) + const scriptPath = options.script + const scriptModule = scriptPath + ? yield* fromPromise(async () => { + logSuccess(`preparing script ${scriptPath}`) + return prepareScriptModule(initialized.artifacts, scriptPath) + }) + : undefined + const script = scriptModule + ? yield* loadScript(scriptModule).pipe( + Effect.tap(() => Effect.sync(() => logSuccess(`loading script ${scriptModule}`))), + ) + : undefined + if (script && "launch" in script && options.record) { + return yield* Effect.fail(new Error("--record is not supported when launch is manual")) + } + const responses = createResponseSettings() + logSuccess("launching instance") + const log = options.visible ? (message: string) => logSuccess(message, { terminal: false }) : logSuccess + const instance = yield* OpenCodeInstance.make({ + artifacts: initialized.artifacts, + name: options.name, + command: options.command, + dev: options.dev, + scripted: options.script !== undefined, + visible: options.visible, + record: options.record, + viewport: script?.tui?.viewport, + project: script?.project, + config: script?.config, + tui: script?.tuiConfig, + setup: script?.setup, + tools: script?.tools, + log, + }) + yield* Effect.acquireRelease( + fromPromise(() => + register({ + version: 1, + name: options.name, + pid: process.pid, + startedAt: new Date().toISOString(), + cwd: process.cwd(), + artifacts: instance.artifacts, + visible: options.visible, + status: "starting", + endpoints: instance.endpoints, + control: controlPath(options.name), + }), + ), + () => fromPromise(() => unregister(options.name, process.pid)).pipe(Effect.ignore), + ) + return yield* lifecycle(options, instance, responses, script, log) +}) + +function lifecycle( + options: StartOptions, + instance: OpenCodeInstance.Instance, + responses: ReturnType, + script: ScriptDefinition | undefined, + log: (message: string) => void, +) { + return Effect.callback((resume) => { + const abort = new AbortController() + const promise = runLifecycle(options, instance, responses, script, log, abort.signal) + void promise.then( + () => resume(Effect.void), + (error) => resume(Effect.fail(error)), + ) + return Effect.gen(function* () { + abort.abort(new Error("opencode-drive interrupted")) + yield* Effect.promise(() => promise.catch(() => undefined)) + }) + }) +} + +async function runLifecycle( + options: StartOptions, + instance: OpenCodeInstance.Instance, + responses: ReturnType, + script: ScriptDefinition | undefined, + log: (message: string) => void, + signal: AbortSignal, +) { + let completed = false + let current: ReturnType | undefined + let restarting: Promise | undefined + let stopping = false + const screenshots: string[] = [] + const recordings: string[] = [] + let driveReady = false + let recording: Promise | undefined + const finishCurrentRecording = (onProgress?: (percent: number) => void) => { + if (!options.record || options.visible || !driveReady || options.script !== undefined) + return Promise.resolve(undefined) + recording ??= finishRecording(instance, onProgress) + return recording + } + const interrupt = () => { + stopping = true + current?.abort.abort(signal.reason) + if (!options.script) void stopInstance().catch((error) => logError(`failed to stop interrupted instance: ${error}`)) + } + signal.addEventListener("abort", interrupt, { once: true }) + const stopInstance = async (onProgress?: (percent: number) => void) => { + try { + const output = await finishCurrentRecording(onProgress) + return { + ...(output ? { recording: output } : {}), + screenshots: [...screenshots], + } + } finally { + stopping = true + current?.abort.abort(new Error("opencode-drive stopped")) + await runEffect(instance.stop) + } + } + const completeScript = async () => { + completed = true + const result = await stopInstance() + for (const screenshot of result.screenshots) console.log(screenshot) + } + let closeControl: (() => Promise) | undefined + let failure: unknown + try { + closeControl = await listenControl(controlPath(options.name), { + restart: () => { + if (restarting) return restarting + restarting = (async () => { + await markStarting(options.name, process.pid) + const output = await finishCurrentRecording() + const previous = current + const restartReason = new Error("script restarted") + previous?.abort.abort(restartReason) + await previous?.promise + driveReady = false + await runEffect(instance.restart) + recording = undefined + current = run( + options, + instance, + responses, + script, + (path) => screenshots.push(path), + (path) => recordings.push(path), + log, + ) + await current.ready + driveReady = true + await markReady(options.name, process.pid) + await logReadyPaths(instance.artifacts, { + terminal: !options.visible, + }) + return output + })().finally(() => { + restarting = undefined + }) + return restarting + }, + stop: stopInstance, + responses: async (input) => { + if (options.script) throw new Error("responses are unavailable when --script owns the simulation backend") + return responses.update(input) + }, + }) + if (signal.aborted) return + current = run( + options, + instance, + responses, + script, + (path) => screenshots.push(path), + (path) => recordings.push(path), + log, + ) + await current.ready + driveReady = true + log(`ready ${options.name}`) + await markReady(options.name, process.pid) + await logReadyPaths(instance.artifacts, { terminal: !options.visible }) + if (options.visible) { + while (true) { + const active: NonNullable = current + let result: { readonly script: true } | { readonly script: false; readonly status: number } + try { + result = options.script + ? await Promise.race([ + active.promise.then(() => ({ script: true as const })), + runEffect(instance.wait).then((status) => ({ script: false as const, status })), + ]) + : { script: false as const, status: await runEffect(instance.wait) } + } catch (error) { + if (stopping) return + if (restarting || active !== current) { + await restarting + continue + } + throw error + } + if (restarting || active !== current) { + await restarting + continue + } + if (result.script) { + await completeScript() + } + const status = result.script ? await runEffect(instance.wait) : result.status + if (status !== 0 && !stopping) process.exitCode = status + return + } + } + while (true) { + const active: NonNullable = current + try { + await active.promise + } catch (error) { + if (stopping) break + if (restarting || active !== current) { + await restarting + continue + } + throw error + } + if (stopping) break + if (restarting) { + await restarting + continue + } + if (active !== current) continue + if (options.script) { + await completeScript() + break + } + completed = true + break + } + } catch (error) { + failure = error + throw error + } finally { + signal.removeEventListener("abort", interrupt) + current?.abort.abort(new Error("opencode-drive stopped")) + let cleanupFailure: unknown + const recordingPath = await finishCurrentRecording().catch((error) => { + logError(`failed to export recording: ${error}`) + return undefined + }) + await closeControl?.().catch((error) => { + cleanupFailure ??= error + logError(`failed to close control socket: ${error}`) + }) + await runEffect(instance.stop).catch((error) => { + cleanupFailure ??= error + logError(`failed to stop OpenCode: ${error}`) + }) + await unregister(options.name, process.pid).catch((error) => { + cleanupFailure ??= error + logError(`failed to unregister ${options.name}: ${error}`) + }) + if (options.script && !options.visible) report(completed ? "completed" : undefined) + if (options.script && recordingPath) logSuccess(`recording ${recordingPath}`) + if (options.script) for (const output of recordings) logSuccess(`recording ${output}`) + if (shouldCleanArtifacts(options.script, completed, failure, cleanupFailure)) + await rm(instance.artifacts, { recursive: true, force: true }).catch((error) => { + cleanupFailure ??= error + logError(`failed to clean artifacts ${instance.artifacts}: ${error}`) + }) + if (options.script && failure !== undefined) { + logError(failure instanceof Error ? failure.message : toStringUnknown(failure)) + process.exit(1) + } + if (failure === undefined && cleanupFailure !== undefined) process.exitCode = 1 + } +} + +function shouldCleanArtifacts( + script: string | undefined, + completed: boolean, + failure: unknown, + cleanupFailure: unknown, +) { + return ( + script !== undefined && + completed && + failure === undefined && + cleanupFailure === undefined && + (process.exitCode === undefined || process.exitCode === 0) && + process.env.OPENCODE_DRIVE_KEEP_ARTIFACTS !== "1" + ) +} + +async function finishRecording(instance: OpenCodeInstance.Instance, onProgress?: (percent: number) => void) { + const expected = await runEffect(instance.recording) + if (!expected) throw new Error("recording was not enabled for this instance") + let timeline: string + const process = await runEffect(instance.primary) + if (!(await runEffect(process.isRunning))) { + timeline = expected.timeline + } else { + timeline = await runEffect( + Effect.scoped( + SimulationConnector.ui(instance.endpoints.ui, { + connectTimeout: 60_000, + }).pipe( + Effect.flatMap((connection) => connection.rpc["ui.recording.finish"]()), + Effect.timeoutOrElse({ + duration: 60_000, + orElse: () => Effect.fail(new Error("ui.recording.finish timed out")), + }), + ), + ), + ) + } + return finalizeRecording(timeline, expected, { onProgress }) +} + +const startDetached = Effect.fn("DriveCli.startDetached")(function* (options: StartOptions, artifacts: string) { + const ownerLog = join(registryDirectory(), `${options.name}.log`) + yield* fromPromise(() => mkdir(registryDirectory(), { recursive: true })) + yield* fromPromise(() => rm(ownerLog, { force: true })) + logSuccess(`launching detached owner for ${options.name}`) + const child = yield* DriveProcess.spawn( + [ + process.execPath, + process.argv[1]!, + "start", + "--daemon", + "--name", + options.name, + ...(options.script ? ["--script", options.script] : []), + ...(options.dev ? ["--dev", options.dev] : []), + ...(options.record ? ["--record"] : []), + ...(options.command.length ? ["--", ...options.command] : []), + ], + { + cwd: process.cwd(), + env: { + ...process.env, + OPENCODE_DRIVE_LOG: configureLogFile(artifacts), + OPENCODE_DRIVE_OWNER_LOG: ownerLog, + OPENCODE_DRIVE_INITIALIZER_PID: String(process.pid), + }, + stdin: "ignore", + stdout: "ignore", + stderr: "ignore", + detached: true, + }, + ) + logSuccess(`waiting for ${options.name} to become ready`) + const deadline = Date.now() + 60_000 + while (Date.now() < deadline) { + const manifest = yield* fromPromise(() => resolveInstance(options.name).catch(() => undefined)) + if (manifest?.pid === child.pid) { + logSuccess(`ready ${options.name}`) + yield* fromPromise(() => logReadyPaths(manifest.artifacts)) + yield* child.detach + return + } + if (!(yield* child.isRunning)) { + const status = yield* child.exitCode + yield* Effect.fail(new Error(`detached instance exited with status ${status}; see ${ownerLog}`)) + } + yield* Effect.sleep(50) + } + yield* child.terminate + yield* Effect.fail(new Error(`timed out starting drive instance "${options.name}"; see ${ownerLog}`)) +}) + +function run( + options: StartOptions, + instance: OpenCodeInstance.Instance, + responses: ReturnType, + driveScript: ScriptDefinition | undefined, + onScreenshot: (path: string) => void, + onRecording: (path: string) => void, + log: (message: string) => void, +) { + const abort = new AbortController() + const readiness = Promise.withResolvers() + let markedReady = false + const ready = () => { + if (markedReady) return + markedReady = true + readiness.resolve() + } + const promise = (async () => { + if (!driveScript) { + log("waiting for OpenCode") + await runEffect(instance.waitForDrive("both")) + log("OpenCode ready") + } + if (driveScript) { + log("running script") + const exit = await Effect.runPromiseExit( + Effect.scoped(runScript(driveScript, instance, onScreenshot, onRecording, ready)), + { signal: abort.signal }, + ) + if (Exit.isFailure(exit)) { + if (abort.signal.aborted && Cause.hasInterruptsOnly(exit.cause)) return + throw Cause.squash(exit.cause) + } + ready() + log("script completed") + return + } + const child = await runEffect(instance.primary) + const mock = await connectMockBackend(instance.endpoints.backend, responses) + ready() + abort.signal.addEventListener("abort", () => mock.close(), { + once: true, + }) + const status = await Promise.race([ + runEffect(child.exitCode), + new Promise((resolve) => + abort.signal.addEventListener("abort", () => resolve(0), { + once: true, + }), + ), + ]) + mock.close() + if (status !== 0 && !abort.signal.aborted) process.exitCode = status + })().catch((error) => { + if (!markedReady) readiness.reject(error) + throw error + }) + void promise.catch(() => undefined) + return { + abort, + ready: readiness.promise, + promise, + } +} + +const runEffect = (effect: Effect.Effect) => Effect.runPromise(effect) + +const fromPromise = (task: () => Promise) => Effect.tryPromise({ try: task, catch: (error) => error }) + +function report(status?: string) { + if (status) logSuccess(status) +} diff --git a/packages/drive/src/cli/stop.ts b/packages/drive/src/cli/stop.ts new file mode 100644 index 00000000000..090909ae66b --- /dev/null +++ b/packages/drive/src/cli/stop.ts @@ -0,0 +1,38 @@ +import { rm } from "node:fs/promises" +import { basename, dirname, resolve } from "node:path" +import { artifactDirectory } from "../instance/instance.js" +import { requestStop } from "../instance/control.js" +import { manifestPath, resolveInstance } from "../instance/registry.js" +import { configureLogFile, logSuccess } from "../log.js" + +export async function stop(name?: string) { + const manifest = await resolveInstance(name) + configureLogFile(manifest.artifacts) + const result = await requestStop(manifest.control, (percent) => { + logSuccess(`Rendering video: ${percent}%`) + }) + const deadline = Date.now() + 5 * 60_000 + while (Date.now() < deadline) { + const current: unknown = await Bun.file(manifestPath(manifest.name)) + .json() + .catch(() => undefined) + if (typeof current !== "object" || current === null || !("pid" in current) || current.pid !== manifest.pid) { + for (const screenshot of result.screenshots) console.log(screenshot) + if (result.recording) { + logSuccess(`Video successfully created: ${result.recording}`) + } else if (result.screenshots.length === 0) { + console.log("success") + } + await pruneArtifacts(manifest.artifacts) + return + } + await Bun.sleep(25) + } + throw new Error(`timed out stopping drive instance "${manifest.name}"`) +} + +async function pruneArtifacts(artifacts: string) { + const directory = resolve(artifacts) + if (dirname(directory) !== artifactDirectory() || !/^run-[^/\\]+$/.test(basename(directory))) return + await rm(directory, { recursive: true, force: true }) +} diff --git a/packages/drive/src/cli/types.ts b/packages/drive/src/cli/types.ts new file mode 100644 index 00000000000..532e23d62c8 --- /dev/null +++ b/packages/drive/src/cli/types.ts @@ -0,0 +1,25 @@ +import type { Frontend } from "../client/index.js" + +export interface DriveCommand { + readonly operation: Exclude + readonly value?: string +} + +export interface StartOptions { + readonly kind: "start" + readonly name: string + readonly daemon: boolean + readonly script?: string + readonly visible: boolean + readonly record: boolean + readonly dev?: string + readonly command: ReadonlyArray +} + +export interface SendOptions { + readonly kind: "send" + readonly name?: string + readonly commands: ReadonlyArray +} + +export type CliOptions = StartOptions | SendOptions diff --git a/packages/drive/src/client/index.ts b/packages/drive/src/client/index.ts new file mode 100644 index 00000000000..5a417f76d5b --- /dev/null +++ b/packages/drive/src/client/index.ts @@ -0,0 +1,11 @@ +import type { Backend } from "./protocol.js" + +/** Default port of the OpenCode UI simulation server. */ +export const defaultPort = 40900 +/** Default port of the OpenCode backend (LLM) simulation server. */ +export const defaultBackendPort = 40950 + +export { Backend, Frontend, Handshake, JsonRpc, SimulationProtocol } from "./protocol.js" +export type BackendFinishReason = Backend.FinishReason +export type BackendItem = Backend.Item +export type OpenedExchange = Backend.ProviderInvocation diff --git a/packages/drive/src/client/protocol.ts b/packages/drive/src/client/protocol.ts new file mode 100644 index 00000000000..77eb04cd464 --- /dev/null +++ b/packages/drive/src/client/protocol.ts @@ -0,0 +1,4 @@ +import { Backend, Frontend, Handshake, JsonRpc } from "@opencode-ai/protocol/simulation" + +export { Backend, Frontend, Handshake, JsonRpc } +export const SimulationProtocol = { Backend, Frontend, Handshake, JsonRpc } diff --git a/packages/drive/src/driver/client.ts b/packages/drive/src/driver/client.ts new file mode 100644 index 00000000000..9b4aee5c69b --- /dev/null +++ b/packages/drive/src/driver/client.ts @@ -0,0 +1,277 @@ +import * as Cause from "effect/Cause" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as Ref from "effect/Ref" +import * as Semaphore from "effect/Semaphore" +import * as Scope from "effect/Scope" +import * as Deferred from "effect/Deferred" +import type * as OpenCodeInstance from "../instance/runtime.js" +import type * as SimulationConnector from "../simulation/connector.js" +import type { Frontend } from "../client/protocol.js" +import { finalizeRecording } from "../recording/finalize.js" +import { error, type OpenCodeDriverError } from "./error.js" +import * as OpenCodeUi from "./ui.js" +import * as SharedEffect from "./shared.js" + +export interface TuiOptions { + readonly recording?: boolean + readonly viewport?: Frontend.ResizeParams +} + +export interface Tui { + readonly ui: OpenCodeUi.Ui + readonly recording?: Recording + readonly close: () => Effect.Effect +} + +export interface Recording { + readonly path: string + readonly timeline: string + readonly finish: () => Effect.Effect +} + +interface ManagedTui extends Tui { + readonly compatibility: SimulationConnector.EndpointCompatibility + readonly _exitCode: Effect.Effect + readonly _recording?: { + readonly finishTimeline: Effect.Effect + readonly exportRecording: Effect.Effect + } +} + +export const make = Effect.fn("OpenCodeTui.make")(function* ( + instance: OpenCodeInstance.Instance, + visible: boolean, + identity: string, + options: TuiOptions, + connector: SimulationConnector.Interface, + compatibility?: SimulationConnector.CompatibilityPolicy, +) { + if (visible && options.recording) + return yield* Effect.fail(error("tui.launch", "recording requires a headless OpenCode TUI")) + const launched = yield* Effect.acquireRelease( + instance + .launchTui(identity, { + record: options.recording, + viewport: options.viewport, + }) + .pipe(Effect.mapError((cause) => error("tui.launch", cause))), + (client) => client.close.pipe(Effect.catchCause((cause) => Effect.logError("OpenCode TUI cleanup failed", cause))), + ) + const connection = yield* connector.ui(launched.endpoint, { compatibility }) + const ui = OpenCodeUi.make(connection) + yield* ui.waitFor((state) => state.focused.editor, { + timeout: 30_000, + interval: 50, + }) + + const recording = launched.recording + let managedRecording: ManagedTui["_recording"] + if (recording !== undefined) { + const finishTimeline = yield* SharedEffect.make( + Effect.gen(function* () { + const timeline = yield* ui.finishRecording() + if (timeline !== recording.timeline) + return yield* Effect.fail( + error("recording.finish", `OpenCode returned an unexpected recording path: ${timeline}`), + ) + return timeline + }), + ) + const exportFinishedRecording = yield* SharedEffect.make( + Effect.flatMap(finishTimeline, (timeline) => + Effect.tryPromise({ + try: (signal) => finalizeRecording(timeline, recording, { signal }), + catch: (cause) => error("recording.export", cause), + }), + ), + ) + managedRecording = { + finishTimeline, + exportRecording: exportFinishedRecording, + } + yield* Effect.addFinalizer(() => + finishTimeline.pipe( + Effect.asVoid, + Effect.catchCause((cause) => Effect.logError("OpenCode TUI recording finalization failed", cause)), + ), + ) + } + + return { + ui, + compatibility: connection.compatibility, + close: () => Effect.void, + _exitCode: launched.process.exitCode.pipe(Effect.mapError((cause) => error("tui.exit", cause))), + ...(recording === undefined || managedRecording === undefined + ? {} + : { + recording: { + path: recording.video, + timeline: recording.timeline, + finish: () => managedRecording.exportRecording, + }, + _recording: managedRecording, + }), + } satisfies ManagedTui +}) + +export interface Tuis { + readonly launch: { + (options?: TuiOptions): Effect.Effect + /** Launches a named TUI. The name is released when that TUI closes. */ + (name: string, options?: TuiOptions): Effect.Effect + } +} + +export type TuiLaunchError = + | OpenCodeDriverError + | SimulationConnector.SimulationCompatibilityError + | OpenCodeUi.OperationError + | OpenCodeUi.UiPredicateError + | OpenCodeUi.UiWaitOptionsError + +export interface UnexpectedExit { + readonly name: string + readonly status: number +} + +export interface Control extends Tuis { + readonly compatibility: Effect.Effect> + readonly unexpectedExit: Effect.Effect + readonly settle: () => Effect.Effect, OpenCodeDriverError | OpenCodeUi.OperationError> +} + +export const makeTuis = Effect.fn("OpenCodeTuis.make")(function* ( + instance: OpenCodeInstance.Instance, + visible: boolean, + connector: SimulationConnector.Interface, + compatibilityPolicy?: SimulationConnector.CompatibilityPolicy, +) { + const parentScope = yield* Scope.Scope + const tuisScope = yield* Scope.fork(parentScope, "parallel") + const lock = yield* Semaphore.make(1) + let closed = false + let recordings: ReadonlyArray> = [] + const nextIdentity = yield* Ref.make(0) + let active: ReadonlyMap = new Map() + const unexpectedExit = yield* Deferred.make() + let compatibility: ReadonlyArray = [] + + const launchNamed = Effect.fn("OpenCodeTuis.launchNamed")(function* (identity: string, options: TuiOptions = {}) { + return yield* lock.withPermit( + Effect.gen(function* () { + if (closed) return yield* Effect.fail(error("tui.launch", "OpenCode TUIs are closed")) + if (active.has(identity)) + return yield* Effect.fail(error("tui.launch", `TUI "${identity}" is already connected`)) + const scope = yield* Scope.fork(tuisScope) + active = new Map(active).set(identity, scope) + const client = yield* make(instance, visible, identity, options, connector, compatibilityPolicy).pipe( + Scope.provide(scope), + Effect.onError(() => + Effect.sync(() => { + const next = new Map(active) + next.delete(identity) + active = next + }).pipe(Effect.andThen(Scope.close(scope, Exit.void))), + ), + ) + compatibility = [...compatibility, client.compatibility] + const recording = client._recording + if (recording !== undefined) recordings = [...recordings, recording] + const claim = lock.withPermit( + Effect.sync(() => { + if (active.get(identity) !== scope) return false + const next = new Map(active) + next.delete(identity) + active = next + return true + }), + ) + const release = claim.pipe(Effect.flatMap((owned) => (owned ? Scope.close(scope, Exit.void) : Effect.void))) + yield* client._exitCode.pipe( + Effect.flatMap((status) => + claim.pipe( + Effect.flatMap((owned) => + owned + ? Deferred.succeed(unexpectedExit, { + name: identity, + status, + }).pipe(Effect.andThen(Scope.close(scope, Exit.void))) + : Effect.void, + ), + ), + ), + Effect.catchCause(() => Effect.void), + Effect.forkIn(tuisScope), + ) + const publicTui: Tui = { + ui: client.ui, + ...(client.recording === undefined ? {} : { recording: client.recording }), + close: () => release, + } + return publicTui + }), + ) + }) + + function launch(options?: TuiOptions): Effect.Effect + function launch(name: string, options?: TuiOptions): Effect.Effect + function launch(nameOrOptions: string | TuiOptions = {}, options: TuiOptions = {}) { + return typeof nameOrOptions === "string" + ? launchNamed(nameOrOptions, options) + : Ref.getAndUpdate(nextIdentity, (value) => value + 1).pipe( + Effect.flatMap((identity) => launchNamed(String(identity), nameOrOptions)), + ) + } + + const finishTimelines = yield* SharedEffect.make( + Effect.gen(function* () { + const active = yield* lock.withPermit( + Effect.sync(() => { + closed = true + return recordings + }), + ) + const finished = yield* Effect.forEach(active, (recording) => Effect.exit(recording.finishTimeline), { + concurrency: "unbounded", + }) + yield* Scope.close(tuisScope, Exit.void) + return { active, finished } + }), + ) + + const settle = Effect.fn("OpenCodeTuis.settle")(function* () { + const { active, finished } = yield* finishTimelines + const exported = yield* Effect.forEach( + active, + (recording, index) => + Exit.isSuccess(finished[index]!) + ? Effect.exit(recording.exportRecording).pipe( + Effect.map( + (result): Exit.Exit => result, + ), + ) + : Effect.succeed(Exit.succeed(undefined)), + { + concurrency: 2, + }, + ) + let failure: Cause.Cause | undefined + for (const result of [...finished, ...exported]) { + if (!Exit.isFailure(result)) continue + failure = failure === undefined ? result.cause : Cause.combine(failure, result.cause) + } + if (failure !== undefined) return yield* Effect.failCause(failure) + return exported.flatMap((result) => (Exit.isSuccess(result) && result.value !== undefined ? [result.value] : [])) + }) + + return { + launch, + unexpectedExit: Deferred.await(unexpectedExit), + compatibility: Effect.sync(() => compatibility), + settle, + } satisfies Control +}) + +export * as OpenCodeTui from "./client.js" diff --git a/packages/drive/src/driver/error.ts b/packages/drive/src/driver/error.ts new file mode 100644 index 00000000000..39691c04543 --- /dev/null +++ b/packages/drive/src/driver/error.ts @@ -0,0 +1,14 @@ +import * as Schema from "effect/Schema" + +export class OpenCodeDriverError extends Schema.TaggedErrorClass()("OpenCodeDriverError", { + operation: Schema.String, + message: Schema.String, +}) {} + +export const error = (operation: string, cause: unknown) => + cause instanceof OpenCodeDriverError + ? cause + : new OpenCodeDriverError({ + operation, + message: cause instanceof Error ? cause.message : String(cause), + }) diff --git a/packages/drive/src/driver/index.ts b/packages/drive/src/driver/index.ts new file mode 100644 index 00000000000..790e9587de6 --- /dev/null +++ b/packages/drive/src/driver/index.ts @@ -0,0 +1,151 @@ +import * as Effect from "effect/Effect" +import * as Cause from "effect/Cause" +import * as Exit from "effect/Exit" +import * as Layer from "effect/Layer" +import type * as Scope from "effect/Scope" +import * as NodeServices from "@effect/platform-node/NodeServices" +import * as OpenCodeInstance from "../instance/runtime.js" +import * as SimulationConnector from "../simulation/connector.js" +import type { OpenCodeConfig, OpenCodeTuiConfig, Project, Setup } from "../project.js" +import * as OpenCodeTui from "./client.js" +import type * as OpenCodeSdk from "./opencode.js" +import { error, type OpenCodeDriverError } from "./error.js" +import type { LlmControllerError, LlmSettlementError } from "./llm-controller.js" +import * as OpenCodeProject from "./project.js" +import * as PreparedDriver from "./prepared.js" +import * as OpenCodeServer from "./server.js" +import type * as OpenCodeUi from "./ui.js" +import type { Llm } from "./llm.js" +import type { RunReport } from "./report.js" +import * as ToolController from "../tool/controller.js" +import type * as Tool from "../tool/index.js" + +export interface Options { + readonly project?: Project + readonly config?: OpenCodeConfig + readonly tuiConfig?: OpenCodeTuiConfig + readonly setup?: Setup + readonly tools?: Tool.Configuration + readonly tui?: OpenCodeTui.TuiOptions + readonly opencode?: OpenCodeServer.Target + readonly keepArtifacts?: boolean +} + +export interface Driver { + /** Generated SDK client connected to this driver's private OpenCode service. */ + readonly opencode: OpenCodeSdk.OpenCode + readonly tui: OpenCodeTui.Tui + /** Convenience alias for the primary TUI's UI. */ + readonly ui: OpenCodeUi.Ui + readonly llm: Llm + /** Runtime controls for tools declared by name in the driver options. */ + readonly tools: Tool.Controls + readonly tuis: OpenCodeTui.Tuis + readonly artifacts: string + /** Validates queued LLM work, stops TUIs, and exports recordings. */ + readonly settle: () => Effect.Effect< + RunReport, + LlmControllerError | LlmSettlementError | OpenCodeDriverError | OpenCodeUi.OperationError + > +} + +const makeWithServices = Effect.fn("OpenCodeDriver.makeWithServices")(function* (options: Options = {}) { + const toolController = yield* ToolController.make(options.tools) + const project = yield* OpenCodeProject.make({ + project: options.project, + config: options.config, + tui: options.tuiConfig, + setup: ToolController.composeSetup(toolController, options.setup), + keepArtifacts: options.keepArtifacts, + }) + const instance = yield* OpenCodeInstance.make( + { + artifacts: project.artifacts, + name: `library-${crypto.randomUUID().slice(0, 12)}`, + scripted: true, + command: options.opencode?.command, + dev: options.opencode?.dev, + env: options.opencode?.env, + visible: options.opencode?.visible, + }, + toolController, + ).pipe(Effect.mapError((cause) => error("server.prepare", cause))) + const prepared = yield* PreparedDriver.makeWithServices(instance, { + visible: options.opencode?.visible, + tui: options.tui, + artifactsRetained: options.keepArtifacts ?? false, + compatibility: options.opencode?.compatibility, + }) + if (prepared.driver === undefined) return yield* Effect.die(new Error("automatic driver did not launch a TUI")) + return { driver: prepared.driver, failure: prepared.failure } +}) + +type MakeWithServices = ReturnType +const layer = Layer.merge(SimulationConnector.layer, NodeServices.layer) + +const makeManaged = ( + options: Options = {}, +): Effect.Effect, Effect.Error, Scope.Scope> => + makeWithServices(options).pipe(Effect.provide(layer)) + +export const make = (options: Options = {}) => makeManaged(options).pipe(Effect.map(({ driver }) => driver)) + +type Program = (driver: Driver) => Effect.Effect + +const runReport = (options: Options, f: Program) => + Effect.scoped( + Effect.uninterruptibleMask((restore) => + Effect.gen(function* () { + const { driver, failure } = yield* makeManaged(options) + const useExit = yield* Effect.exit(restore(Effect.raceFirst(f(driver), failure))) + const settlement = yield* Effect.exit(driver.settle()) + if (Exit.isFailure(useExit) && Exit.isFailure(settlement)) + return yield* Effect.failCause(Cause.combine(useExit.cause, settlement.cause)) + if (Exit.isFailure(useExit)) return yield* Effect.failCause(useExit.cause) + if (Exit.isFailure(settlement)) return yield* Effect.failCause(settlement.cause) + return { value: useExit.value, report: settlement.value } + }), + ), + ) + +export function useReport(f: Program): ReturnType> +export function useReport(options: Options, f: Program): ReturnType> +export function useReport(optionsOrProgram: Options | Program, program?: Program) { + if (typeof optionsOrProgram === "function") return runReport({}, optionsOrProgram) + if (program === undefined) return Effect.die(new Error("OpenCodeDriver.useReport requires a program")) + return runReport(optionsOrProgram, program) +} + +const run = (options: Options, program: Program) => + runReport(options, program).pipe(Effect.map(({ value }) => value)) + +export function use(f: Program): ReturnType> +export function use(options: Options, f: Program): ReturnType> +export function use(optionsOrProgram: Options | Program, program?: Program) { + return typeof optionsOrProgram === "function" + ? run({}, optionsOrProgram) + : program === undefined + ? Effect.die(new Error("OpenCodeDriver.use requires a program")) + : run(optionsOrProgram, program) +} + +export { OpenCodeDriverError } from "./error.js" +export { LlmControllerError, LlmModeError, LlmSettlementError } from "./llm-controller.js" +export { + UiCapabilityError, + UiElementAmbiguousError, + UiNodeAmbiguousError, + UiPredicateError, + UiTimeoutError, + UiWaitOptionsError, +} from "./ui.js" +export { SimulationRequestError } from "@opencode-ai/protocol/simulation" +export { SimulationCompatibilityError, SimulationConnectionError } from "../simulation/connector.js" +export type { CompatibilityPolicy, EndpointCompatibility } from "../simulation/connector.js" +export type { Recording, Tui, TuiLaunchError, TuiOptions, Tuis } from "./client.js" +export type { Llm } from "./llm.js" +export type { Target as OpenCodeTarget } from "./server.js" +export type { OpenCode } from "./opencode.js" +export type { Ui } from "./ui.js" +export type { Project, ProjectFileSystem, Setup, SetupContext } from "../project.js" +export * from "./report.js" diff --git a/packages/drive/src/driver/llm-controller.ts b/packages/drive/src/driver/llm-controller.ts new file mode 100644 index 00000000000..17d0d8e326b --- /dev/null +++ b/packages/drive/src/driver/llm-controller.ts @@ -0,0 +1,409 @@ +import type * as Cause from "effect/Cause" +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as FiberSet from "effect/FiberSet" +import * as Queue from "effect/Queue" +import * as Ref from "effect/Ref" +import * as Schema from "effect/Schema" +import * as Scope from "effect/Scope" +import * as Semaphore from "effect/Semaphore" +import * as Stream from "effect/Stream" +import * as Llm from "../llm/index.js" +import { isTitleRequest } from "../llm/internal.js" +import type { BackendConnection } from "../simulation/connector.js" +import { causeError, controllerError, LlmControllerError, LlmSettlementError } from "./llm-errors.js" +import * as LlmResponder from "./llm-responder.js" +import * as LlmState from "./llm-state.js" + +/** + * The concurrency shell of the LLM controller. Decision logic lives in the + * pure `llm-state.ts` module; wire streaming lives in `llm-responder.ts`. + * This module owns the lock, the state ref, job fibers, and deferreds. + */ + +export { LlmControllerError, LlmModeError, LlmSettlementError } from "./llm-errors.js" +export type { Response } from "./llm-responder.js" +export type { ServeHandler, TitleHandler } from "./llm-state.js" + +export interface Options { + /** Per-backend-RPC timeout in milliseconds. Defaults to 30,000. */ + readonly requestTimeout?: number + /** Time allowed for queued and active responses to settle. Defaults to 30,000. */ + readonly settlementTimeout?: number +} + +export interface Controller { + /** Attaches one backend generation while preserving response state. */ + readonly attach: (backend: BackendConnection) => Effect.Effect + readonly queue: (...output: ReadonlyArray) => Effect.Effect + readonly send: (...output: ReadonlyArray) => Effect.Effect + readonly serve: (handler: LlmState.ServeHandler) => Effect.Effect + readonly title: (handler: LlmState.TitleHandler) => Effect.Effect + readonly settle: () => Effect.Effect + /** Interrupts request routing and response workers. Used by the driver coordinator. */ + readonly shutdown: () => Effect.Effect + /** Fails when request routing or the backend connection fails. */ + readonly failure: Effect.Effect +} + +export interface Attachment { + readonly detach: () => Effect.Effect +} + +/** A committed normal job: its selection plus the shell-owned completion. */ +interface NormalJob extends LlmState.NormalStart { + readonly completion: LlmState.Completion +} + +const NonNegativeMilliseconds = Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0)) +const decodeOutputs = Schema.decodeUnknownEffect(Schema.Array(Llm.Output)) + +export const make = Effect.fn("LlmController.make")(function* ( + backendOrOptions?: BackendConnection | Options, + explicitOptions?: Options, +) { + const initialBackend = isBackendConnection(backendOrOptions) ? backendOrOptions : undefined + const options = isBackendConnection(backendOrOptions) ? explicitOptions : backendOrOptions + const requestTimeout = NonNegativeMilliseconds.make(options?.requestTimeout ?? 30_000) + const settlementTimeout = NonNegativeMilliseconds.make(options?.settlementTimeout ?? 30_000) + const responder = LlmResponder.make({ requestTimeout }) + + const state = yield* Ref.make(LlmState.initial) + const lock = yield* Semaphore.make(1) + const changes = yield* Queue.sliding(1) + const failureSignal = yield* Deferred.make() + const tasks = yield* FiberSet.make() + const parentScope = yield* Scope.Scope + const attached = yield* Ref.make<{ readonly backend: BackendConnection; readonly scope: Scope.Scope } | undefined>( + undefined, + ) + + yield* Effect.addFinalizer(() => Queue.shutdown(changes)) + + const notify = Queue.offer(changes, undefined).pipe(Effect.asVoid) + + const respondTo = (request: LlmState.AttachedRequest, output: LlmResponder.Response) => + responder.respond(request.backend, request.request.id, output) + + const failCompletions = (completions: ReadonlyArray, error: LlmControllerError) => + Effect.forEach(completions, (completion) => Deferred.fail(completion, error), { discard: true }) + + /** Must run while holding the lock. */ + const recordFailureLocked = Effect.fn("LlmController.recordFailureLocked")(function* (error: LlmControllerError) { + const current = yield* Ref.get(state) + const [next, { failure, isFirst }] = LlmState.recordFailure(current, error) + yield* Ref.set(state, next) + if (isFirst) yield* Deferred.fail(failureSignal, failure) + yield* failCompletions(current.sendCompletions, failure) + yield* notify + return failure + }) + + const completeNormal = Effect.fn("LlmController.completeNormal")(function* ( + job: NormalJob, + error?: LlmControllerError, + ) { + const sendCompletion = LlmState.NormalSource.$is("Queued")(job.source) ? job.source.response.completed : undefined + yield* lock.withPermit( + Effect.gen(function* () { + yield* Ref.update(state, (current) => LlmState.finishNormal(current, job.completion, sendCompletion)) + if (error === undefined) { + yield* Deferred.succeed(job.completion, undefined) + if (sendCompletion !== undefined) yield* Deferred.succeed(sendCompletion, undefined) + } else { + yield* Deferred.fail(job.completion, error) + if (sendCompletion !== undefined) yield* Deferred.fail(sendCompletion, error) + yield* recordFailureLocked(error) + } + yield* notify + }), + ) + }) + + const runNormal = (job: NormalJob): Effect.Effect => { + const output = LlmState.NormalSource.$match(job.source, { + Queued: ({ response }) => respondTo(job.request, Stream.fromIterable(response.output)), + Served: ({ handler }) => Effect.suspend(() => respondTo(job.request, handler(job.request.request, job.index))), + }) + return Effect.matchCauseEffect(output, { + onFailure: (cause) => completeNormal(job, causeError("respond", cause, job.request.request.id)), + onSuccess: () => completeNormal(job), + }) + } + + /** Starts every runnable normal job. Must run while holding the lock. */ + const drainLocked = Effect.fn("LlmController.drainLocked")(function* () { + while (true) { + const current = yield* Ref.get(state) + const start = LlmState.nextNormal(current) + if (start === undefined) return + const completion = yield* Deferred.make() + yield* Ref.set(state, LlmState.startNormal(current, start, completion)) + yield* FiberSet.run(tasks, runNormal({ ...start, completion })) + yield* notify + } + }) + + const completeTitle = Effect.fn("LlmController.completeTitle")(function* ( + completion: LlmState.Completion, + error?: LlmControllerError, + ) { + yield* lock.withPermit( + Effect.gen(function* () { + yield* Ref.update(state, (current) => LlmState.finishTitle(current, completion)) + if (error === undefined) yield* Deferred.succeed(completion, undefined) + else { + yield* Deferred.fail(completion, error) + yield* recordFailureLocked(error) + } + yield* notify + }), + ) + }) + + /** Titles respond after in-flight normal jobs, outside request sequencing. */ + const startTitleLocked = Effect.fn("LlmController.startTitleLocked")(function* (request: LlmState.AttachedRequest) { + const completion = yield* Deferred.make() + const current = yield* Ref.get(state) + const [next, title] = LlmState.startTitle(current, completion) + yield* Ref.set(state, next) + const respond = Effect.gen(function* () { + yield* Effect.forEach(title.awaiting, Deferred.await, { discard: true }) + const text = yield* Effect.suspend(() => title.handler(request.request, title.index)) + yield* respondTo(request, Stream.make(Llm.text(text))) + }) + yield* FiberSet.run( + tasks, + Effect.matchCauseEffect(respond, { + onFailure: (cause) => completeTitle(completion, causeError("title", cause, request.request.id)), + onSuccess: () => completeTitle(completion), + }), + ) + yield* notify + }) + + const routeRequest = (request: LlmState.AttachedRequest) => + lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + if (current.failure !== undefined || current.settled) return + if (isTitleRequest(request.request.body)) { + yield* startTitleLocked(request) + return + } + yield* Ref.set(state, LlmState.pushRequest(current, request)) + yield* drainLocked() + yield* notify + }), + ) + + const recordRouterFailure = (cause: Cause.Cause) => + lock.withPermit(recordFailureLocked(causeError("route requests", cause))).pipe(Effect.asVoid) + + const attach = Effect.fn("LlmController.attach")(function* (backend: BackendConnection) { + const scope = yield* lock.withPermit( + Effect.gen(function* () { + if ((yield* Ref.get(attached)) !== undefined) + return yield* Effect.fail(controllerError("attach", "LLM backend is already attached")) + const scope = yield* Scope.fork(parentScope) + yield* Ref.set(attached, { backend, scope }) + return scope + }), + ) + yield* backend.requests.pipe( + Stream.runForEach((request) => routeRequest({ request, backend })), + Effect.matchCauseEffect({ + onFailure: recordRouterFailure, + onSuccess: () => Effect.void, + }), + Effect.forkIn(scope), + ) + yield* backend.closed.pipe( + Effect.andThen( + lock.withPermit( + Effect.gen(function* () { + const active = yield* Ref.get(attached) + if (active?.backend !== backend) return + const current = yield* Ref.get(state) + if (current.settled) return + yield* recordFailureLocked(controllerError("backend", "backend connection closed")) + }), + ), + ), + Effect.forkIn(scope), + ) + const detach = Effect.fn("LlmController.detach")(function* () { + const shouldClose = yield* lock.withPermit( + Effect.gen(function* () { + const active = yield* Ref.get(attached) + if (active?.backend !== backend) return false + yield* Ref.set(attached, undefined) + return true + }), + ) + if (shouldClose) yield* Scope.close(scope, Exit.void) + }) + return { detach } satisfies Attachment + }) + + const enqueue = Effect.fn("LlmController.enqueue")(function* ( + operation: "queue" | "send", + output: ReadonlyArray, + completed?: LlmState.Completion, + ) { + const decoded = yield* decodeOutputs(output).pipe(Effect.mapError((cause) => controllerError(operation, cause))) + yield* lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + const rejection = LlmState.rejectEnqueue(current, operation) + if (rejection !== undefined) return yield* Effect.fail(rejection) + yield* Ref.set(state, LlmState.enqueue(current, { output: decoded, completed })) + yield* drainLocked() + yield* notify + return undefined + }), + ) + }) + + const queue = Effect.fn("LlmController.queue")((...output: ReadonlyArray) => enqueue("queue", output)) + + const send = Effect.fn("LlmController.send")(function* (...output: ReadonlyArray) { + const completed = yield* Deferred.make() + yield* enqueue("send", output, completed) + yield* Deferred.await(completed).pipe( + Effect.onInterrupt(() => + lock.withPermit( + Effect.gen(function* () { + yield* Ref.update(state, (current) => LlmState.abandonSend(current, completed)) + yield* notify + }), + ), + ), + ) + }) + + const serve = Effect.fn("LlmController.serve")((handler: LlmState.ServeHandler) => + lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + const rejection = LlmState.rejectServe(current) + if (rejection !== undefined) return yield* Effect.fail(rejection) + yield* Ref.set(state, LlmState.serve(current, handler)) + yield* drainLocked() + yield* notify + return undefined + }), + ), + ) + + const title = Effect.fn("LlmController.title")((handler: LlmState.TitleHandler) => + lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + const rejection = LlmState.rejectTitle(current) + if (rejection !== undefined) return yield* Effect.fail(rejection) + yield* Ref.set(state, LlmState.configureTitle(current, handler)) + yield* notify + return undefined + }), + ), + ) + + const inspectSettlement = lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + const settlement = LlmState.inspectSettlement(current) + if (LlmState.Settlement.$is("Done")(settlement)) yield* Ref.set(state, LlmState.markSettled(current)) + return settlement + }), + ) + + const awaitSettlement = (): Effect.Effect => + Effect.suspend(() => + Effect.flatMap( + inspectSettlement, + LlmState.Settlement.$match({ + Done: () => Effect.void, + Fail: ({ error }) => Effect.fail(error), + Wait: () => Effect.andThen(Queue.take(changes), awaitSettlement()), + }), + ), + ) + + const failSettlementTimeout = lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + const error = LlmState.settlementTimeoutError(current) + const failure = controllerError("settle", error) + yield* Ref.set( + state, + LlmState.markSettled({ + ...current, + failure: current.failure ?? failure, + }), + ) + yield* failCompletions(current.sendCompletions, failure) + yield* notify + return error + }), + ) + + const settle = Effect.fn("LlmController.settle")(function* () { + yield* Effect.yieldNow + yield* lock.withPermit( + Effect.gen(function* () { + yield* Ref.update(state, LlmState.beginSettling) + yield* drainLocked() + yield* notify + }), + ) + yield* awaitSettlement().pipe( + Effect.timeoutOrElse({ + duration: settlementTimeout, + orElse: () => Effect.flatMap(failSettlementTimeout, Effect.fail), + }), + Effect.tapError((error) => (error instanceof LlmSettlementError ? FiberSet.clear(tasks) : Effect.void)), + ) + }) + + const shutdown = Effect.fn("LlmController.shutdown")(function* () { + const active = yield* Ref.get(attached) + if (active !== undefined) { + yield* Ref.set(attached, undefined) + yield* Scope.close(active.scope, Exit.void) + } + yield* lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + const failure = current.failure ?? controllerError("shutdown", "LLM controller is closed") + yield* Ref.set(state, LlmState.close(current, failure)) + yield* failCompletions(current.sendCompletions, failure) + yield* notify + }), + ) + yield* FiberSet.clear(tasks) + }) + + if (initialBackend !== undefined) yield* attach(initialBackend) + + return { + attach, + queue, + send, + serve, + title, + settle, + shutdown, + failure: Deferred.await(failureSignal), + } satisfies Controller +}) + +/** Builds a response stream from output values. */ +export const response = (...output: ReadonlyArray): LlmResponder.Response => Stream.fromIterable(output) + +function isBackendConnection(value: BackendConnection | Options | undefined): value is BackendConnection { + return value !== undefined && "rpc" in value +} + +export * as LlmController from "./llm-controller.js" diff --git a/packages/drive/src/driver/llm-errors.ts b/packages/drive/src/driver/llm-errors.ts new file mode 100644 index 00000000000..94de97902d2 --- /dev/null +++ b/packages/drive/src/driver/llm-errors.ts @@ -0,0 +1,41 @@ +import * as Cause from "effect/Cause" +import * as Option from "effect/Option" +import * as Schema from "effect/Schema" + +/** Rejection of an LLM control call made in an incompatible response mode. */ +export class LlmModeError extends Schema.TaggedErrorClass()("LlmModeError", { + operation: Schema.Literals(["queue", "send", "serve", "title"]), + message: Schema.String, +}) {} + +/** Failure of an LLM controller operation or its backend connection. */ +export class LlmControllerError extends Schema.TaggedErrorClass()("LlmControllerError", { + operation: Schema.String, + requestId: Schema.optionalKey(Schema.String), + message: Schema.String, +}) {} + +/** Settlement ended with unused responses or unexpected requests. */ +export class LlmSettlementError extends Schema.TaggedErrorClass()("LlmSettlementError", { + unusedResponses: Schema.Number, + unexpectedRequests: Schema.Number, + message: Schema.String, +}) {} + +/** Coerces any cause into an `LlmControllerError`, preserving existing ones. */ +export const controllerError = (operation: string, cause: unknown, requestId?: string): LlmControllerError => { + if (cause instanceof LlmControllerError) return cause + return new LlmControllerError({ + operation, + ...(requestId === undefined ? {} : { requestId }), + message: cause instanceof Error ? cause.message : String(cause), + }) +} + +/** Extracts the most useful failure from a cause and coerces it. */ +export const causeError = (operation: string, cause: Cause.Cause, requestId?: string): LlmControllerError => { + const failure = Cause.findErrorOption(cause) + return Option.isSome(failure) + ? controllerError(operation, failure.value, requestId) + : controllerError(operation, Cause.squash(cause), requestId) +} diff --git a/packages/drive/src/driver/llm-responder.ts b/packages/drive/src/driver/llm-responder.ts new file mode 100644 index 00000000000..a5c12dc037e --- /dev/null +++ b/packages/drive/src/driver/llm-responder.ts @@ -0,0 +1,235 @@ +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as Schema from "effect/Schema" +import * as Stream from "effect/Stream" +import * as Llm from "../llm/index.js" +import { chunkText } from "../llm/internal.js" +import { supportsCapability, type BackendConnection } from "../simulation/connector.js" +import { controllerError, LlmControllerError } from "./llm-errors.js" + +/** + * The wire layer of the LLM controller: plays one `Response` stream onto a + * backend connection as `llm.chunk` / `llm.finish` / `llm.disconnect` RPCs, + * chunking text with optional pacing and guaranteeing a terminal event. + */ + +/** A stream of simulated model output for one LLM exchange. */ +export type Response = Stream.Stream + +export interface Options { + /** Per-backend-RPC timeout in milliseconds. */ + readonly requestTimeout: number +} + +export interface Responder { + /** Plays one response for one exchange, guaranteeing a terminal event. */ + readonly respond: ( + backend: BackendConnection, + requestId: string, + output: Response, + ) => Effect.Effect +} + +class InvocationTerminated extends Schema.TaggedErrorClass()("InvocationTerminated", {}) {} + +const decodeOutput = Schema.decodeUnknownEffect(Llm.Output) + +export const make = ({ requestTimeout }: Options): Responder => { + const call = ( + backend: BackendConnection, + operation: string, + requestId: string, + effect: Effect.Effect, + ): Effect.Effect => + Effect.timeoutOrElse(effect, { + duration: requestTimeout, + orElse: () => + Effect.fail( + new LlmControllerError({ + operation, + requestId, + message: `${operation} timed out after ${requestTimeout}ms`, + }), + ), + }).pipe( + Effect.catch((error) => classifyWriteFailure(backend, requestId, error)), + Effect.mapError((cause) => + cause instanceof InvocationTerminated ? cause : controllerError(operation, cause, requestId), + ), + ) + + const classifyWriteFailure = ( + backend: BackendConnection, + requestId: string, + error: E, + ): Effect.Effect => + Effect.gen(function* () { + if (!supportsCapability(backend.compatibility, "llm.pending")) return yield* Effect.fail(error) + const pending = yield* Effect.exit(backend.rpc["llm.pending"]().pipe(Effect.timeout(requestTimeout))) + if (Exit.isFailure(pending)) return yield* Effect.fail(error) + if (pending.value.invocations.some((invocation) => invocation.id === requestId)) return yield* Effect.fail(error) + return yield* Effect.fail(new InvocationTerminated()) + }) + + const streamDelta = Effect.fn("LlmResponder.streamDelta")(function* ( + backend: BackendConnection, + id: string, + type: "textDelta" | "reasoningDelta", + text: string, + options: Llm.StreamOptions | undefined, + ) { + const delay = options?.delay ?? 2 + const chunkSize = options?.chunkSize ?? 15 + const chunks = [...chunkText(text, chunkSize)] + for (let index = 0; index < chunks.length; index++) { + const chunk = chunks[index] + if (chunk === undefined) continue + yield* call(backend, "llm.chunk", id, backend.rpc["llm.chunk"]({ id, items: [{ type, text: chunk }] })) + if (index < chunks.length - 1 && delay > 0) yield* Effect.sleep(delay) + } + }) + + const streamToolCall = Effect.fn("LlmResponder.streamToolCall")(function* ( + backend: BackendConnection, + requestId: string, + toolCall: Llm.ToolCall, + ) { + const delay = toolCall.options?.delay ?? 2 + const chunkSize = toolCall.options?.chunkSize ?? 15 + const chunks = [...chunkText(JSON.stringify(toolCall.input), chunkSize)] + const providerNeutral = supportsCapability(backend.compatibility, "llm.tool-input-delta") + if (providerNeutral) + yield* call( + backend, + "llm.chunk", + requestId, + backend.rpc["llm.chunk"]({ + id: requestId, + items: [ + { + type: "toolInputStart", + index: toolCall.index, + id: toolCall.id, + name: toolCall.name, + }, + ], + }), + ) + for (let index = 0; index < chunks.length; index++) { + const text = chunks[index] + if (text === undefined) continue + const item = providerNeutral + ? { type: "toolInputDelta" as const, index: toolCall.index, text } + : { + type: "raw" as const, + chunk: { + choices: [ + { + delta: { + tool_calls: [ + index === 0 + ? { + index: toolCall.index, + id: toolCall.id, + function: { name: toolCall.name, arguments: text }, + } + : { + index: toolCall.index, + function: { arguments: text }, + }, + ], + }, + }, + ], + }, + } + yield* call( + backend, + "llm.chunk", + requestId, + backend.rpc["llm.chunk"]({ + id: requestId, + items: [item], + }), + ) + if (index < chunks.length - 1 && delay > 0) yield* Effect.sleep(delay) + } + }) + + const respond = Effect.fn("LlmResponder.respond")(function* ( + backend: BackendConnection, + requestId: string, + output: Response, + ) { + let terminal = false + yield* output.pipe( + Stream.mapEffect((value) => decodeOutput(value)), + Stream.runForEach((item) => { + if (terminal) + return Effect.fail( + new LlmControllerError({ + operation: "respond", + requestId, + message: `LLM response ${requestId} emitted output after its terminal event`, + }), + ) + switch (item.type) { + case "finish": + terminal = true + return call( + backend, + "llm.finish", + requestId, + backend.rpc["llm.finish"]({ + id: requestId, + ...(item.reason === undefined ? {} : { reason: item.reason }), + }), + ).pipe(Effect.asVoid) + case "disconnect": + terminal = true + return call(backend, "llm.disconnect", requestId, backend.rpc["llm.disconnect"]({ id: requestId })).pipe( + Effect.asVoid, + ) + case "text": + return streamDelta(backend, requestId, "textDelta", item.text, item.options) + case "reasoning": + return streamDelta(backend, requestId, "reasoningDelta", item.text, item.options) + case "pause": + return item.milliseconds === 0 ? Effect.void : Effect.sleep(item.milliseconds) + case "toolCall": { + if (item.options !== undefined) return streamToolCall(backend, requestId, item) + const { options: _, ...toolCall } = item + return call( + backend, + "llm.chunk", + requestId, + backend.rpc["llm.chunk"]({ + id: requestId, + items: [toolCall], + }), + ).pipe(Effect.asVoid) + } + case "raw": + return call( + backend, + "llm.chunk", + requestId, + backend.rpc["llm.chunk"]({ id: requestId, items: [item] }), + ).pipe(Effect.asVoid) + } + return Effect.void + }), + Effect.catchTag("InvocationTerminated", () => { + terminal = true + return Effect.void + }), + Effect.mapError((cause) => controllerError("respond", cause, requestId)), + ) + if (!terminal) + yield* call(backend, "llm.finish", requestId, backend.rpc["llm.finish"]({ id: requestId, reason: "stop" })).pipe( + Effect.catchTag("InvocationTerminated", () => Effect.void), + ) + }) + + return { respond } +} diff --git a/packages/drive/src/driver/llm-state.ts b/packages/drive/src/driver/llm-state.ts new file mode 100644 index 00000000000..e8513a6ea23 --- /dev/null +++ b/packages/drive/src/driver/llm-state.ts @@ -0,0 +1,299 @@ +import * as Data from "effect/Data" +import type * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import type { Backend } from "../client/protocol.js" +import type * as Llm from "../llm/index.js" +import type { BackendConnection } from "../simulation/connector.js" +import { controllerError, LlmControllerError, LlmModeError, LlmSettlementError } from "./llm-errors.js" +import type { Response } from "./llm-responder.js" + +/** + * Pure state and transitions for the LLM controller. The shell in + * `llm-controller.ts` owns all concurrency: it holds the lock, creates + * completions, runs jobs, and resolves deferreds. Completions appear here + * only as opaque tokens tracked for membership — nothing in this module + * awaits or completes them. + */ + +/** Opaque token for one in-flight job, resolved by the shell. */ +export type Completion = Deferred.Deferred + +export type ServeHandler = (request: Backend.ProviderInvocation, index: number) => Response + +export type TitleHandler = ( + request: Backend.ProviderInvocation, + index: number, +) => Effect.Effect + +export interface QueuedResponse { + readonly output: ReadonlyArray + readonly completed?: Completion +} + +export interface AttachedRequest { + readonly request: Backend.ProviderInvocation + readonly backend: BackendConnection +} + +/** How the controller answers normal (non-title) requests. */ +export type Mode = Data.TaggedEnum<{ + Unset: {} + Queue: {} + Serve: { readonly handler: ServeHandler } +}> +export const Mode = Data.taggedEnum() + +export interface State { + readonly mode: Mode + readonly titleHandler: TitleHandler + readonly titleConfigured: boolean + readonly requests: ReadonlyArray + readonly responses: ReadonlyArray + readonly activeNormal: ReadonlyArray + readonly activeTitles: ReadonlyArray + readonly sendCompletions: ReadonlyArray + readonly requestIndex: number + readonly titleIndex: number + readonly failure: LlmControllerError | undefined + readonly settling: boolean + readonly settled: boolean +} + +export const initial: State = { + mode: Mode.Unset(), + titleHandler: () => Effect.succeed("OpenCode Drive"), + titleConfigured: false, + requests: [], + responses: [], + activeNormal: [], + activeTitles: [], + sendCompletions: [], + requestIndex: 0, + titleIndex: 0, + failure: undefined, + settling: false, + settled: false, +} + +// ─── Guards ────────────────────────────────────────────────────────────────── + +/** Why a control call (queue/send/serve/title) was rejected. */ +export type RejectionError = LlmModeError | LlmControllerError + +const rejectWhileSettling = (state: State, operation: string) => + state.settling || state.settled ? controllerError(operation, "LLM controller is settling") : undefined + +/** Why a queue/send call must be rejected, or undefined to proceed. */ +export const rejectEnqueue = (state: State, operation: "queue" | "send"): RejectionError | undefined => { + if (state.failure !== undefined) return state.failure + if (Mode.$is("Serve")(state.mode)) + return new LlmModeError({ + operation, + message: `llm.${operation} cannot be used after llm.serve`, + }) + return rejectWhileSettling(state, operation) +} + +/** Why a serve call must be rejected, or undefined to proceed. */ +export const rejectServe = (state: State): RejectionError | undefined => { + if (state.failure !== undefined) return state.failure + if (!Mode.$is("Unset")(state.mode)) + return new LlmModeError({ + operation: "serve", + message: "llm.serve must be the only LLM response mode", + }) + return rejectWhileSettling(state, "serve") +} + +/** Why a title call must be rejected, or undefined to proceed. */ +export const rejectTitle = (state: State): RejectionError | undefined => { + if (state.failure !== undefined) return state.failure + if (state.titleConfigured) + return new LlmModeError({ + operation: "title", + message: "llm.title may only be configured once", + }) + return rejectWhileSettling(state, "title") +} + +// ─── Transitions ───────────────────────────────────────────────────────────── + +export const enqueue = (state: State, response: QueuedResponse): State => ({ + ...state, + mode: Mode.Queue(), + responses: [...state.responses, response], + sendCompletions: + response.completed === undefined ? state.sendCompletions : [...state.sendCompletions, response.completed], +}) + +export const serve = (state: State, handler: ServeHandler): State => ({ + ...state, + mode: Mode.Serve({ handler }), +}) + +export const configureTitle = (state: State, handler: TitleHandler): State => ({ + ...state, + titleConfigured: true, + titleHandler: handler, +}) + +export const pushRequest = (state: State, request: AttachedRequest): State => ({ + ...state, + requests: [...state.requests, request], +}) + +/** Withdraws an interrupted send before it was matched to a request. */ +export const abandonSend = (state: State, completed: Completion): State => ({ + ...state, + responses: state.responses.filter((response) => response.completed !== completed), + sendCompletions: state.sendCompletions.filter((candidate) => candidate !== completed), +}) + +/** Records the first failure; later failures preserve the original. */ +export const recordFailure = ( + state: State, + error: LlmControllerError, +): readonly [State, { readonly failure: LlmControllerError; readonly isFirst: boolean }] => { + const failure = state.failure ?? error + const isFirst = state.failure === undefined + return [isFirst ? { ...state, failure } : state, { failure, isFirst }] +} + +// ─── Normal jobs ───────────────────────────────────────────────────────────── + +/** Where a normal job's response comes from. */ +export type NormalSource = Data.TaggedEnum<{ + Queued: { readonly response: QueuedResponse } + Served: { readonly handler: ServeHandler } +}> +export const NormalSource = Data.taggedEnum() + +/** A runnable normal job selected by {@link nextNormal}. */ +export interface NormalStart { + readonly request: AttachedRequest + readonly index: number + readonly source: NormalSource +} + +/** Selects the next runnable normal job, or undefined when nothing can run. */ +export const nextNormal = (state: State): NormalStart | undefined => { + if (state.failure !== undefined) return undefined + const request = state.requests[0] + if (request === undefined) return undefined + if (Mode.$is("Serve")(state.mode)) + return { + request, + index: state.requestIndex, + source: NormalSource.Served({ handler: state.mode.handler }), + } + const response = state.responses[0] + if (response === undefined) return undefined + return { + request, + index: state.requestIndex, + source: NormalSource.Queued({ response }), + } +} + +/** Commits a selected job: consumes its inputs and tracks its completion. */ +export const startNormal = (state: State, start: NormalStart, completion: Completion): State => ({ + ...state, + requests: state.requests.slice(1), + responses: NormalSource.$is("Queued")(start.source) ? state.responses.slice(1) : state.responses, + activeNormal: [...state.activeNormal, completion], + requestIndex: state.requestIndex + 1, +}) + +/** Untracks a finished normal job and its optional send completion. */ +export const finishNormal = (state: State, completion: Completion, sendCompletion: Completion | undefined): State => ({ + ...state, + activeNormal: state.activeNormal.filter((active) => active !== completion), + sendCompletions: + sendCompletion === undefined + ? state.sendCompletions + : state.sendCompletions.filter((active) => active !== sendCompletion), +}) + +// ─── Title jobs ────────────────────────────────────────────────────────────── + +/** A title job selected by {@link startTitle}. */ +export interface TitleStart { + readonly handler: TitleHandler + readonly index: number + /** Normal jobs the title must wait for before responding. */ + readonly awaiting: ReadonlyArray +} + +/** Tracks a title job; titles run outside normal request sequencing. */ +export const startTitle = (state: State, completion: Completion): readonly [State, TitleStart] => [ + { + ...state, + activeTitles: [...state.activeTitles, completion], + titleIndex: state.titleIndex + 1, + }, + { + handler: state.titleHandler, + index: state.titleIndex, + awaiting: state.activeNormal, + }, +] + +export const finishTitle = (state: State, completion: Completion): State => ({ + ...state, + activeTitles: state.activeTitles.filter((active) => active !== completion), +}) + +// ─── Settlement ────────────────────────────────────────────────────────────── + +export type Settlement = Data.TaggedEnum<{ + /** All work has drained; the controller is settled. */ + Done: {} + /** Queued or active work remains; wait for the next change. */ + Wait: {} + Fail: { readonly error: LlmControllerError | LlmSettlementError } +}> +export const Settlement = Data.taggedEnum() + +/** Decides whether settlement is complete, failed, or must keep waiting. */ +export const inspectSettlement = (state: State): Settlement => { + if (state.failure !== undefined) return Settlement.Fail({ error: state.failure }) + if (Mode.$is("Queue")(state.mode) && state.requests.length > 0 && state.responses.length === 0) + return Settlement.Fail({ + error: new LlmSettlementError({ + unusedResponses: 0, + unexpectedRequests: state.requests.length, + message: `received ${state.requests.length} unexpected LLM request(s)`, + }), + }) + if (state.responses.length > 0 || state.activeNormal.length > 0 || state.activeTitles.length > 0) + return Settlement.Wait() + return Settlement.Done() +} + +/** The error reported when settlement times out. */ +export const settlementTimeoutError = (state: State): LlmSettlementError => + new LlmSettlementError({ + unusedResponses: state.responses.length, + unexpectedRequests: state.requests.length, + message: + state.responses.length > 0 + ? `timed out with ${state.responses.length} unused LLM response(s)` + : "timed out waiting for active LLM responses", + }) + +export const beginSettling = (state: State): State => (state.settling ? state : { ...state, settling: true }) + +export const markSettled = (state: State): State => ({ + ...state, + settled: true, +}) + +/** Terminal shutdown: pending work is discarded and future calls fail. */ +export const close = (state: State, failure: LlmControllerError): State => ({ + ...state, + requests: [], + responses: [], + failure, + settling: true, + settled: true, +}) diff --git a/packages/drive/src/driver/llm.ts b/packages/drive/src/driver/llm.ts new file mode 100644 index 00000000000..37bf755bff6 --- /dev/null +++ b/packages/drive/src/driver/llm.ts @@ -0,0 +1,9 @@ +import type * as OpenCodeServer from "./server.js" + +/** Live control over the simulated model shared by every connected TUI. */ +export interface Llm { + readonly queue: OpenCodeServer.Server["llm"]["queue"] + readonly send: OpenCodeServer.Server["llm"]["send"] + readonly serve: OpenCodeServer.Server["llm"]["serve"] + readonly title: OpenCodeServer.Server["llm"]["title"] +} diff --git a/packages/drive/src/driver/opencode.ts b/packages/drive/src/driver/opencode.ts new file mode 100644 index 00000000000..54851f162c2 --- /dev/null +++ b/packages/drive/src/driver/opencode.ts @@ -0,0 +1,55 @@ +import { join } from "node:path" +import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem" +import { OpenCode as OpenCodeService, type OpenCodeClient } from "@opencode-ai/client/effect" +import * as Service from "@opencode-ai/client/effect/service" +import * as Effect from "effect/Effect" +import * as FileSystem from "effect/FileSystem" +import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http" +import { error, type OpenCodeDriverError } from "./error.js" + +export type OpenCode = OpenCodeClient + +const makeWithServices = Effect.fn("OpenCode.make")(function* (artifacts: string) { + const state = join(artifacts, "home", ".local", "state", "opencode") + const fs = yield* FileSystem.FileSystem + const discovered = yield* fs.readDirectory(state).pipe(Effect.catch(() => Effect.succeed([]))) + const names = [ + "service-local.json", + "service.json", + ...discovered + .filter((name) => /^service-[^.]+\.json$/.test(name)) + .sort() + .filter((name) => name !== "service-local.json"), + ] + let endpoint: Service.Endpoint | undefined + for (const name of names) { + endpoint = yield* Service.discover({ file: join(state, name) }) + if (endpoint !== undefined) break + } + if (endpoint === undefined) + return yield* Effect.fail(error("opencode.connect", "OpenCode service registration was not found")) + + return yield* Effect.gen(function* () { + const base = yield* HttpClient.HttpClient + const located = base.pipe( + HttpClient.mapRequest( + HttpClientRequest.setHeader("x-opencode-directory", encodeURIComponent(join(artifacts, "files"))), + ), + ) + const http = + endpoint.auth === undefined + ? located + : located.pipe( + HttpClient.mapRequest(HttpClientRequest.basicAuth(endpoint.auth.username, endpoint.auth.password)), + ) + return yield* OpenCodeService.make({ baseUrl: endpoint.url }).pipe( + Effect.provideService(HttpClient.HttpClient, http), + ) + }).pipe( + Effect.provide(FetchHttpClient.layer), + Effect.mapError((cause) => error("opencode.connect", cause)), + ) +}) + +export const make = (artifacts: string): Effect.Effect => + makeWithServices(artifacts).pipe(Effect.provide(NodeFileSystem.layer)) diff --git a/packages/drive/src/driver/prepared.ts b/packages/drive/src/driver/prepared.ts new file mode 100644 index 00000000000..2cec8413117 --- /dev/null +++ b/packages/drive/src/driver/prepared.ts @@ -0,0 +1,121 @@ +import * as Cause from "effect/Cause" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as OpenCodeInstance from "../instance/runtime.js" +import * as SimulationConnector from "../simulation/connector.js" +import * as OpenCodeTui from "./client.js" +import { error, type OpenCodeDriverError } from "./error.js" +import type { Driver, Llm } from "./index.js" +import type { LlmControllerError, LlmSettlementError } from "./llm-controller.js" +import * as OpenCodeServer from "./server.js" +import * as SharedEffect from "./shared.js" +import type * as OpenCodeUi from "./ui.js" +import { decodeRunReport } from "./report.js" + +export interface Options { + readonly visible?: boolean + readonly tui?: OpenCodeTui.TuiOptions + readonly launch?: "automatic" | "manual" + readonly tuiName?: string + readonly artifactsRetained?: boolean + readonly compatibility?: SimulationConnector.CompatibilityPolicy +} + +export interface Prepared { + readonly driver: Driver | undefined + readonly primary: OpenCodeTui.Tui | undefined + readonly llm: Llm + readonly tools: Driver["tools"] + readonly tuis: OpenCodeTui.Tuis + readonly server: Pick + readonly artifacts: string + readonly settle: Driver["settle"] + readonly failure: Effect.Effect + readonly unexpectedTuiExit: OpenCodeTui.Control["unexpectedExit"] +} + +export const makeWithServices = Effect.fn("OpenCodeDriver.makePreparedWithServices")(function* ( + instance: OpenCodeInstance.Instance, + options: Options, +) { + const server = yield* OpenCodeServer.make({ + instance, + target: { + visible: options.visible, + compatibility: options.compatibility, + }, + }) + const opencode = (options.launch ?? "automatic") === "automatic" ? yield* server.launch() : undefined + const primary = + (options.launch ?? "automatic") === "automatic" + ? options.tuiName === undefined + ? yield* server.tuis.launch(options.tui) + : yield* server.tuis.launch(options.tuiName, options.tui) + : undefined + const complete = (tuis: Effect.Effect, OpenCodeDriverError | OpenCodeUi.OperationError>) => + Effect.gen(function* () { + const llm = yield* Effect.exit(server.llm.settle()) + const tools = yield* Effect.exit( + server.settleTools.pipe(Effect.mapError((cause) => error("tools.settle", cause))), + ) + const shutdown = yield* Effect.exit(server.llm.shutdown()) + const tuiExit = yield* Effect.exit(tuis) + let failure: + | Cause.Cause + | undefined + if (Exit.isFailure(llm)) failure = llm.cause + if (Exit.isFailure(tools)) failure = failure === undefined ? tools.cause : Cause.combine(failure, tools.cause) + if (Exit.isFailure(shutdown)) + failure = failure === undefined ? shutdown.cause : Cause.combine(failure, shutdown.cause) + if (Exit.isFailure(tuiExit)) + failure = failure === undefined ? tuiExit.cause : Cause.combine(failure, tuiExit.cause) + if (failure !== undefined) return yield* Effect.failCause(failure) + const compatibility = [...(yield* server.compatibility), ...(yield* server.tuis.compatibility)] + const recordings = Exit.isSuccess(tuiExit) ? tuiExit.value : [] + const report = yield* decodeRunReport({ + artifacts: instance.artifacts, + retained: options.artifactsRetained ?? true, + recordings, + compatibility, + }).pipe(Effect.mapError((cause) => error("report.make", cause))) + return report + }) + const settle = yield* SharedEffect.make(complete(server.tuis.settle())) + yield* Effect.addFinalizer(() => server.llm.shutdown()) + const llm: Llm = server.llm + const driver: Driver | undefined = + primary === undefined || opencode === undefined + ? undefined + : { + opencode, + tui: primary, + ui: primary.ui, + llm, + tools: server.tools, + tuis: server.tuis, + artifacts: instance.artifacts, + settle: () => settle, + } + return { + driver, + primary, + llm, + tools: server.tools, + tuis: server.tuis, + server, + artifacts: instance.artifacts, + settle: () => settle, + failure: Effect.raceFirst( + server.failure, + server.tuis.unexpectedExit.pipe( + Effect.flatMap(({ name, status }) => + Effect.fail(error("tui.exit", `OpenCode TUI "${name}" exited with status ${status}`)), + ), + ), + ), + unexpectedTuiExit: server.tuis.unexpectedExit, + } satisfies Prepared +}) + +export const make = (instance: OpenCodeInstance.Instance, options: Options) => + makeWithServices(instance, options).pipe(Effect.provide(SimulationConnector.layer)) diff --git a/packages/drive/src/driver/project.ts b/packages/drive/src/driver/project.ts new file mode 100644 index 00000000000..95dfe035d0f --- /dev/null +++ b/packages/drive/src/driver/project.ts @@ -0,0 +1,44 @@ +import { rm } from "node:fs/promises" +import * as Effect from "effect/Effect" +import { initializeInstance, prepareInstanceProject } from "../instance/instance.js" +import type { OpenCodeConfig, OpenCodeTuiConfig, Project as ProjectDefinition, Setup } from "../project.js" +import { error } from "./error.js" + +export interface Options { + readonly project?: ProjectDefinition + readonly config?: OpenCodeConfig + readonly tui?: OpenCodeTuiConfig + readonly setup?: Setup + /** Retain the isolated artifact directory after the scope closes. */ + readonly keepArtifacts?: boolean +} + +export interface Project { + readonly artifacts: string +} + +export const make = Effect.fn("OpenCodeProject.make")(function* (options: Options = {}) { + const artifacts = yield* Effect.acquireRelease( + Effect.tryPromise({ + try: () => initializeInstance(), + catch: (cause) => error("project.initialize", cause), + }), + (directory) => + options.keepArtifacts + ? Effect.void + : Effect.tryPromise({ + try: () => rm(directory, { recursive: true, force: true }), + catch: () => undefined, + }).pipe(Effect.ignore), + ) + yield* prepareInstanceProject({ + artifacts, + project: options.project, + config: options.config, + tui: options.tui, + setup: options.setup, + }).pipe(Effect.mapError((cause) => error("project.prepare", cause))) + return { artifacts } +}) + +export * as OpenCodeProject from "./project.js" diff --git a/packages/drive/src/driver/report.ts b/packages/drive/src/driver/report.ts new file mode 100644 index 00000000000..bcfde28a7c5 --- /dev/null +++ b/packages/drive/src/driver/report.ts @@ -0,0 +1,30 @@ +import * as Schema from "effect/Schema" +import { EndpointCompatibility } from "../simulation/connector.js" + +const absolutePathCheck = Schema.makeFilter((path) => isAbsolutePath(path), { + expected: "an absolute POSIX or Windows path without NUL bytes", +}) + +/** A fully rooted POSIX or Windows filesystem path. */ +export const AbsolutePath = Schema.String.check(absolutePathCheck).pipe(Schema.brand("OpenCodeDrive.AbsolutePath")) +export type AbsolutePath = typeof AbsolutePath.Type + +/** The compact evidence returned after a Drive run settles. */ +export const RunReport = Schema.Struct({ + artifacts: AbsolutePath, + retained: Schema.Boolean, + recordings: Schema.Array(AbsolutePath), + compatibility: Schema.Array(EndpointCompatibility), +}) +export interface RunReport extends Schema.Schema.Type {} + +export const decodeAbsolutePath = Schema.decodeUnknownEffect(AbsolutePath) +export const decodeRunReport = Schema.decodeUnknownEffect(RunReport) + +function isAbsolutePath(path: string): boolean { + if (path.length === 0 || path.includes("\0")) return false + if (path.startsWith("/")) return true + if (/^[A-Za-z]:[\\/]/.test(path)) return true + if (/^\\\\[^\\/]+[\\/][^\\/]+(?:[\\/]|$)/.test(path)) return true + return /^\\\\[?.]\\(?:[A-Za-z]:\\|UNC\\[^\\]+\\[^\\]+(?:\\|$))/.test(path) +} diff --git a/packages/drive/src/driver/server.ts b/packages/drive/src/driver/server.ts new file mode 100644 index 00000000000..8d5be68fe34 --- /dev/null +++ b/packages/drive/src/driver/server.ts @@ -0,0 +1,228 @@ +import * as Effect from "effect/Effect" +import * as Cause from "effect/Cause" +import * as Deferred from "effect/Deferred" +import * as Ref from "effect/Ref" +import * as Semaphore from "effect/Semaphore" +import * as Scope from "effect/Scope" +import * as Exit from "effect/Exit" +import { RpcClientError } from "effect/unstable/rpc" +import * as OpenCodeInstance from "../instance/runtime.js" +import * as SimulationConnector from "../simulation/connector.js" +import * as OpenCodeTui from "./client.js" +import * as OpenCodeSdk from "./opencode.js" +import { error, type OpenCodeDriverError } from "./error.js" +import * as LlmController from "./llm-controller.js" +import * as ToolProducer from "../tool/producer.js" +import type * as Tool from "../tool/index.js" +import { LifecycleError } from "../tool/types.js" + +export interface Target { + readonly command?: ReadonlyArray + readonly dev?: string + readonly env?: Readonly> + readonly visible?: boolean + readonly compatibility?: SimulationConnector.CompatibilityPolicy +} + +export interface Options { + readonly instance: OpenCodeInstance.Instance + readonly target?: Target +} + +export interface Server { + readonly llm: LlmController.Controller + readonly tools: Tool.Controls + readonly settleTools: ToolProducer.Controller["settle"] + readonly tuis: OpenCodeTui.Control + readonly launch: () => Effect.Effect< + OpenCodeSdk.OpenCode, + OpenCodeDriverError | LlmController.LlmControllerError | SimulationConnector.SimulationCompatibilityError + > + readonly kill: () => Effect.Effect + readonly failure: Effect.Effect + readonly compatibility: Effect.Effect> +} + +export const make = Effect.fn("OpenCodeServer.make")(function* (options: Options) { + const connector = yield* SimulationConnector.Service + const target = options.target ?? {} + const instance = options.instance + const llm = yield* LlmController.make() + const toolProducer = yield* ToolProducer.make(instance.toolNames) + const tools: Tool.Controls = { + ...instance.tools, + ...toolProducer.controls, + } + const tuis = yield* OpenCodeTui.makeTuis(instance, target.visible ?? false, connector, target.compatibility) + const parentScope = yield* Scope.Scope + const generation = yield* Ref.make< + | { + readonly scope: Scope.Scope + readonly attachment: LlmController.Attachment + readonly process: import("../instance/process.js").Running + } + | undefined + >(undefined) + const unexpectedExit = yield* Deferred.make() + const toolConnectionFailure = yield* Deferred.make() + const lifecycle = yield* Semaphore.make(1) + let compatibility: ReadonlyArray = [] + + const launchGeneration = Effect.fn("OpenCodeServer.launch")(function* () { + if ((yield* Ref.get(generation)) !== undefined) + return yield* Effect.fail(error("server.launch", "the script server has already been launched")) + const scope = yield* Scope.fork(parentScope) + const launched = yield* instance.launchServer.pipe( + Effect.mapError((cause) => error("server.launch", cause)), + Effect.onError(() => Scope.close(scope, Exit.void)), + ) + let llmAttachment: LlmController.Attachment | undefined + const rollbackLaunch = Effect.suspend(() => + (llmAttachment?.detach() ?? Effect.void).pipe( + Effect.andThen(toolProducer.endGeneration), + Effect.andThen(Scope.close(scope, Exit.void)), + Effect.andThen(instance.killServer.pipe(Effect.ignore)), + ), + ) + const backend = yield* connector + .backend(launched.endpoint, { + compatibility: target.compatibility, + }) + .pipe( + Scope.provide(scope), + Effect.mapError((cause) => error("server.connect", cause)), + Effect.onError(() => rollbackLaunch), + ) + const connectTools = Effect.fn("OpenCodeServer.connectTools")(function* () { + const connectionScope = yield* Scope.fork(scope) + const connection = yield* toolProducer + .connectFrom( + connector + .backend(launched.endpoint, { + attach: false, + compatibility: target.compatibility, + }) + .pipe(Scope.provide(connectionScope)), + ) + .pipe(Effect.onError(() => Scope.close(connectionScope, Exit.void))) + return { ...connection, scope: connectionScope } + }) + const failToolConnection = (cause: unknown) => + toolProducer.shutdown.pipe( + Effect.andThen(Deferred.fail(toolConnectionFailure, error("tools.connect", cause))), + Effect.asVoid, + ) + function reconnectTools(): Effect.Effect { + return connectTools().pipe( + Effect.flatMap(superviseTools), + Effect.catchIf(isRetryableToolConnectionError, () => Effect.sleep(25).pipe(Effect.andThen(reconnectTools()))), + Effect.catchIf(isClosedToolConnectionError, () => Effect.void), + Effect.catch(failToolConnection), + Effect.catchCauseIf( + (cause) => !Cause.hasInterrupts(cause), + (cause) => failToolConnection(Cause.pretty(cause)), + ), + ) + } + function superviseTools(connection: Effect.Success>): Effect.Effect { + return connection.backend.closed.pipe( + Effect.ensuring(connection.attachment.detach().pipe(Effect.andThen(Scope.close(connection.scope, Exit.void)))), + Effect.andThen(Effect.sleep(25)), + Effect.andThen(reconnectTools()), + ) + } + const toolConnection = yield* connectTools().pipe( + Effect.mapError((cause) => error("tools.connect", cause)), + Effect.onError(() => rollbackLaunch), + ) + yield* superviseTools(toolConnection).pipe(Effect.forkIn(scope)) + const attachment = yield* llm.attach(backend).pipe(Effect.onError(() => rollbackLaunch)) + llmAttachment = attachment + const opencode = yield* OpenCodeSdk.make(instance.artifacts).pipe(Effect.onError(() => rollbackLaunch)) + const process = yield* instance.primary.pipe( + Effect.mapError((cause) => error("server.launch", cause)), + Effect.onError(() => rollbackLaunch), + ) + yield* Ref.set(generation, { scope, attachment, process }) + compatibility = [...compatibility, backend.compatibility] + yield* process.exitCode.pipe( + Effect.tap(() => Effect.sleep(25)), + Effect.flatMap((status) => + Ref.get(generation).pipe( + Effect.flatMap((active) => + active?.process === process + ? toolProducer.endGeneration.pipe( + Effect.andThen( + Deferred.fail(unexpectedExit, error("server.exit", `OpenCode server exited with status ${status}`)), + ), + Effect.asVoid, + ) + : Effect.void, + ), + ), + ), + Effect.catchCause(() => Effect.void), + Effect.forkIn(scope), + ) + return opencode + }) + + const killGeneration = Effect.fn("OpenCodeServer.kill")(function* () { + const active = yield* Ref.get(generation) + if (active === undefined) return yield* Effect.fail(error("server.kill", "the script server is not running")) + yield* Ref.set(generation, undefined) + yield* active.attachment.detach() + yield* toolProducer.endGeneration + yield* Scope.close(active.scope, Exit.void) + const stopped = yield* Effect.exit( + instance.killServer.pipe(Effect.mapError((cause) => error("server.kill", cause))), + ) + if (Exit.isFailure(stopped)) return yield* Effect.failCause(stopped.cause) + return undefined + }) + const launch = () => lifecycle.withPermit(launchGeneration()) + const kill = () => lifecycle.withPermit(killGeneration()) + + return { + llm, + tools, + settleTools: toolProducer.settle, + tuis, + launch, + kill, + failure: Effect.raceFirst( + toolProducer.failure.pipe(Effect.mapError((cause) => error("tools", cause))), + Effect.raceFirst( + Deferred.await(toolConnectionFailure), + Effect.raceFirst(llm.failure, Deferred.await(unexpectedExit)), + ), + ).pipe(Effect.tapError(() => toolProducer.endGeneration)), + compatibility: Effect.sync(() => compatibility), + } satisfies Server +}) + +function isRetryableToolConnectionError(cause: unknown) { + return ( + cause instanceof SimulationConnector.SimulationConnectionError || + (cause instanceof RpcClientError.RpcClientError && isTransientRpcClientError(cause)) || + (cause instanceof LifecycleError && cause.reason === "transport-interrupted") + ) +} + +function isClosedToolConnectionError(cause: unknown) { + return cause instanceof LifecycleError && cause.reason === "controller-closed" +} + +function isTransientRpcClientError(error: RpcClientError.RpcClientError) { + if (error.reason._tag !== "RpcClientDefect") return true + const message = error.reason.message + return ( + message.startsWith("cannot connect") || + message === "connection closed" || + message === "connection error" || + message === "connection is not open" || + message === "failed to send request" + ) +} + +export * as OpenCodeServer from "./server.js" diff --git a/packages/drive/src/driver/shared.ts b/packages/drive/src/driver/shared.ts new file mode 100644 index 00000000000..867b819df54 --- /dev/null +++ b/packages/drive/src/driver/shared.ts @@ -0,0 +1,26 @@ +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import * as Ref from "effect/Ref" +import * as Scope from "effect/Scope" +import * as Semaphore from "effect/Semaphore" + +/** Starts a terminal operation once in its owner's scope, independently of callers. */ +export const make = Effect.fn("SharedEffect.make")(function* (effect: Effect.Effect) { + const scope = yield* Scope.Scope + const result = yield* Deferred.make() + const started = yield* Ref.make(false) + const lock = yield* Semaphore.make(1) + + return Effect.uninterruptibleMask((restore) => + Effect.gen(function* () { + yield* lock.withPermit( + Effect.gen(function* () { + if (yield* Ref.get(started)) return + yield* Ref.set(started, true) + yield* Deferred.complete(result, effect).pipe(Effect.asVoid, Effect.forkIn(scope, { uninterruptible: true })) + }), + ) + return yield* restore(Deferred.await(result)) + }), + ) +}) diff --git a/packages/drive/src/driver/ui.ts b/packages/drive/src/driver/ui.ts new file mode 100644 index 00000000000..703c505c727 --- /dev/null +++ b/packages/drive/src/driver/ui.ts @@ -0,0 +1,406 @@ +import * as Effect from "effect/Effect" +import * as Schedule from "effect/Schedule" +import * as Schema from "effect/Schema" +import type { RpcClientError } from "effect/unstable/rpc" +import { supportsCapability, type UiConnection } from "../simulation/connector.js" +import { Frontend } from "../client/protocol.js" +import type { SimulationRequestError } from "@opencode-ai/protocol/simulation" + +export interface WaitOptions { + /** Maximum wait in milliseconds. Defaults to 5,000. */ + readonly timeout?: number + /** Poll interval in milliseconds. Defaults to 50. */ + readonly interval?: number +} + +export interface ElementQuery { + readonly id?: string + readonly num?: number + readonly focusable?: boolean + readonly focused?: boolean + readonly clickable?: boolean + readonly editor?: boolean +} + +export type SemanticQuery = Partial + +export type Position = Pick + +export type Predicate = (state: Frontend.State) => boolean +export type EffectPredicate = (state: Frontend.State) => Effect.Effect + +export class UiTimeoutError extends Schema.TaggedErrorClass()("UiTimeoutError", { + operation: Schema.String, + milliseconds: Schema.Number, + message: Schema.String, + frame: Schema.optionalKey(Frontend.CapturedFrame), +}) {} + +export class UiElementAmbiguousError extends Schema.TaggedErrorClass()( + "UiElementAmbiguousError", + { + count: Schema.Number, + }, +) { + override get message() { + return `ui.getElement matched ${this.count} elements` + } +} + +export class UiNodeAmbiguousError extends Schema.TaggedErrorClass()("UiNodeAmbiguousError", { + count: Schema.Number, +}) { + override get message() { + return `ui.getNode matched ${this.count} semantic nodes` + } +} + +export class UiCapabilityError extends Schema.TaggedErrorClass()("UiCapabilityError", { + capability: Schema.Literals(["ui.snapshot", "ui.click.semantic"]), + message: Schema.String, +}) {} + +export class UiWaitOptionsError extends Schema.TaggedErrorClass()("UiWaitOptionsError", { + field: Schema.Literals(["timeout", "interval"]), + value: Schema.Number, + message: Schema.String, +}) {} + +export class UiPredicateError extends Schema.TaggedErrorClass()("UiPredicateError", { + cause: Schema.Defect(), + message: Schema.String, +}) {} + +export interface Options { + /** Per-RPC timeout in milliseconds. Defaults to 30,000. */ + readonly requestTimeout?: number +} + +const RequestTimeout = Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0)) + +export type WaitError = UiTimeoutError | UiWaitOptionsError +type RpcError = SimulationRequestError | RpcClientError.RpcClientError +export type OperationError = RpcError | UiTimeoutError +export type SemanticOperationError = OperationError | UiCapabilityError + +export interface Ui { + readonly state: () => Effect.Effect + readonly snapshot: () => Effect.Effect + readonly capture: () => Effect.Effect + readonly matches: (text: string) => Effect.Effect + readonly screenshot: (name?: string) => Effect.Effect + readonly type: (text: string) => Effect.Effect + readonly press: (key: string, modifiers?: Frontend.KeyModifiers) => Effect.Effect + readonly enter: () => Effect.Effect + readonly arrow: (direction: Frontend.ArrowParams["direction"]) => Effect.Effect + readonly focus: (target: number | Frontend.Element) => Effect.Effect + readonly click: ( + target: number | Frontend.Element | Frontend.SemanticNode, + position?: Position, + ) => Effect.Effect + readonly resize: (viewport: Frontend.ResizeParams) => Effect.Effect + readonly submit: (text: string) => Effect.Effect + readonly waitFor: ( + target: string | Predicate | EffectPredicate, + options?: WaitOptions, + ) => Effect.Effect + readonly getElement: ( + target: number | string | ElementQuery, + options?: WaitOptions, + ) => Effect.Effect + readonly getNode: ( + target: string | SemanticQuery, + options?: WaitOptions, + ) => Effect.Effect +} + +interface Control extends Ui { + readonly finishRecording: () => Effect.Effect +} + +export interface Transform { + (effect: Effect.Effect): Effect.Effect +} + +/** Applies one Effect transformation to every operation without changing the UI interface. */ +export const transform = (ui: Ui, apply: Transform): Ui => ({ + state: () => apply(ui.state()), + snapshot: () => apply(ui.snapshot()), + capture: () => apply(ui.capture()), + matches: (text) => apply(ui.matches(text)), + screenshot: (name) => apply(ui.screenshot(name)), + type: (text) => apply(ui.type(text)), + press: (key, modifiers) => apply(ui.press(key, modifiers)), + enter: () => apply(ui.enter()), + arrow: (direction) => apply(ui.arrow(direction)), + focus: (target) => apply(ui.focus(target)), + click: (target, position) => apply(ui.click(target, position)), + resize: (viewport) => apply(ui.resize(viewport)), + submit: (text) => apply(ui.submit(text)), + waitFor: (target, options) => apply(ui.waitFor(target, options)), + getElement: (target, options) => apply(ui.getElement(target, options)), + getNode: (target, options) => apply(ui.getNode(target, options)), +}) + +export const make = (connection: UiConnection, options?: Options): Control => { + const requestTimeout = RequestTimeout.make(options?.requestTimeout ?? 30_000) + const evidenceTimeout = Math.min(requestTimeout, 1_000) + const { rpc } = connection + const call = (operation: string, effect: Effect.Effect): Effect.Effect => + Effect.timeoutOrElse(effect, { + duration: requestTimeout, + orElse: () => + Effect.fail( + new UiTimeoutError({ + operation, + milliseconds: requestTimeout, + message: `ui.${operation} timed out after ${requestTimeout}ms`, + }), + ), + }) + + const state = Effect.fn("Ui.state")(() => call("state", rpc["ui.state"]())) + const snapshot = Effect.fn("Ui.snapshot")(function* () { + if (!supportsCapability(connection.compatibility, "ui.snapshot")) + return yield* Effect.fail( + new UiCapabilityError({ + capability: "ui.snapshot", + message: "ui.snapshot is not available on this OpenCode endpoint", + }), + ) + return yield* call("snapshot", rpc["ui.snapshot"]()) + }) + const capture = Effect.fn("Ui.capture")(() => call("capture", rpc["ui.capture"]())) + const matches = Effect.fn("Ui.matches")((text: string) => call("matches", rpc["ui.matches"]({ text }))) + const screenshot = Effect.fn("Ui.screenshot")((name?: string) => + call("screenshot", rpc["ui.screenshot"](name === undefined ? undefined : { name })), + ) + const finishRecording = Effect.fn("Ui.finishRecording")(() => call("finishRecording", rpc["ui.recording.finish"]())) + const type = Effect.fn("Ui.type")((text: string) => call("type", rpc["ui.type"]({ text }))) + const press = Effect.fn("Ui.press")((key: string, modifiers?: Frontend.KeyModifiers) => + call("press", rpc["ui.press"](Frontend.pressParams(key, modifiers))), + ) + const enter = Effect.fn("Ui.enter")(() => call("enter", rpc["ui.enter"]())) + const arrow = Effect.fn("Ui.arrow")((direction: Frontend.ArrowParams["direction"]) => + call("arrow", rpc["ui.arrow"]({ direction })), + ) + const focus = Effect.fn("Ui.focus")((target: number | Frontend.Element) => + call( + "focus", + rpc["ui.focus"]({ + target: typeof target === "number" ? target : target.num, + }), + ), + ) + const resize = Effect.fn("Ui.resize")((viewport: Frontend.ResizeParams) => call("resize", rpc["ui.resize"](viewport))) + const submit = Effect.fn("Ui.submit")(function* (text: string) { + yield* type(text) + return yield* enter() + }) + + const pollingTimeout = (operation: string, milliseconds: number, message: string) => + rpc["ui.capture"]().pipe( + Effect.timeoutOrElse({ + duration: evidenceTimeout, + orElse: () => Effect.succeed(undefined), + }), + Effect.catchCause(() => Effect.succeed(undefined)), + Effect.flatMap((frame) => + Effect.fail( + new UiTimeoutError({ + operation, + milliseconds, + message, + ...(frame === undefined ? {} : { frame }), + }), + ), + ), + ) + + const poll = ( + operation: string, + read: Effect.Effect, + options: WaitOptions | undefined, + message: string, + ): Effect.Effect => { + const timeout = options?.timeout ?? 5_000 + const interval = options?.interval ?? 50 + const validate = Effect.gen(function* () { + if (!Number.isFinite(timeout) || timeout < 0) { + yield* Effect.fail( + new UiWaitOptionsError({ + field: "timeout", + value: timeout, + message: "ui wait timeout must be a finite non-negative number", + }), + ) + } + if (!Number.isFinite(interval) || interval <= 0) { + yield* Effect.fail( + new UiWaitOptionsError({ + field: "interval", + value: interval, + message: "ui wait interval must be a finite positive number", + }), + ) + } + }) + return Effect.gen(function* () { + yield* validate + return yield* Effect.repeat(read, { + until: (value): value is A => value !== undefined, + schedule: Schedule.spaced(interval), + }).pipe( + Effect.timeoutOrElse({ + duration: timeout, + orElse: () => pollingTimeout(operation, timeout, message), + }), + ) + }) + } + + const waitFor = Effect.fn("Ui.waitFor")((target: string | Predicate | EffectPredicate, options?: WaitOptions) => + poll( + "waitFor", + typeof target === "string" + ? Effect.gen(function* () { + if (!(yield* matches(target))) return undefined + return yield* state() + }) + : Effect.flatMap(state(), (value) => + predicateEffect(target, value).pipe(Effect.map((matches) => (matches ? value : undefined))), + ), + options, + typeof target === "string" + ? `timed out waiting for the UI to match ${JSON.stringify(target)}` + : "timed out waiting for the UI to match", + ), + ) + + const getElement = Effect.fn("Ui.getElement")((target: number | string | ElementQuery, options?: WaitOptions) => + poll( + "getElement", + Effect.flatMap(state(), (value) => { + const elements = value.elements.filter((element) => + typeof target === "number" + ? element.num === target + : typeof target === "string" + ? element.id === target + : matchesQuery(element, target), + ) + if (elements.length > 1) return Effect.fail(new UiElementAmbiguousError({ count: elements.length })) + return Effect.succeed(elements[0]) + }), + options, + "timed out waiting for the UI element", + ), + ) + + const getNode = Effect.fn("Ui.getNode")((target: string | SemanticQuery, options?: WaitOptions) => + poll( + "getNode", + Effect.flatMap(snapshot(), (value) => { + const nodes = value.nodes.filter((node) => + typeof target === "string" ? node.id === target : matchesQuery(node, target), + ) + if (nodes.length > 1) return Effect.fail(new UiNodeAmbiguousError({ count: nodes.length })) + return Effect.succeed(nodes[0]) + }), + options, + "timed out waiting for the semantic UI node", + ), + ) + + const click = Effect.fn("Ui.click")(function* ( + target: number | Frontend.Element | Frontend.SemanticNode, + position?: Position, + ) { + if (typeof target !== "number" && "element" in target) { + if (!supportsCapability(connection.compatibility, "ui.click.semantic")) + return yield* Effect.fail( + new UiCapabilityError({ + capability: "ui.click.semantic", + message: "semantic ui.click is not available on this OpenCode endpoint", + }), + ) + const element = + position === undefined + ? (yield* state()).elements.find((candidate) => candidate.num === target.element) + : undefined + return yield* call( + "click", + rpc["ui.click"]({ + target: target.element, + x: position?.x ?? (element === undefined ? 0 : Math.floor(element.width / 2)), + y: position?.y ?? (element === undefined ? 0 : Math.floor(element.height / 2)), + semantic: { + id: target.id, + ...(target.instance === undefined ? {} : { instance: target.instance }), + element: target.element, + }, + }), + ) + } + const element = typeof target === "number" ? yield* getElement(target) : target + return yield* call( + "click", + rpc["ui.click"]({ + target: element.num, + x: position?.x ?? Math.floor(element.width / 2), + y: position?.y ?? Math.floor(element.height / 2), + }), + ) + }) + + return { + state, + snapshot, + capture, + matches, + screenshot, + finishRecording, + type, + press, + enter, + arrow, + focus, + click, + resize, + submit, + waitFor, + getElement, + getNode, + } +} + +function predicateEffect( + predicate: Predicate | EffectPredicate, + state: Frontend.State, +): Effect.Effect { + return Effect.gen(function* () { + const result = yield* Effect.try({ + try: () => predicate(state), + catch: (cause) => + new UiPredicateError({ + cause, + message: `ui.waitFor predicate failed: ${cause instanceof Error ? cause.message : String(cause)}`, + }), + }) + const value: unknown = Effect.isEffect(result) ? yield* result : result + if (typeof value === "boolean") return value + return yield* Effect.fail( + new UiPredicateError({ + cause: value, + message: "ui.waitFor predicate must return a boolean or Effect", + }), + ) + }) +} + +function matchesQuery(value: Value, query: Partial) { + return Object.entries(query).every( + ([key, expected]) => expected === undefined || Reflect.get(value, key) === expected, + ) +} + +export * as OpenCodeUi from "./ui.js" diff --git a/packages/drive/src/frame/index.ts b/packages/drive/src/frame/index.ts new file mode 100644 index 00000000000..4c375ff4ad8 --- /dev/null +++ b/packages/drive/src/frame/index.ts @@ -0,0 +1,162 @@ +/** + * Renderer-neutral vocabulary for drawing captured terminal frames: the + * canonical cell geometry, OpenTUI text-attribute bits, geometric block/bar + * glyph primitives, and baseline placement. Both the Drive PNG renderer + * (`recording/render.ts`) and browser canvas renderers consume this module so + * their output stays synchronized by construction. + * + * This entry point must stay dependency-free and browser-safe. + */ + +/** OpenTUI text-attribute bits carried on captured spans. */ +export const TextStyle = { + bold: 1, + dim: 2, + italic: 4, + underline: 8, + blink: 16, + inverse: 32, + invisible: 64, + strikethrough: 128, +} as const + +/** Canonical cell width in pixels. */ +export const CellWidth = 10 +/** Canonical cell height in pixels. */ +export const CellHeight = 20 +/** Canonical font size in pixels for cell text. */ +export const FontSize = 16 +/** Opacity applied to dim spans. */ +export const DimAlpha = 0.55 +/** Y offset of the underline stroke within a cell. */ +export const UnderlineOffset = 17 +/** Y offset of the strikethrough stroke within a cell. */ +export const StrikethroughOffset = 10 + +/** A rectangle in pixels relative to a cell's top-left corner. */ +export interface GlyphRect { + readonly x: number + readonly y: number + readonly width: number + readonly height: number + /** Whether the rectangle's width scales with the glyph's cell count. */ + readonly stretch: boolean +} + +/** + * Terminal cell primitives that renderers draw geometrically instead of with + * fonts: solid blocks and structural bars. Ordinary Unicode symbols belong in + * fallback fonts, not in this table. + */ +export const BlockGlyphs: Record = { + "█": { x: 0, y: 0, width: CellWidth, height: CellHeight, stretch: true }, + "▀": { x: 0, y: 0, width: CellWidth, height: CellHeight / 2, stretch: true }, + "▄": { + x: 0, + y: CellHeight / 2, + width: CellWidth, + height: CellHeight / 2, + stretch: true, + }, + "┃": { x: CellWidth / 2 - 1, y: 0, width: 2, height: CellHeight, stretch: false }, + "╹": { x: CellWidth / 2 - 1, y: 0, width: 2, height: CellHeight / 2, stretch: false }, +} + +const lightBoxGlyphs: Record = { + "─": [false, true, false, true], + "│": [true, false, true, false], + "┌": [false, true, true, false], + "┐": [false, false, true, true], + "└": [true, true, false, false], + "┘": [true, false, false, true], + "├": [true, true, true, false], + "┤": [true, false, true, true], + "┬": [false, true, true, true], + "┴": [true, true, false, true], + "┼": [true, true, true, true], + "╭": [false, true, true, false], + "╮": [false, false, true, true], + "╰": [true, true, false, false], + "╯": [true, false, false, true], +} + +const diagonalBlockGlyphs: Record>> = { + "▚": [ + { x: 0, y: 0, width: CellWidth / 2, height: CellHeight / 2 }, + { x: CellWidth / 2, y: CellHeight / 2, width: CellWidth / 2, height: CellHeight / 2 }, + ], + "▞": [ + { x: CellWidth / 2, y: 0, width: CellWidth / 2, height: CellHeight / 2 }, + { x: 0, y: CellHeight / 2, width: CellWidth / 2, height: CellHeight / 2 }, + ], +} + +/** + * Draws a block/bar glyph geometrically. Returns false when the character is + * not a geometric primitive and must be drawn with fonts instead. + */ +export const drawBlockGlyph = ( + context: { + fillRect(x: number, y: number, width: number, height: number): void + }, + char: string, + x: number, + y: number, + cells = 1, +): boolean => { + const glyph = BlockGlyphs[char] + if (glyph !== undefined) { + const width = glyph.stretch ? glyph.width + (cells - 1) * CellWidth : glyph.width + context.fillRect(x + glyph.x, y + glyph.y, width, glyph.height) + return true + } + const box = lightBoxGlyphs[char] + if (box !== undefined) { + const lineX = CellWidth / 2 - 1 + const lineY = CellHeight / 2 - 1 + const vertical = box[0] || box[2] + if (vertical) { + const top = box[0] ? 0 : lineY + const bottom = box[2] ? CellHeight : lineY + 1 + context.fillRect(x + lineX, y + top, 1, bottom - top) + } + if (!vertical && (box[1] || box[3])) { + const left = box[3] ? 0 : lineX + const right = box[1] ? CellWidth : lineX + 1 + context.fillRect(x + left, y + lineY, right - left, 1) + } else { + if (box[3]) context.fillRect(x, y + lineY, lineX, 1) + if (box[1]) context.fillRect(x + lineX + 1, y + lineY, CellWidth - lineX - 1, 1) + } + return true + } + const quadrants = diagonalBlockGlyphs[char] + if (quadrants === undefined) return false + for (const quadrant of quadrants) context.fillRect(x + quadrant.x, y + quadrant.y, quadrant.width, quadrant.height) + return true +} + +/** The subset of a canvas 2D context needed to measure font baselines. */ +export interface FontMeasurer { + measureText(text: string): { + readonly fontBoundingBoxAscent?: number + readonly fontBoundingBoxDescent?: number + } +} + +const baselineCache = new Map() + +/** + * Alphabetic baseline that centers the font's bounding box in a cell. The + * context's font must already be set to `font`. + */ +export const baselineOffset = (context: FontMeasurer, font: string): number => { + const cached = baselineCache.get(font) + if (cached !== undefined) return cached + const metrics = context.measureText("Mg") + const ascent = metrics.fontBoundingBoxAscent ?? FontSize * 0.8 + const descent = metrics.fontBoundingBoxDescent ?? FontSize * 0.2 + const offset = (CellHeight - (ascent + descent)) / 2 + ascent + baselineCache.set(font, offset) + return offset +} diff --git a/packages/drive/src/globals.d.ts b/packages/drive/src/globals.d.ts new file mode 100644 index 00000000000..57030bc4280 --- /dev/null +++ b/packages/drive/src/globals.d.ts @@ -0,0 +1,3 @@ +interface WebSocket { + terminate(): void +} diff --git a/packages/drive/src/index.ts b/packages/drive/src/index.ts new file mode 100644 index 00000000000..6b64d347155 --- /dev/null +++ b/packages/drive/src/index.ts @@ -0,0 +1,8 @@ +export * from "./script/index.js" +export * as Effect from "effect/Effect" +export * as Llm from "./llm/index.js" +export * as OpenCodeDriver from "./driver/index.js" +export * as Errors from "./script/errors.js" +export * as Tool from "./tool/index.js" +export { Frontend } from "./client/protocol.js" +export type { OpenCode, Recording, Tui, TuiLaunchError, TuiOptions, Tuis, Ui } from "./driver/index.js" diff --git a/packages/drive/src/instance/control.ts b/packages/drive/src/instance/control.ts new file mode 100644 index 00000000000..6530b70ab5f --- /dev/null +++ b/packages/drive/src/instance/control.ts @@ -0,0 +1,162 @@ +import { rm } from "node:fs/promises" +import { connect, createServer } from "node:net" +import type { ResponseConfiguration, ResponseUpdate } from "../cli/response-generator.js" + +export interface StopResult { + readonly recording?: string + readonly screenshots: ReadonlyArray +} + +export async function listenControl( + path: string, + handlers: { + readonly restart: () => Promise + readonly stop: (onProgress: (percent: number) => void) => Promise + readonly responses: (input: ResponseUpdate) => Promise + }, +) { + const server = createServer((socket) => { + let buffer = "" + socket.setEncoding("utf8") + socket.on("data", (data) => { + buffer += data + if (buffer.length > 64 * 1024) { + socket.removeAllListeners("data") + socket.end("error: control request exceeds 64 KiB\n") + return + } + if (!buffer.includes("\n")) return + socket.removeAllListeners("data") + const progress = (percent: number) => socket.write(`progress ${percent}\n`) + void handle(buffer.slice(0, buffer.indexOf("\n")), progress).then( + (result) => socket.end(`success${result === undefined ? "" : ` ${JSON.stringify(result)}`}\n`), + (error) => socket.end(`error: ${error instanceof Error ? error.message : String(error)}\n`), + ) + }) + }) + const handle = async (input: string, onProgress: (percent: number) => void) => { + if (input === "restart") return handlers.restart() + if (input === "stop") return handlers.stop(onProgress) + if (input === "responses") return handlers.responses({}) + if (input.startsWith("responses ")) return handlers.responses(parseResponseUpdate(input.slice("responses ".length))) + throw new Error("unknown control command") + } + await listen(server, path) + return async () => { + await new Promise((resolve) => server.close(() => resolve())) + await rm(path, { force: true }) + } +} + +export async function request(path: string, command: "restart") { + const response = await send(path, command) + if (response === "success") return undefined + if (!response.startsWith("success ")) throw responseError(response) + const value: unknown = JSON.parse(response.slice("success ".length)) + if (typeof value !== "string") throw new Error("instance returned an invalid recording path") + return value +} + +export async function requestStop(path: string, onProgress?: (percent: number) => void) { + const response = await send(path, "stop", onProgress) + if (!response.startsWith("success ")) throw responseError(response) + const value: unknown = JSON.parse(response.slice("success ".length)) + if (!isStopResult(value)) throw new Error("instance returned an invalid stop result") + return value +} + +export async function requestResponses(path: string, input: ResponseUpdate) { + const response = await send( + path, + Object.keys(input).length === 0 ? "responses" : `responses ${JSON.stringify(input)}`, + ) + if (!response.startsWith("success ")) throw responseError(response) + const value: unknown = JSON.parse(response.slice("success ".length)) + if (!isResponseConfiguration(value)) throw new Error("instance returned an invalid response configuration") + return value +} + +function send(path: string, command: string, onProgress?: (percent: number) => void) { + return new Promise((resolve, reject) => { + const socket = connect(path) + let response = "" + let buffer = "" + const timer = setTimeout(() => { + socket.destroy() + reject(new Error("instance control request timed out")) + }, 5 * 60_000) + socket.setEncoding("utf8") + socket.on("connect", () => socket.write(`${command}\n`)) + socket.on("data", (data) => { + buffer += data + while (buffer.includes("\n")) { + const index = buffer.indexOf("\n") + const line = buffer.slice(0, index) + buffer = buffer.slice(index + 1) + if (line.startsWith("progress ")) { + const percent = Number(line.slice("progress ".length)) + if (Number.isInteger(percent)) onProgress?.(percent) + continue + } + response += `${line}\n` + } + }) + socket.on("end", () => { + clearTimeout(timer) + resolve(`${response}${buffer}`.trim()) + }) + socket.on("error", () => { + clearTimeout(timer) + reject(new Error("instance control socket is unavailable")) + }) + }) +} + +function parseResponseUpdate(input: string): ResponseUpdate { + const value: unknown = JSON.parse(input) + if (typeof value !== "object" || value === null || Array.isArray(value)) + throw new Error("invalid responses configuration") + const types = "types" in value ? stringArray(value.types) : undefined + const tools = "tools" in value ? stringArray(value.tools) : undefined + return { + ...(types === undefined ? {} : { types }), + ...(tools === undefined ? {} : { tools }), + } +} + +function stringArray(value: unknown) { + if (!Array.isArray(value) || !value.every((item) => typeof item === "string")) + throw new Error("response types and tools must be string arrays") + return value +} + +function isResponseConfiguration(value: unknown): value is ResponseConfiguration { + if (typeof value !== "object" || value === null) return false + if (!("types" in value) || !stringArrayValue(value.types)) return false + return "tools" in value && stringArrayValue(value.tools) +} + +function isStopResult(value: unknown): value is StopResult { + if (typeof value !== "object" || value === null) return false + if (!("screenshots" in value) || !stringArrayValue(value.screenshots)) return false + return !("recording" in value) || typeof value.recording === "string" +} + +function stringArrayValue(value: unknown) { + return Array.isArray(value) && value.every((item) => typeof item === "string") +} + +function responseError(response: string) { + return new Error(response.replace(/^error:\s*/, "") || "empty control response") +} + +async function listen(server: ReturnType, path: string) { + await rm(path, { force: true }) + await new Promise((resolve, reject) => { + server.once("error", reject) + server.listen(path, () => { + server.off("error", reject) + resolve() + }) + }) +} diff --git a/packages/drive/src/instance/default-config.jsonc b/packages/drive/src/instance/default-config.jsonc new file mode 100644 index 00000000000..544e6914d57 --- /dev/null +++ b/packages/drive/src/instance/default-config.jsonc @@ -0,0 +1,34 @@ +{ + "model": "simulation/gpt-sim-model", + "snapshots": false, + "permissions": [ + { + "action": "*", + "resource": "*", + "effect": "allow", + }, + ], + "providers": { + "simulation": { + "name": "Simulation", + "package": "@opencode-ai/ai/providers/openai/chat", + "settings": { + "apiKey": "sim-key", + }, + "models": { + "gpt-sim-model": { + "name": "Simulated Model", + "capabilities": { + "tools": true, + "input": ["text"], + "output": ["text"], + }, + "limit": { + "context": 128000, + "output": 16000, + }, + }, + }, + }, + }, +} diff --git a/packages/drive/src/instance/dev.ts b/packages/drive/src/instance/dev.ts new file mode 100644 index 00000000000..b66592be2fa --- /dev/null +++ b/packages/drive/src/instance/dev.ts @@ -0,0 +1,37 @@ +import { mkdir, rm, symlink } from "node:fs/promises" +import { join, resolve } from "node:path" +import * as Effect from "effect/Effect" +import { instanceError } from "./error.js" + +/** + * Prepares an OpenCode development checkout for launch: verifies the CLI + * entrypoint and reuses its installed `@opentui/solid` preload. + */ +export const prepareDev = Effect.fn("OpenCodeInstance.prepareDev")(function* (artifacts: string, directory: string) { + const root = resolve(directory) + const entrypoint = join(root, "packages", "cli", "src", "index.ts") + const solid = join(root, "packages", "tui", "node_modules", "@opentui", "solid") + const standalone = yield* Effect.tryPromise({ + try: async () => { + if (!(await Bun.file(entrypoint).exists())) + throw new Error(`OpenCode development entrypoint not found: ${entrypoint}`) + if (!(await Bun.file(join(solid, "package.json")).exists())) + throw new Error(`OpenCode development dependency not found: ${solid}; run bun install in ${root}`) + const preload = join(artifacts, "node_modules", "@opentui", "solid") + await mkdir(join(artifacts, "node_modules", "@opentui"), { + recursive: true, + }) + await rm(preload, { recursive: true, force: true }) + await symlink(solid, preload, "dir") + return Bun.file(join(root, "packages", "cli", "src", "services", "standalone.ts")).exists() + }, + catch: (cause) => instanceError("prepare development checkout", cause), + }) + const preloads = ["--conditions=browser", `--preload=${join(solid, "scripts", "preload.js")}`] + const base = [process.execPath, ...preloads, entrypoint] + return { + command: [...base, ...(standalone ? ["--standalone"] : [])], + scriptedCommand: base, + preloads, + } +}) diff --git a/packages/drive/src/instance/error.ts b/packages/drive/src/instance/error.ts new file mode 100644 index 00000000000..58894ee391e --- /dev/null +++ b/packages/drive/src/instance/error.ts @@ -0,0 +1,15 @@ +import * as Schema from "effect/Schema" + +export class OpenCodeInstanceError extends Schema.TaggedErrorClass()("OpenCodeInstanceError", { + operation: Schema.String, + message: Schema.String, +}) {} + +/** Coerces any cause into an `OpenCodeInstanceError`, preserving existing ones. */ +export function instanceError(operation: string, cause: unknown) { + if (cause instanceof OpenCodeInstanceError) return cause + return new OpenCodeInstanceError({ + operation, + message: cause instanceof Error ? cause.message : String(cause), + }) +} diff --git a/packages/drive/src/instance/instance.ts b/packages/drive/src/instance/instance.ts new file mode 100644 index 00000000000..fc9b6482ce2 --- /dev/null +++ b/packages/drive/src/instance/instance.ts @@ -0,0 +1,114 @@ +import { mkdir } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join, resolve } from "node:path" +import * as Effect from "effect/Effect" +import { createScriptFileSystem } from "../script/filesystem.js" +import { commitScriptProject, hasGitMetadata, initializeScriptProject } from "../script/project.js" +import type { OpenCodeConfig, OpenCodeTuiConfig, Project, Setup } from "../project.js" + +export function artifactDirectory() { + return resolve(join(tmpdir(), "opencode-drive")) +} + +export async function initializeInstance(name?: string) { + const artifacts = resolve(join(artifactDirectory(), `run-${crypto.randomUUID()}`)) + const logs = join(artifacts, "logs") + const drive = join(artifacts, "drive") + await Promise.all([ + mkdir(logs, { recursive: true }), + mkdir(drive, { recursive: true }), + mkdir(join(artifacts, "home", ".cache"), { recursive: true }), + mkdir(join(artifacts, "home", ".config"), { recursive: true }), + mkdir(join(artifacts, "home", ".local", "share"), { recursive: true }), + mkdir(join(artifacts, "home", ".local", "state"), { recursive: true }), + ]) + const files = join(artifacts, "files") + const defaultConfig = await Bun.file(new URL("./default-config.jsonc", import.meta.url)).text() + await Promise.all([ + mkdir(join(files, ".git"), { recursive: true }), + mkdir(join(files, ".opencode"), { recursive: true }), + mkdir(join(files, "src"), { recursive: true }), + ]) + await Promise.all([ + Bun.write(join(files, ".opencode", "opencode.jsonc"), defaultConfig), + Bun.write(join(files, "src", "garden.js"), "export function greet(name) {\n return `Hello, ${name}.`\n}\n"), + ...(name ? [Bun.write(join(drive, "name"), `${name}\n`)] : []), + ]) + return artifacts +} + +export const prepareInstanceProject = Effect.fn("OpenCodeInstance.prepareProject")(function* (options: { + readonly artifacts: string + readonly project?: Project + readonly config?: OpenCodeConfig + readonly tui?: OpenCodeTuiConfig + readonly setup?: Setup +}) { + const files = join(resolve(options.artifacts), "files") + const configPath = join(files, ".opencode", "opencode.jsonc") + const tuiPath = join(files, ".opencode", "tui.jsonc") + const project = options.project + if (project) yield* promise(() => initializeScriptProject(files, project)) + const [config, tui] = yield* Effect.all( + [promise(() => readConfig(configPath, "opencode.jsonc")), promise(() => readConfig(tuiPath, "tui.jsonc", {}))], + { concurrency: "unbounded" }, + ) + deepMerge(config, options.config) + deepMerge(tui, options.tui) + if (options.setup !== undefined) { + const protectGit = Boolean(options.project?.git) || (yield* promise(() => hasGitMetadata(files))) + const setup: Effect.Effect = options.setup({ + fs: createScriptFileSystem(files, { git: protectGit }), + config, + tuiConfig: tui, + }) + if (!Effect.isEffect(setup)) return yield* Effect.fail(new Error("setup must return an Effect")) + yield* setup + } + yield* Effect.all( + [ + promise(() => Bun.write(configPath, `${JSON.stringify(config, undefined, 2)}\n`)), + promise(() => Bun.write(tuiPath, `${JSON.stringify(tui, undefined, 2)}\n`)), + ], + { concurrency: "unbounded" }, + ) + if (options.project?.git) yield* promise(() => commitScriptProject(files)) + return undefined +}) + +const promise = (evaluate: () => PromiseLike) => + Effect.tryPromise({ + try: evaluate, + catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))), + }) + +async function readConfig(path: string, name: string, fallback?: OpenCodeConfig): Promise { + const file = Bun.file(path) + let value: unknown + try { + value = (await file.exists()) + ? Bun.JSONC.parse(await file.text()) + : (fallback ?? Bun.JSONC.parse(await Bun.file(new URL("./default-config.jsonc", import.meta.url)).text())) + } catch (cause) { + throw new Error(`invalid .opencode/${name}`, { cause }) + } + if (!isJsonObject(value)) throw new Error(`invalid .opencode/${name}: expected a JSON object`) + return value +} + +function deepMerge(target: OpenCodeConfig, source: OpenCodeConfig | undefined) { + if (source === undefined) return target + for (const [key, value] of Object.entries(source)) { + const existing = target[key] + if (isJsonObject(existing) && isJsonObject(value)) { + deepMerge(existing, value) + } else { + target[key] = structuredClone(value) + } + } + return target +} + +function isJsonObject(value: unknown): value is OpenCodeConfig { + return typeof value === "object" && value !== null && !Array.isArray(value) +} diff --git a/packages/drive/src/instance/media.ts b/packages/drive/src/instance/media.ts new file mode 100644 index 00000000000..b8f21cc15a2 --- /dev/null +++ b/packages/drive/src/instance/media.ts @@ -0,0 +1,9 @@ +import { basename, join, resolve } from "node:path" +import { artifactDirectory } from "./instance.js" + +export function mediaDirectory() { + return resolve(process.env.OPENCODE_DRIVE_MEDIA_DIR ?? join(artifactDirectory(), "output")) +} + +export const runMediaDirectory = (artifacts: string, generation: number) => + join(mediaDirectory(), basename(resolve(artifacts)), `generation-${generation}`) diff --git a/packages/drive/src/instance/process.ts b/packages/drive/src/instance/process.ts new file mode 100644 index 00000000000..c518c12fc4d --- /dev/null +++ b/packages/drive/src/instance/process.ts @@ -0,0 +1,228 @@ +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as FileSystem from "effect/FileSystem" +import * as Fiber from "effect/Fiber" +import * as Option from "effect/Option" +import * as Ref from "effect/Ref" +import type * as Scope from "effect/Scope" +import * as Scope_ from "effect/Scope" +import * as Schema from "effect/Schema" +import * as Stream from "effect/Stream" +import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process" + +export class ProcessError extends Schema.TaggedErrorClass()("ProcessError", { + operation: Schema.String, + command: Schema.Array(Schema.String), + message: Schema.String, +}) {} + +export interface SpawnOptions { + readonly cwd?: string + readonly env?: Readonly> + readonly extendEnv?: boolean + readonly stdin?: "inherit" | "ignore" + readonly stdout?: "inherit" | "ignore" | { readonly path: string } + readonly stderr?: "inherit" | "ignore" | { readonly path: string } + readonly detached?: boolean +} + +export interface Running { + readonly pid: number + readonly exitCode: Effect.Effect + readonly isRunning: Effect.Effect + readonly terminate: Effect.Effect + readonly detach: Effect.Effect +} + +export interface Output { + readonly status: number + readonly stdout: string + readonly stderr: string +} + +type RunOutputMode = "capture" | "inherit" | "ignore" + +export interface RunOptions extends Omit { + readonly stdout?: RunOutputMode + readonly stderr?: RunOutputMode + readonly stdoutLimit?: number + readonly stderrLimit?: number +} + +export const spawn = Effect.fn("Process.spawn")(function* (command: ReadonlyArray, options: SpawnOptions = {}) { + const executable = command[0] + if (executable === undefined) + return yield* Effect.fail(processError("spawn", command, "cannot spawn an empty command")) + + const parentScope = yield* Scope_.Scope + const processScope = yield* Scope_.fork(parentScope) + const spawner = yield* ChildProcessSpawner.ChildProcessSpawner + const fileSystem = yield* FileSystem.FileSystem + const handle = yield* spawner + .spawn( + ChildProcess.make(executable, command.slice(1), { + cwd: options.cwd, + env: options.env, + extendEnv: options.extendEnv ?? false, + stdin: options.stdin ?? "ignore", + stdout: outputMode(options.stdout), + stderr: outputMode(options.stderr), + detached: options.detached, + killSignal: "SIGKILL", + }), + ) + .pipe( + Scope_.provide(processScope), + Effect.mapError((cause) => processError("spawn", command, cause)), + Effect.onError(() => Scope_.close(processScope, Exit.void)), + ) + + const drains: Array> = [] + if (typeof options.stdout === "object") + drains.push( + yield* Stream.run(handle.stdout, fileSystem.sink(options.stdout.path)).pipe( + Effect.mapError((cause) => processError("stdout", command, cause)), + Effect.forkIn(processScope), + ), + ) + if (typeof options.stderr === "object") + drains.push( + yield* Stream.run(handle.stderr, fileSystem.sink(options.stderr.path)).pipe( + Effect.mapError((cause) => processError("stderr", command, cause)), + Effect.forkIn(processScope), + ), + ) + + const exitCode = handle.exitCode.pipe( + Effect.map(Number), + Effect.catch(() => Effect.succeed(1)), + Effect.tap(() => + Effect.forEach(drains, Fiber.join, { + concurrency: "unbounded", + discard: true, + }), + ), + ) + const detached = yield* Ref.make(false) + + const terminate = Effect.uninterruptible( + Effect.gen(function* () { + const running = yield* handle.isRunning.pipe(Effect.mapError((cause) => processError("status", command, cause))) + if (!running) { + yield* Scope_.close(processScope, Exit.void) + return undefined + } + const graceful = yield* handle.kill({ killSignal: "SIGTERM" }).pipe( + Effect.timeoutOption(1_000), + Effect.mapError((cause) => processError("terminate", command, cause)), + ) + if (Option.isNone(graceful)) + yield* handle + .kill({ killSignal: "SIGKILL" }) + .pipe(Effect.mapError((cause) => processError("kill", command, cause))) + yield* exitCode + yield* Scope_.close(processScope, Exit.void) + return undefined + }), + ) + yield* Effect.addFinalizer(() => + Ref.get(detached).pipe(Effect.flatMap((isDetached) => (isDetached ? Effect.void : terminate.pipe(Effect.ignore)))), + ) + yield* Effect.exit(exitCode).pipe(Effect.andThen(Scope_.close(processScope, Exit.void)), Effect.forkIn(parentScope)) + + const detach = handle.unref.pipe( + Effect.asVoid, + Effect.mapError((cause) => processError("detach", command, cause)), + Effect.andThen(Ref.set(detached, true)), + Effect.andThen(Scope_.close(processScope, Exit.void)), + ) + + return { + pid: Number(handle.pid), + exitCode, + isRunning: handle.isRunning.pipe(Effect.mapError((cause) => processError("status", command, cause))), + terminate, + detach, + } satisfies Running +}) + +export const run = Effect.fn("Process.run")(function* (command: ReadonlyArray, options: RunOptions = {}) { + const executable = command[0] + if (executable === undefined) return yield* Effect.fail(processError("run", command, "cannot run an empty command")) + const spawner = yield* ChildProcessSpawner.ChildProcessSpawner + return yield* Effect.scoped( + Effect.gen(function* () { + const handle = yield* spawner + .spawn( + ChildProcess.make(executable, command.slice(1), { + cwd: options.cwd, + env: options.env, + extendEnv: options.extendEnv ?? false, + stdin: options.stdin ?? "ignore", + stdout: captureMode(options.stdout), + stderr: captureMode(options.stderr), + killSignal: "SIGKILL", + }), + ) + .pipe(Effect.mapError((cause) => processError("spawn", command, cause))) + const stdout = yield* collectOutput(handle.stdout, options.stdout, options.stdoutLimit).pipe( + Effect.mapError((cause) => processError("stdout", command, cause)), + Effect.forkChild, + ) + const stderr = yield* collectOutput(handle.stderr, options.stderr, options.stderrLimit).pipe( + Effect.mapError((cause) => processError("stderr", command, cause)), + Effect.forkChild, + ) + const status = yield* handle.exitCode.pipe( + Effect.map(Number), + Effect.mapError((cause) => processError("wait", command, cause)), + ) + return { + status, + stdout: yield* Fiber.join(stdout), + stderr: yield* Fiber.join(stderr), + } satisfies Output + }), + ) +}) + +function outputMode(output: SpawnOptions["stdout"] | SpawnOptions["stderr"]) { + return typeof output === "object" ? "pipe" : (output ?? "ignore") +} + +function captureMode(output: RunOutputMode | undefined) { + return output === undefined || output === "capture" ? "pipe" : output +} + +function collectOutput( + stream: Stream.Stream, + mode: RunOutputMode | undefined, + limit: number | undefined, +) { + if (mode === "inherit" || mode === "ignore") return Effect.succeed("") + if (limit === undefined) return stream.pipe(Stream.decodeText(), Stream.mkString) + return Effect.gen(function* () { + let output = "" + yield* stream.pipe( + Stream.decodeText(), + Stream.runForEach((chunk) => + Effect.sync(() => { + output = `${output}${chunk}`.slice(-limit) + }), + ), + ) + return output + }) +} + +function processError(operation: string, command: ReadonlyArray, cause: unknown) { + return new ProcessError({ + operation, + command: [...command], + message: cause instanceof Error ? cause.message : String(cause), + }) +} + +export type Requirements = Scope.Scope | ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem + +export * as Process from "./process.js" diff --git a/packages/drive/src/instance/readiness.ts b/packages/drive/src/instance/readiness.ts new file mode 100644 index 00000000000..3f65d1e023b --- /dev/null +++ b/packages/drive/src/instance/readiness.ts @@ -0,0 +1,68 @@ +import * as Effect from "effect/Effect" +import * as Schedule from "effect/Schedule" +import type * as Process from "./process.js" +import { instanceError, type OpenCodeInstanceError } from "./error.js" + +/** Allocates a free localhost port by briefly binding an ephemeral server. */ +export const freePort = Effect.tryPromise({ + try: async () => { + const server = Bun.serve({ + hostname: "127.0.0.1", + port: 0, + fetch: () => new Response(), + }) + const port = server.port + await server.stop(true) + if (port === undefined) throw new Error("ephemeral server did not expose a port") + return port + }, + catch: (cause) => instanceError("allocate port", cause), +}) + +/** + * Polls a WebSocket endpoint until it accepts connections, failing early when + * the owning process exits or the timeout elapses. + */ +export const waitForWebSocket = Effect.fn("OpenCodeInstance.waitForWebSocket")( + (url: string, process: Process.Running, timeout: number) => + Effect.raceFirst( + open(url).pipe(Effect.retry(Schedule.spaced(50))), + process.exitCode.pipe( + Effect.flatMap((status) => + Effect.fail( + instanceError("wait for endpoint", `OpenCode exited with status ${status} before ${url} became ready`), + ), + ), + ), + ).pipe( + Effect.timeoutOrElse({ + duration: timeout, + orElse: () => Effect.fail(instanceError("wait for endpoint", `timed out waiting for drive endpoint ${url}`)), + }), + ), +) + +const open = (url: string) => + Effect.callback((resume) => { + const socket = new WebSocket(url) + const onOpen = () => { + cleanup() + socket.terminate() + resume(Effect.void) + } + const onError = () => { + cleanup() + socket.terminate() + resume(Effect.fail(instanceError("connect", `cannot connect to ${url}`))) + } + const cleanup = () => { + socket.removeEventListener("open", onOpen) + socket.removeEventListener("error", onError) + } + socket.addEventListener("open", onOpen) + socket.addEventListener("error", onError) + return Effect.sync(() => { + cleanup() + socket.terminate() + }) + }) diff --git a/packages/drive/src/instance/registry.ts b/packages/drive/src/instance/registry.ts new file mode 100644 index 00000000000..c26f14c58c1 --- /dev/null +++ b/packages/drive/src/instance/registry.ts @@ -0,0 +1,317 @@ +import { mkdir, open, readdir, rename, rm } from "node:fs/promises" +import { homedir } from "node:os" +import { basename, join } from "node:path" + +export interface InstanceManifest { + readonly version: 1 + readonly name: string + readonly pid: number + readonly startedAt: string + readonly cwd: string + readonly artifacts: string + readonly visible: boolean + readonly status: "starting" | "ready" + readonly endpoints: { readonly ui: string; readonly backend: string } + readonly control: string +} + +export interface InitializedManifest { + readonly version: 1 + readonly name: string + readonly createdAt: string + readonly cwd: string + readonly artifacts: string + readonly status: "initialized" + readonly temporary?: boolean + readonly pid?: number +} + +export type Manifest = InstanceManifest | InitializedManifest + +export function registryDirectory() { + return ( + process.env.DRIVE_REGISTRY_DIR ?? + join(process.env.XDG_STATE_HOME ?? join(homedir(), ".local", "state"), "opencode-drive", "instances") + ) +} + +export function manifestPath(name: string) { + return join(registryDirectory(), `${validateName(name)}.json`) +} + +export function controlPath(name: string) { + return join(registryDirectory(), `${validateName(name)}.sock`) +} + +export async function initializeManifest( + name: string, + cwd: string, + create: () => Promise, + options: { + readonly temporary?: boolean + readonly adoptPid?: number + } = {}, +) { + let initialized: InitializedManifest | undefined + await withLock(name, false, async () => { + let existing = await read(manifestPath(name)) + if (existing?.status === "initialized") { + if (options.temporary && options.adoptPid !== undefined && existing.pid === options.adoptPid) { + initialized = { ...existing, pid: process.pid } + await write(initialized) + return + } + if (!keepInitialized(existing)) { + await Promise.all([rm(manifestPath(name), { force: true }), rm(controlPath(name), { force: true })]) + existing = undefined + } else { + let available = existing + if (existing.pid !== undefined && existing.pid !== process.pid) { + if (isProcessAlive(existing.pid)) throw new Error(`drive instance "${name}" is already starting`) + const { pid: _, ...released } = existing + available = released + } + if (options.temporary && available.pid === undefined) { + initialized = { ...available, pid: process.pid } + } else { + initialized = available + } + if (initialized !== existing) await write(initialized) + return + } + } + if (existing && isProcessAlive(existing.pid)) throw new Error(`drive instance "${name}" is already running`) + initialized = { + version: 1, + name, + createdAt: new Date().toISOString(), + cwd, + artifacts: await create(), + status: "initialized", + ...(options.temporary ? { temporary: true, pid: process.pid } : {}), + } + await Promise.all([rm(manifestPath(name), { force: true }), rm(controlPath(name), { force: true })]) + await write(initialized) + }) + if (!initialized) throw new Error(`failed to initialize drive instance "${name}"`) + return initialized +} + +export async function register(manifest: InstanceManifest) { + if (manifest.visible) { + const visible = (await listInstances()).find((instance) => instance.visible) + if (visible) throw new Error(`visible drive instance "${visible.name}" is already running`) + } + await withLock(manifest.name, false, async () => { + const existing = await read(manifestPath(manifest.name)) + if (existing?.status === "initialized" && existing.pid !== undefined && existing.pid !== manifest.pid) + throw new Error(`drive instance "${manifest.name}" changed ownership`) + if (existing && existing.status !== "initialized" && isProcessAlive(existing.pid)) + throw new Error(`drive instance "${manifest.name}" is already running`) + await Promise.all([ + rm(manifestPath(manifest.name), { force: true }), + rm(controlPath(manifest.name), { force: true }), + ]) + await write(manifest) + }) +} + +export async function markReady(name: string, pid: number) { + await markStatus(name, pid, "ready") +} + +export async function markStarting(name: string, pid: number) { + await markStatus(name, pid, "starting") +} + +async function markStatus(name: string, pid: number, status: InstanceManifest["status"]) { + await withLock(name, true, async () => { + const manifest = await read(manifestPath(name)) + if (!manifest || manifest.status === "initialized" || manifest.pid !== pid) + throw new Error(`drive instance "${name}" changed ownership`) + await write({ ...manifest, status }) + }) +} + +export async function resolveInstance(name?: string, options: { readonly ready?: boolean } = {}) { + const instances = await listInstances() + const manifest = name ? instances.find((item) => item.name === name) : instances.find((item) => item.visible) + if (!manifest) { + if (!name && instances.length > 0) + throw new Error( + `no visible drive instance is running; pass --name (${instances.map((item) => item.name).join(", ")})`, + ) + throw new Error(name ? `drive instance "${name}" was not found` : "no drive instances are running") + } + if (options.ready !== false && manifest.status !== "ready") + throw new Error(`drive instance "${manifest.name}" is still starting`) + return manifest +} + +export async function resolveVisibleInstance(options: { readonly ready?: boolean } = {}) { + const manifest = (await listInstances()).find((instance) => instance.visible) + if (manifest && options.ready !== false && manifest.status !== "ready") + throw new Error(`drive instance "${manifest.name}" is still starting`) + return manifest +} + +export async function listInstances() { + return (await listManifests()).filter((manifest): manifest is InstanceManifest => manifest.status !== "initialized") +} + +export async function listManifests() { + await mkdir(registryDirectory(), { recursive: true }) + const files = await readdir(registryDirectory()) + const manifests = await Promise.all( + files + .filter((file) => file.endsWith(".json")) + .map(async (file) => { + const name = basename(file, ".json") + if (!isValidName(name)) { + await rm(join(registryDirectory(), file), { force: true }) + return undefined + } + const manifest = await read(join(registryDirectory(), file)) + if (manifest?.name === name) { + if (manifest.status === "initialized" && keepInitialized(manifest)) return manifest + if (manifest.status !== "initialized" && isProcessAlive(manifest.pid)) return manifest + } + await prune(name, manifest?.status === "initialized" ? undefined : manifest?.pid) + return undefined + }), + ) + const active = manifests.filter((manifest): manifest is Manifest => manifest !== undefined) + const names = new Set(active.map((manifest) => manifest.name)) + await Promise.all( + files + .filter((file) => file.endsWith(".sock")) + .flatMap((file) => { + const name = basename(file, ".sock") + if (!isValidName(name)) return [rm(join(registryDirectory(), file), { force: true })] + if (!names.has(name)) return [prune(name)] + return [] + }), + ) + return active.sort((a, b) => a.name.localeCompare(b.name)) +} + +export async function unregister(name: string, pid: number) { + await withLock(name, true, async () => { + const manifest = await read(manifestPath(name)) + if (!manifest || manifest.status === "initialized" || manifest.pid !== pid) return + await Promise.all([rm(manifestPath(name), { force: true }), rm(controlPath(name), { force: true })]) + }) +} + +async function prune(name: string, pid?: number) { + await withLock(name, true, async () => { + const manifest = await read(manifestPath(name)) + if (manifest?.status === "initialized") { + if (keepInitialized(manifest)) return + await Promise.all([rm(manifestPath(name), { force: true }), rm(controlPath(name), { force: true })]) + return + } + if (manifest && (manifest.pid !== pid || isProcessAlive(manifest.pid))) return + await Promise.all([rm(manifestPath(name), { force: true }), rm(controlPath(name), { force: true })]) + }) +} + +function keepInitialized(manifest: InitializedManifest) { + if (!manifest.temporary) return !legacyVisibleInitialized(manifest.name) + return manifest.pid !== undefined && isProcessAlive(manifest.pid) +} + +function legacyVisibleInitialized(name: string) { + return /^visible-\d+$/.test(name) +} + +async function write(manifest: Manifest) { + const file = manifestPath(manifest.name) + const temporary = `${file}.${process.pid}.${crypto.randomUUID()}.tmp` + try { + await Bun.write(temporary, `${JSON.stringify(manifest, undefined, 2)}\n`) + await rename(temporary, file) + } finally { + await rm(temporary, { force: true }) + } +} + +async function read(file: string): Promise { + const value: unknown = await Bun.file(file) + .json() + .catch(() => undefined) + if (isManifest(value)) return value + return undefined +} + +async function withLock(name: string, wait: boolean, task: () => Promise) { + await mkdir(registryDirectory(), { recursive: true }) + const lock = `${manifestPath(name)}.lock` + const deadline = Date.now() + 10_000 + while (true) { + const handle = await open(lock, "wx").catch((error: unknown) => { + if (isNodeError(error) && error.code === "EEXIST") return undefined + throw error + }) + if (handle) { + try { + await handle.writeFile(`${process.pid}\n`) + await task() + return + } finally { + await handle.close() + await rm(lock, { force: true }) + } + } + if (await staleLock(lock)) { + await rm(lock, { force: true }) + continue + } + if (!wait) throw new Error(`drive instance "${name}" is already starting`) + if (Date.now() >= deadline) throw new Error(`timed out updating drive instance "${name}"`) + await Bun.sleep(10) + } +} + +async function staleLock(file: string) { + const pid = Number.parseInt( + await Bun.file(file) + .text() + .catch(() => ""), + 10, + ) + return Number.isInteger(pid) && !isProcessAlive(pid) +} + +function isManifest(value: unknown): value is Manifest { + if (typeof value !== "object" || value === null) return false + const manifest = value as Partial + if (typeof manifest.name !== "string") return false + if (manifest.status === "initialized") return typeof manifest.artifacts === "string" + const instance = value as Partial + const endpoints = instance.endpoints + return typeof instance.pid === "number" && typeof endpoints?.ui === "string" && typeof endpoints.backend === "string" +} + +export function validateName(name: string) { + if (!isValidName(name)) + throw new Error("instance names must contain 1-64 letters, numbers, dots, underscores, or dashes") + return name +} + +export function isValidName(name: string) { + return /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/.test(name) +} + +export function isProcessAlive(pid: number) { + try { + process.kill(pid, 0) + return true + } catch { + return false + } +} + +function isNodeError(error: unknown): error is NodeJS.ErrnoException { + return error instanceof Error && "code" in error +} diff --git a/packages/drive/src/instance/runtime.ts b/packages/drive/src/instance/runtime.ts new file mode 100644 index 00000000000..755cca72ac9 --- /dev/null +++ b/packages/drive/src/instance/runtime.ts @@ -0,0 +1,531 @@ +import { join, resolve } from "node:path" +import * as Config from "effect/Config" +import * as Data from "effect/Data" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as FileSystem from "effect/FileSystem" +import * as Ref from "effect/Ref" +import * as Semaphore from "effect/Semaphore" +import * as Scope from "effect/Scope" +import { ChildProcessSpawner } from "effect/unstable/process" +import { prepareDev } from "./dev.js" +import { instanceError, OpenCodeInstanceError } from "./error.js" +import { runMediaDirectory } from "./media.js" +import { prepareInstanceProject } from "./instance.js" +import * as Process from "./process.js" +import { freePort, waitForWebSocket } from "./readiness.js" +import { isValidName } from "./registry.js" +import { stopService } from "./service.js" +import type { RecordingPaths } from "../recording/finalize.js" +import { stripGitEnvironment } from "../script/project.js" +import * as ToolController from "../tool/controller.js" +import type * as Tool from "../tool/index.js" +import type { Frontend } from "../client/protocol.js" +import type { OpenCodeConfig, OpenCodeTuiConfig, Project, Setup } from "../project.js" + +type Viewport = Frontend.ResizeParams + +export { OpenCodeInstanceError } from "./error.js" + +export interface Options { + readonly artifacts: string + readonly name: string + readonly command?: ReadonlyArray + readonly dev?: string + readonly scripted?: boolean + readonly visible?: boolean + readonly record?: boolean + readonly viewport?: Viewport + readonly env?: Readonly> + readonly project?: Project + readonly config?: OpenCodeConfig + readonly tui?: OpenCodeTuiConfig + readonly setup?: Setup + readonly tools?: Tool.Configuration + readonly log?: (message: string) => void +} + +export interface TuiProcess { + readonly endpoint: string + readonly process: Process.Running + readonly recording?: RecordingPaths + readonly close: Effect.Effect +} + +export interface Instance { + readonly artifacts: string + readonly logs: string + readonly visible: boolean + readonly endpoints: { + readonly ui: string + readonly backend: string + } + readonly tools: Tool.StaticControls + readonly toolNames: ReadonlySet + readonly recording: Effect.Effect + readonly primary: Effect.Effect + readonly launchServer: Effect.Effect<{ readonly endpoint: string }, OpenCodeInstanceError> + readonly killServer: Effect.Effect + readonly launchTui: ( + name: string, + options?: { readonly record?: boolean; readonly viewport?: Viewport }, + ) => Effect.Effect + readonly waitForDrive: ( + requirement?: "ui" | "backend" | "both", + timeout?: number, + ) => Effect.Effect + readonly restart: Effect.Effect + readonly wait: Effect.Effect + readonly stop: Effect.Effect +} + +interface StateFields { + readonly recording?: RecordingPaths + readonly server?: Process.Running + readonly pendingServer?: Process.Running + readonly primary?: Process.Running + readonly tuis: ReadonlyMap + readonly pendingTuis: ReadonlyMap +} + +type State = Data.TaggedEnum<{ + readonly Running: StateFields + readonly Stopping: StateFields + readonly Stopped: StateFields +}> + +const State = Data.taggedEnum() + +export const make = Effect.fn("OpenCodeInstance.make")(function* ( + options: Options, + configuredTools?: ToolController.Controller, +) { + const artifacts = resolve(options.artifacts) + const logs = join(artifacts, "logs") + const drive = join(artifacts, "drive") + const files = join(artifacts, "files") + let mediaGeneration = 0 + let media = runMediaDirectory(artifacts, mediaGeneration) + const uiPort = yield* freePort + const endpoints = { + ui: `ws://127.0.0.1:${uiPort}`, + backend: `ws://127.0.0.1:${yield* distinctPort(uiPort)}`, + } + const toolController = configuredTools ?? (yield* ToolController.make(options.tools)) + const database = yield* Config.string("OPENCODE_DRIVE_DB").pipe(Config.withDefault(":memory:")) + const setup = + configuredTools === undefined ? ToolController.composeSetup(toolController, options.setup) : options.setup + if (options.project !== undefined || options.config !== undefined || options.tui !== undefined || setup !== undefined) + yield* prepareInstanceProject({ + artifacts, + project: options.project, + config: options.config, + tui: options.tui, + setup, + }).pipe(Effect.mapError((cause) => instanceError("prepare project", cause))) + const dev = options.dev !== undefined ? yield* prepareDev(artifacts, options.dev) : undefined + const environment = stripGitEnvironment({ + ...process.env, + ...options.env, + BUN_OPTIONS: + dev === undefined + ? (options.env?.BUN_OPTIONS ?? process.env.BUN_OPTIONS) + : [options.env?.BUN_OPTIONS ?? process.env.BUN_OPTIONS, ...dev.preloads].filter(Boolean).join(" "), + OPENCODE_SIMULATE: "1", + OPENCODE_DRIVE_SCRIPTED: options.scripted ? "1" : undefined, + DRIVE_REGISTRY_DIR: drive, + OPENCODE_DRIVE_RENDERER: options.visible ? "visible" : "headless", + OPENCODE_DRIVE_DEV: options.dev, + OPENCODE_CONFIG_DIR: join(files, ".opencode"), + OPENCODE_DB: database, + OPENCODE_LOG_LEVEL: !options.visible ? "DEBUG" : process.env.OPENCODE_LOG_LEVEL, + OPENCODE_TEST_HOME: artifacts, + XDG_CACHE_HOME: join(artifacts, "home", ".cache"), + XDG_CONFIG_HOME: join(artifacts, "home", ".config"), + XDG_DATA_HOME: logs, + XDG_STATE_HOME: join(artifacts, "home", ".local", "state"), + }) + const command = dev !== undefined ? dev.command : options.command?.length ? [...options.command] : ["opencode2"] + const scriptedCommand = dev?.scriptedCommand ?? command + const initialRecording = options.record ? recordingPaths(media) : undefined + const processSpawner = yield* ChildProcessSpawner.ChildProcessSpawner + const fileSystem = yield* FileSystem.FileSystem + const state = yield* Ref.make( + State.Running({ + recording: initialRecording, + tuis: new Map(), + pendingTuis: new Map(), + }), + ) + const lock = yield* Semaphore.make(1) + const instanceScope = yield* Scope.Scope + + const writeManifest = Effect.fn("OpenCodeInstance.writeManifest")(function* ( + name: string, + manifestEndpoints: { readonly ui: string; readonly backend: string }, + recording?: RecordingPaths, + viewport?: Viewport, + ) { + yield* Effect.tryPromise({ + try: () => + Bun.write( + join(drive, `${name}.json`), + `${JSON.stringify( + { + endpoints: manifestEndpoints, + ...(viewport ? { viewport } : {}), + ...(recording ? { recording: { timeline: recording.timeline } } : {}), + }, + undefined, + 2, + )}\n`, + ), + catch: (cause) => instanceError("write manifest", cause), + }) + }) + + const spawn = Effect.fn("OpenCodeInstance.spawn")(function* ( + driveName: string, + appCommand: ReadonlyArray, + logName: string, + visible: boolean, + ) { + options.log?.(`launching ${logName}`) + return yield* Process.spawn(appCommand, { + cwd: files, + env: { + ...environment, + OPENCODE_DRIVE: driveName, + OPENCODE_DRIVE_MEDIA_DIR: media, + }, + stdin: visible ? "inherit" : "ignore", + stdout: visible ? "inherit" : { path: join(logs, `${logName}.stdout.log`) }, + stderr: visible ? "inherit" : { path: join(logs, `${logName}.stderr.log`) }, + }).pipe( + Effect.provideService(ChildProcessSpawner.ChildProcessSpawner, processSpawner), + Effect.provideService(FileSystem.FileSystem, fileSystem), + Scope.provide(instanceScope), + Effect.mapError((cause) => instanceError(`launch ${logName}`, cause)), + ) + }) + + const launchDefault = Effect.fn("OpenCodeInstance.launchDefault")(function* (recording: RecordingPaths | undefined) { + yield* writeManifest(options.name, endpoints, recording, options.viewport) + options.log?.("launching OpenCode") + return yield* spawn(options.name, command, "opencode", options.visible ?? false) + }) + + if (!options.scripted) { + const primary = yield* launchDefault(initialRecording) + yield* Ref.update(state, (current) => ({ ...current, primary })) + } + + const launchServer = Effect.gen(function* () { + const server = yield* lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + if (!options.scripted) + return yield* Effect.fail(instanceError("launch server", "server launch requires scripted mode")) + if (current._tag !== "Running") + return yield* Effect.fail(instanceError("launch server", "the instance is stopping")) + if (current.server !== undefined || current.pendingServer !== undefined) + return yield* Effect.fail(instanceError("launch server", "the script server has already been launched")) + const name = processDriveName(options.name, "service") + const serverCommand = [...scriptedCommand, "serve", "--service", "--port", String(yield* freePort)] + yield* writeManifest(name, { + ui: `ws://127.0.0.1:${yield* freePort}`, + backend: endpoints.backend, + }) + options.log?.("launching script server") + const server = yield* spawn(name, serverCommand, "service", false) + yield* Ref.update(state, (value) => ({ ...value, pendingServer: server })) + return server + }), + ) + const removePending = lock.withPermit( + Ref.update(state, (value) => (value.pendingServer === server ? { ...value, pendingServer: undefined } : value)), + ) + yield* waitForWebSocket(endpoints.backend, server, 60_000).pipe( + Effect.onError(() => removePending.pipe(Effect.andThen(server.terminate), Effect.ignore)), + Effect.mapError((cause) => instanceError("wait for server", cause)), + ) + const committed = yield* lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + if (current._tag !== "Running" || current.pendingServer !== server) return false + yield* Ref.set(state, { + ...current, + pendingServer: undefined, + server, + primary: server, + }) + return true + }), + ) + if (!committed) { + yield* server.terminate.pipe(Effect.ignore) + return yield* Effect.fail(instanceError("launch server", "the instance is stopping")) + } + yield* server.exitCode.pipe( + Effect.ignore, + Effect.andThen(Ref.update(state, (value) => (value.server === server ? { ...value, server: undefined } : value))), + Effect.forkIn(instanceScope), + ) + options.log?.("script server ready") + return { endpoint: endpoints.backend } + }) + + const killServer = lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + if (!options.scripted) + return yield* Effect.fail(instanceError("kill server", "server kill requires scripted mode")) + if (current.server === undefined) + return yield* Effect.fail(instanceError("kill server", "the script server is not running")) + options.log?.("stopping script server") + yield* current.server.terminate.pipe(Effect.mapError((cause) => instanceError("kill server", cause))) + yield* Ref.update(state, (value) => ({ + ...value, + server: undefined, + primary: value.primary === current.server ? undefined : value.primary, + })) + return undefined + }), + ) + + const launchTui = Effect.fn("OpenCodeInstance.launchTui")(function* ( + name: string, + tuiOptions: { readonly record?: boolean; readonly viewport?: Viewport } = {}, + ) { + const pending = yield* lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + if (!options.scripted) + return yield* Effect.fail(instanceError("launch TUI", "TUI launch requires scripted mode")) + if (current._tag !== "Running") + return yield* Effect.fail(instanceError("launch TUI", "the instance is stopping")) + if (current.server === undefined) + return yield* Effect.fail(instanceError("launch TUI", "launch the script server before launching TUIs")) + if (!isValidName(name)) return yield* Effect.fail(instanceError("launch TUI", `invalid TUI name: ${name}`)) + if (current.tuis.has(name) || current.pendingTuis.has(name)) + return yield* Effect.fail(instanceError("launch TUI", `TUI "${name}" is already running`)) + if (options.visible && current.tuis.size + current.pendingTuis.size > 0) + return yield* Effect.fail(instanceError("launch TUI", "multiple TUIs require headless scripted mode")) + const primary = current.tuis.size + current.pendingTuis.size === 0 + const tuiEndpoints = { + ui: primary ? endpoints.ui : `ws://127.0.0.1:${yield* freePort}`, + backend: endpoints.backend, + } + const driveName = processDriveName(options.name, `tui-${name}`) + const recording = tuiOptions.record ? recordingPaths(media) : primary ? current.recording : undefined + yield* writeManifest(driveName, tuiEndpoints, recording, tuiOptions.viewport ?? options.viewport) + options.log?.(`launching TUI ${name}`) + const tui = yield* spawn(driveName, scriptedCommand, `tui-${name}`, options.visible ?? false) + yield* Ref.update(state, (value) => ({ + ...value, + pendingTuis: new Map(value.pendingTuis).set(name, tui), + })) + return { tui, tuiEndpoints, primary, recording } + }), + ) + const { tui, tuiEndpoints, primary, recording } = pending + const removePending = lock.withPermit( + Ref.update(state, (value) => { + if (value.pendingTuis.get(name) !== tui) return value + const pendingTuis = new Map(value.pendingTuis) + pendingTuis.delete(name) + return { ...value, pendingTuis } + }), + ) + yield* waitForWebSocket(tuiEndpoints.ui, tui, 60_000).pipe( + Effect.onError(() => removePending.pipe(Effect.andThen(tui.terminate), Effect.ignore)), + Effect.mapError((cause) => instanceError("wait for TUI", cause)), + ) + const committed = yield* lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + if (current._tag !== "Running" || current.pendingTuis.get(name) !== tui) return false + const pendingTuis = new Map(current.pendingTuis) + pendingTuis.delete(name) + yield* Ref.set(state, { + ...current, + primary: primary ? tui : current.primary, + tuis: new Map(current.tuis).set(name, tui), + pendingTuis, + }) + return true + }), + ) + if (!committed) { + yield* tui.terminate.pipe(Effect.ignore) + return yield* Effect.fail(instanceError("launch TUI", "the instance is stopping")) + } + yield* tui.exitCode.pipe( + Effect.ignore, + Effect.andThen( + Ref.update(state, (value) => { + if (value.tuis.get(name) !== tui) return value + const tuis = new Map(value.tuis) + tuis.delete(name) + return { ...value, tuis } + }), + ), + Effect.forkIn(instanceScope), + ) + options.log?.(`TUI ${name} ready`) + const close = Effect.gen(function* () { + yield* Ref.update(state, (value) => { + if (value.tuis.get(name) !== tui) return value + const tuis = new Map(value.tuis) + tuis.delete(name) + return { ...value, tuis } + }) + yield* tui.terminate.pipe(Effect.mapError((cause) => instanceError("close TUI", cause))) + }) + return { + endpoint: tuiEndpoints.ui, + process: tui, + recording, + close, + } satisfies TuiProcess + }) + + const waitForDrive = Effect.fn("OpenCodeInstance.waitForDrive")(function* ( + requirement: "ui" | "backend" | "both" = "both", + timeout = 60_000, + ) { + const current = yield* Ref.get(state) + const process = current.primary + if (process === undefined) + return yield* Effect.fail(instanceError("wait for drive", "no OpenCode process has been launched")) + const urls = requirement === "both" ? [endpoints.ui, endpoints.backend] : [endpoints[requirement]] + yield* Effect.forEach(urls, (url) => waitForWebSocket(url, process, timeout), { + concurrency: "unbounded", + discard: true, + }).pipe(Effect.mapError((cause) => instanceError("wait for drive", cause))) + return undefined + }) + + const restart = lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + if (current._tag !== "Running") return yield* Effect.fail(instanceError("restart", "the instance is stopping")) + options.log?.("restarting OpenCode") + const processes = new Set([...current.tuis.values(), ...current.pendingTuis.values()]) + if (current.server !== undefined) processes.add(current.server) + if (current.pendingServer !== undefined) processes.add(current.pendingServer) + if (!options.scripted && current.primary !== undefined) processes.add(current.primary) + const exits = yield* Effect.forEach(processes, (process) => Effect.exit(process.terminate), { + concurrency: "unbounded", + }) + const combined = Exit.asVoidAll(exits) + if (Exit.isFailure(combined)) + return yield* Effect.failCause(combined.cause).pipe(Effect.mapError((cause) => instanceError("restart", cause))) + media = runMediaDirectory(artifacts, ++mediaGeneration) + const recording = options.record ? recordingPaths(media) : undefined + yield* Ref.set( + state, + State.Running({ + recording, + tuis: new Map(), + pendingTuis: new Map(), + }), + ) + if (!options.scripted) { + const primary = yield* launchDefault(recording) + yield* Ref.update(state, (value) => ({ ...value, primary })) + yield* waitForDrive("both") + options.log?.("OpenCode ready") + } + return undefined + }), + ) + + const wait: Effect.Effect = Effect.suspend(() => + Effect.gen(function* () { + const current = yield* Ref.get(state) + if (current.primary === undefined) + return yield* Effect.fail(instanceError("wait", "no OpenCode process has been launched")) + const active = current.primary + const status = yield* active.exitCode.pipe(Effect.mapError((cause) => instanceError("wait", cause))) + const next = yield* Ref.get(state) + if (next.primary !== active && next._tag === "Running") return yield* wait + return status + }), + ) + + const stop = lock.withPermit( + Effect.gen(function* () { + const current = yield* Ref.get(state) + if (current._tag === "Stopped") return undefined + yield* Ref.set(state, State.Stopping(current)) + options.log?.("stopping OpenCode") + const processes = new Set(current.tuis.values()) + for (const process of current.pendingTuis.values()) processes.add(process) + if (current.server !== undefined) processes.add(current.server) + if (current.pendingServer !== undefined) processes.add(current.pendingServer) + if (!options.scripted && current.primary !== undefined) processes.add(current.primary) + const exits = yield* Effect.forEach(processes, (process) => Effect.exit(process.terminate), { + concurrency: "unbounded", + }) + const serviceExit = yield* Effect.exit(stopService(join(artifacts, "home", ".local", "state"))) + yield* Ref.set( + state, + State.Stopped({ + recording: current.recording, + tuis: new Map(), + pendingTuis: new Map(), + }), + ) + const combined = Exit.asVoidAll([...exits, serviceExit]) + if (Exit.isFailure(combined)) + return yield* Effect.failCause(combined.cause).pipe(Effect.mapError((cause) => instanceError("stop", cause))) + return undefined + }), + ) + yield* Effect.addFinalizer(() => + stop.pipe(Effect.catchCause((cause) => Effect.logError("OpenCode instance cleanup failed", cause))), + ) + + return { + artifacts, + logs, + visible: options.visible ?? false, + endpoints, + tools: toolController.controls, + toolNames: toolController.names, + recording: Ref.get(state).pipe(Effect.map((current) => current.recording)), + primary: Ref.get(state).pipe( + Effect.flatMap((current) => + current.primary === undefined + ? Effect.fail(instanceError("primary", "no OpenCode process has been launched")) + : Effect.succeed(current.primary), + ), + ), + launchServer, + killServer, + launchTui, + waitForDrive, + restart, + wait, + stop, + } satisfies Instance +}) + +function processDriveName(instance: string, role: string) { + const suffix = crypto.randomUUID().slice(0, 8) + return `${instance.slice(0, 36)}-${role.slice(0, 17)}-${suffix}` +} + +function recordingPaths(directory: string): RecordingPaths { + const id = crypto.randomUUID() + return { + timeline: join(directory, `recording-${id}.jsonl`), + video: join(directory, `recording-${id}.mp4`), + } +} + +export * as OpenCodeInstance from "./runtime.js" + +const distinctPort = (excluded: number): Effect.Effect => + freePort.pipe(Effect.flatMap((port) => (port === excluded ? distinctPort(excluded) : Effect.succeed(port)))) diff --git a/packages/drive/src/instance/service.ts b/packages/drive/src/instance/service.ts new file mode 100644 index 00000000000..72b045db5da --- /dev/null +++ b/packages/drive/src/instance/service.ts @@ -0,0 +1,53 @@ +import { join } from "node:path" +import * as Effect from "effect/Effect" +import * as Schedule from "effect/Schedule" +import { instanceError } from "./error.js" +import { isProcessAlive } from "./registry.js" + +/** + * Terminates any OpenCode managed services discovered through the instance's + * private state directory, escalating from SIGTERM to SIGKILL. + */ +export const stopService = Effect.fn("OpenCodeInstance.stopService")(function* (state: string) { + const files = [ + join(state, "opencode", "server.json"), + join(state, "opencode", "service-local.json"), + join(state, "opencode", "service.json"), + ] + const info = yield* Effect.tryPromise({ + try: () => + Promise.all( + files.map((file) => + Bun.file(file) + .json() + .catch(() => undefined), + ), + ), + catch: (cause) => instanceError("read service state", cause), + }) + yield* Effect.forEach( + info, + (value) => { + if (!isServiceInfo(value)) return Effect.void + return Effect.gen(function* () { + yield* Effect.sync(() => { + try { + process.kill(value.pid, "SIGTERM") + } catch { + return + } + }) + yield* Effect.suspend(() => (isProcessAlive(value.pid) ? Effect.fail(undefined) : Effect.void)).pipe( + Effect.retry(Schedule.spaced(25).pipe(Schedule.upTo({ times: 39 }))), + Effect.catch(() => Effect.void), + ) + if (isProcessAlive(value.pid)) yield* Effect.sync(() => process.kill(value.pid, "SIGKILL")) + }) + }, + { concurrency: "unbounded", discard: true }, + ) +}) + +function isServiceInfo(value: unknown): value is { readonly pid: number } { + return typeof value === "object" && value !== null && "pid" in value && typeof value.pid === "number" +} diff --git a/packages/drive/src/llm/index.ts b/packages/drive/src/llm/index.ts new file mode 100644 index 00000000000..444354d9956 --- /dev/null +++ b/packages/drive/src/llm/index.ts @@ -0,0 +1,100 @@ +import * as Schema from "effect/Schema" + +const NonNegativeMilliseconds = Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0)) + +const PositiveInteger = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)) + +const NonNegativeInteger = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)) + +export const StreamOptions = Schema.Struct({ + delay: Schema.optionalKey(NonNegativeMilliseconds), + chunkSize: Schema.optionalKey(PositiveInteger), +}) +export interface StreamOptions extends Schema.Schema.Type {} + +export const Text = Schema.Struct({ + type: Schema.Literal("text"), + text: Schema.String, + options: Schema.optionalKey(StreamOptions), +}) +export interface Text extends Schema.Schema.Type {} + +export const Reasoning = Schema.Struct({ + type: Schema.Literal("reasoning"), + text: Schema.String, + options: Schema.optionalKey(StreamOptions), +}) +export interface Reasoning extends Schema.Schema.Type {} + +export const Pause = Schema.Struct({ + type: Schema.Literal("pause"), + milliseconds: NonNegativeMilliseconds, +}) +export interface Pause extends Schema.Schema.Type {} + +export const ToolCall = Schema.Struct({ + type: Schema.Literal("toolCall"), + index: NonNegativeInteger, + id: Schema.String, + name: Schema.String, + input: Schema.Json, + options: Schema.optionalKey(StreamOptions), +}) +export interface ToolCall extends Schema.Schema.Type {} +export type ToolCallInput = Omit + +export const Raw = Schema.Struct({ + type: Schema.Literal("raw"), + chunk: Schema.Json, +}) +export interface Raw extends Schema.Schema.Type {} + +export const FinishReason = Schema.Literals(["stop", "tool-calls", "length", "content-filter"]) +export type FinishReason = Schema.Schema.Type + +export const Finish = Schema.Struct({ + type: Schema.Literal("finish"), + reason: Schema.optionalKey(FinishReason), +}) +export interface Finish extends Schema.Schema.Type {} + +export const Disconnect = Schema.Struct({ + type: Schema.Literal("disconnect"), +}) +export interface Disconnect extends Schema.Schema.Type {} + +export const Output = Schema.Union([Text, Reasoning, Pause, ToolCall, Raw, Finish, Disconnect]) +export type Output = Schema.Schema.Type + +export const text = (text: string, options?: StreamOptions): Text => + Text.make({ + type: "text", + text, + ...(options === undefined ? {} : { options }), + }) + +export const reasoning = (text: string, options?: StreamOptions): Reasoning => + Reasoning.make({ + type: "reasoning", + text, + ...(options === undefined ? {} : { options }), + }) + +export const pause = (milliseconds: number): Pause => Pause.make({ type: "pause", milliseconds }) + +export const toolCall = (call: ToolCallInput, options?: StreamOptions): ToolCall => + ToolCall.make({ + ...call, + type: "toolCall", + ...(options === undefined ? {} : { options }), + }) + +export const raw = (chunk: Schema.Json): Raw => Raw.make({ type: "raw", chunk }) + +export const finish = (reason?: FinishReason): Finish => + Finish.make({ + type: "finish", + ...(reason === undefined ? {} : { reason }), + }) + +export const disconnect = (): Disconnect => Disconnect.make({ type: "disconnect" }) diff --git a/packages/drive/src/llm/internal.ts b/packages/drive/src/llm/internal.ts new file mode 100644 index 00000000000..2ae93036fe2 --- /dev/null +++ b/packages/drive/src/llm/internal.ts @@ -0,0 +1,40 @@ +export function isTitleRequest(body: unknown) { + if (!isRecord(body) || !Array.isArray(body.messages)) return false + const first = body.messages.find(isMessageObject) + const firstContent = messageContent(first) + if (first?.role === "user" && firstContent?.startsWith("Generate a title for this conversation:")) return true + const system = body.messages.find((message) => isMessageObject(message) && message.role === "system") + return messageContent(system)?.startsWith("You are a title generator.") ?? false +} + +export function* chunkText(text: string, chunkSize: number) { + const characters = Array.from(text) + for (let index = 0; index < characters.length; ) { + const size = Math.max(1, chunkSize + Math.floor(Math.random() * 11) - 5) + const end = Math.min(characters.length, index + size) + yield characters.slice(index, end).join("") + index = end + } +} + +function isMessageObject(value: unknown) { + return isRecord(value) && typeof value.role === "string" +} + +function messageContent(message: unknown): string | undefined { + if (!isRecord(message)) return undefined + const content = message.content + if (typeof content === "string") return content + if (!Array.isArray(content)) return undefined + return content + .map((part) => { + if (typeof part === "string") return part + if (isRecord(part) && typeof part.text === "string") return part.text + return "" + }) + .join("") +} + +function isRecord(value: unknown): value is Readonly> { + return typeof value === "object" && value !== null && !Array.isArray(value) +} diff --git a/packages/drive/src/log.ts b/packages/drive/src/log.ts new file mode 100644 index 00000000000..c1c0ef0490a --- /dev/null +++ b/packages/drive/src/log.ts @@ -0,0 +1,72 @@ +import { appendFileSync, mkdirSync } from "node:fs" +import { readdir } from "node:fs/promises" +import { dirname, join } from "node:path" + +const prefix = "opencode-drive" +let currentLogFile = process.env.OPENCODE_DRIVE_LOG + +export function driveLogFile(artifacts: string) { + return join(artifacts, "logs", "opencode-drive.log") +} + +export async function opencodeLogFile(artifacts: string) { + const directory = join(artifacts, "logs", "opencode", "log") + const pattern = join(directory, "opencode*.log") + try { + const matches = (await readdir(directory)) + .filter((entry) => /^opencode.*\.log$/.test(entry)) + .sort() + .map((entry) => join(directory, entry)) + return matches.at(-1) ?? pattern + } catch { + return pattern + } +} + +export async function logReadyPaths(artifacts: string, options?: { readonly terminal?: boolean }) { + logSuccess(`opencode instance logs: ${await opencodeLogFile(artifacts)}`, options) + logSuccess(`current run script logs: ${driveLogFile(artifacts)}`, options) +} + +export function configureLogFile(artifacts: string) { + currentLogFile = driveLogFile(artifacts) + process.env.OPENCODE_DRIVE_LOG = currentLogFile + return currentLogFile +} + +export function logSuccess(message: string, options: { readonly terminal?: boolean } = {}) { + const line = `${prefix}: ${message}` + if (options.terminal !== false) console.error(process.stderr.isTTY ? `\x1b[32m${line}\x1b[0m` : line) + append("INFO", message) +} + +export function logError(message: string) { + const line = `error: ${message}` + console.error(process.stderr.isTTY ? `\x1b[31m${line}\x1b[0m` : line) + append("ERROR", message) + appendOwner(message) +} + +function appendOwner(message: string) { + const ownerLog = process.env.OPENCODE_DRIVE_OWNER_LOG + if (!ownerLog) return + appendBestEffort(ownerLog, `${message}\n`) +} + +export function recordLog(level: "INFO" | "ERROR", message: string) { + append(level, message) +} + +function append(level: "INFO" | "ERROR", message: string) { + if (!currentLogFile) return + appendBestEffort(currentLogFile, `[${new Date().toISOString()}] ${level} ${message}\n`) +} + +function appendBestEffort(path: string, contents: string) { + try { + mkdirSync(dirname(path), { recursive: true }) + appendFileSync(path, contents) + } catch { + // Logging must not change CLI behavior. + } +} diff --git a/packages/drive/src/project.ts b/packages/drive/src/project.ts new file mode 100644 index 00000000000..c853fb5b4b4 --- /dev/null +++ b/packages/drive/src/project.ts @@ -0,0 +1,46 @@ +import type * as Effect from "effect/Effect" +import * as Schema from "effect/Schema" + +export type JsonValue = + | null + | boolean + | number + | string + | ReadonlyArray + | { readonly [key: string]: JsonValue } + +export type JsonObject = { [key: string]: JsonValue } + +/** OpenCode's semantic project configuration, written to opencode.jsonc. */ +export interface OpenCodeConfig extends JsonObject {} + +/** OpenCode's semantic TUI configuration, written to tui.jsonc. */ +export interface OpenCodeTuiConfig extends JsonObject {} + +export class FileSystemError extends Schema.TaggedErrorClass()("FileSystemError", { + path: Schema.String, + cause: Schema.Defect(), + message: Schema.String, +}) {} + +export interface ProjectFileSystem { + /** Writes inside the isolated project and creates parent directories. */ + writeFile(path: string, contents: string | Uint8Array): Effect.Effect +} + +export interface SetupContext { + readonly fs: ProjectFileSystem + /** The current OpenCode config object. Mutate it to customize the run. */ + readonly config: OpenCodeConfig + /** The current OpenCode TUI config object. Mutate it to customize the run. */ + readonly tuiConfig: OpenCodeTuiConfig +} + +export interface Project { + /** Files written into the isolated project before setup runs. */ + readonly files?: Readonly> + /** Initializes the project as a Git repository and commits its pre-launch state. */ + readonly git?: boolean +} + +export type Setup = (context: SetupContext) => Effect.Effect diff --git a/packages/drive/src/recording/decode.ts b/packages/drive/src/recording/decode.ts new file mode 100644 index 00000000000..06af9ce9acb --- /dev/null +++ b/packages/drive/src/recording/decode.ts @@ -0,0 +1,109 @@ +import { createReadStream } from "node:fs" +import type { TimelineHeader, TimelineOutput, TimelineRecord, TimelineResize } from "./types.js" + +function fail(line: number, message: string): never { + throw new Error(`Invalid recording timeline at line ${line}: ${message}`) +} + +function isObject(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +function hasExactKeys(value: Record, expected: string[]) { + const actual = Object.keys(value).sort() + return actual.length === expected.length && actual.every((key, index) => key === expected[index]) +} + +function positiveInteger(value: unknown): value is number { + return typeof value === "number" && Number.isSafeInteger(value) && value > 0 +} + +function nonnegativeInteger(value: unknown): value is number { + return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 +} + +function canonicalBase64(value: string) { + if (value.length % 4 !== 0 || !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value)) { + return false + } + return Buffer.from(value, "base64").toString("base64") === value +} + +function parseRecord(text: string, line: number, first: boolean, previousAt: number): TimelineRecord { + let value: unknown + try { + value = JSON.parse(text) + } catch { + fail(line, "line is not valid JSON") + } + if (!isObject(value)) fail(line, "record must be an object") + + if (first) { + if (!hasExactKeys(value, ["cols", "encoding", "rows", "type", "version"])) fail(line, "invalid header fields") + if (value.type !== "header" || value.version !== 1 || value.encoding !== "base64") { + fail(line, "unsupported or missing header") + } + if (!positiveInteger(value.cols) || !positiveInteger(value.rows)) + fail(line, "cols and rows must be positive integers") + return { + type: "header", + version: 1, + cols: value.cols, + rows: value.rows, + encoding: "base64", + } satisfies TimelineHeader + } + + if (!nonnegativeInteger(value.at_ms)) fail(line, "at_ms must be a nonnegative integer") + if (value.at_ms < previousAt) fail(line, "event timestamps must be nondecreasing") + if (value.type === "output") { + if (!hasExactKeys(value, ["at_ms", "data", "type"])) fail(line, "invalid output fields") + if (typeof value.data !== "string" || !canonicalBase64(value.data)) fail(line, "data must be canonical base64") + return { type: "output", at_ms: value.at_ms, data: value.data } satisfies TimelineOutput + } + if (value.type === "resize") { + if (!hasExactKeys(value, ["at_ms", "cols", "rows", "type"])) fail(line, "invalid resize fields") + if (!positiveInteger(value.cols) || !positiveInteger(value.rows)) + fail(line, "cols and rows must be positive integers") + return { type: "resize", at_ms: value.at_ms, cols: value.cols, rows: value.rows } satisfies TimelineResize + } + return fail(line, "invalid event type") +} + +/** Decodes and validates a timeline without loading the complete file into memory. */ +export async function* decodeTimeline(path: string): AsyncGenerator { + const decoder = new TextDecoder("utf-8", { fatal: true }) + let buffered = "" + let line = 0 + let records = 0 + let previousAt = -1 + + const consume = (raw: string) => { + line++ + const text = raw.endsWith("\r") ? raw.slice(0, -1) : raw + if (text.length === 0) fail(line, "empty lines are not allowed") + const record = parseRecord(text, line, records === 0, previousAt) + records++ + if (record.type !== "header") previousAt = record.at_ms + return record + } + + try { + for await (const chunk of createReadStream(path)) { + buffered += decoder.decode(chunk, { stream: true }) + let newline: number + while ((newline = buffered.indexOf("\n")) !== -1) { + const raw = buffered.slice(0, newline) + buffered = buffered.slice(newline + 1) + yield consume(raw) + } + } + buffered += decoder.decode() + } catch (error) { + if (error instanceof TypeError) fail(line + 1, "file is not valid UTF-8") + throw error + } + + if (buffered.length > 0) yield consume(buffered) + if (records === 0) fail(1, "missing header") +} diff --git a/packages/drive/src/recording/encode.ts b/packages/drive/src/recording/encode.ts new file mode 100644 index 00000000000..e1c4c25c654 --- /dev/null +++ b/packages/drive/src/recording/encode.ts @@ -0,0 +1,98 @@ +import { createHash } from "node:crypto" +import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises" +import { tmpdir } from "node:os" +import { dirname, join } from "node:path" +import { runFfmpeg } from "./ffmpeg.js" +import { resolveFps } from "./frame-rate.js" + +export interface ImageFrame { + readonly atMs: number + readonly key: string + readonly render: () => Buffer | Promise +} + +export interface EncodeOptions { + readonly ffmpegPath?: string + readonly fps?: number + readonly onProgress?: (percent: number) => void + readonly signal?: AbortSignal +} + +export async function encodeFrames(frames: ReadonlyArray, output: string, options: EncodeOptions = {}) { + const final = frames.at(-1) + if (!final) throw new Error("recording has no frames") + const fps = resolveFps(options.fps) + const frameIntervalMs = 1000 / fps + await mkdir(dirname(output), { recursive: true }) + const directory = await mkdtemp(join(tmpdir(), "opencode-drive-recording-")) + const progress = progressReporter(options.onProgress) + try { + const unique = new Map() + const renderedFrames: string[] = [] + for (const [index, frame] of frames.entries()) { + options.signal?.throwIfAborted() + let rendered = unique.get(frame.key) + if (!rendered) { + const hash = createHash("sha256").update(frame.key).digest("hex") + rendered = `unique-${hash}.png` + await writeFile(join(directory, rendered), await frame.render(), { signal: options.signal }) + unique.set(frame.key, rendered) + } + renderedFrames.push(rendered) + progress(((index + 1) / frames.length) * 90) + } + const concat = join(directory, "frames.ffconcat") + const firstAtMs = frames[0]!.atMs + const lastFrameIndex = Math.max(0, Math.ceil((final.atMs - firstAtMs) / frameIntervalMs - 1e-9)) + const entries: string[] = [] + let sourceIndex = 0 + for (let index = 0; index <= lastFrameIndex; index++) { + const atMs = firstAtMs + index * frameIntervalMs + while (frames[sourceIndex + 1] && frames[sourceIndex + 1]!.atMs <= atMs + 1e-9) sourceIndex++ + entries.push(`file ${renderedFrames[sourceIndex]!}`) + } + await writeFile(concat, `ffconcat version 1.0\n${entries.join("\n")}\n`, { + signal: options.signal, + }) + await runFfmpeg( + options.ffmpegPath ?? "ffmpeg", + [ + "-y", + "-r", + String(fps), + "-safe", + "0", + "-f", + "concat", + "-i", + concat, + "-c:v", + "libx264", + "-crf", + "0", + "-pix_fmt", + "yuv420p", + "-movflags", + "+faststart", + "-fps_mode", + "cfr", + output, + ], + options.signal, + ) + progress(100) + } finally { + await rm(directory, { recursive: true, force: true }) + } +} + +function progressReporter(onProgress?: (percent: number) => void) { + let reported = 0 + return (percent: number) => { + const target = Math.min(100, Math.floor(percent / 10) * 10) + while (reported < target) { + reported += 10 + onProgress?.(reported) + } + } +} diff --git a/packages/drive/src/recording/export.ts b/packages/drive/src/recording/export.ts new file mode 100644 index 00000000000..7056bb3ce29 --- /dev/null +++ b/packages/drive/src/recording/export.ts @@ -0,0 +1,87 @@ +import { createHash } from "node:crypto" +import { mkdir, writeFile } from "node:fs/promises" +import { dirname, extname } from "node:path" +import { encodeFrames } from "./encode.js" +import { replayRecording, type ReplayOptions } from "./replay.js" +import { CellHeight, CellWidth, renderFrame } from "./render.js" + +export interface ExportRecordingOptions extends ReplayOptions { + ffmpegPath?: string + header?: string | ((atMs: number) => string) + onProgress?: (percent: number) => void + signal?: AbortSignal +} + +export interface ExportRecordingResult { + frames: number + durationMs: number + width: number + height: number +} + +export async function exportRecording( + timelinePath: string, + outputPath: string, + options: ExportRecordingOptions = {}, +): Promise { + options.signal?.throwIfAborted() + const frames = await replayRecording(timelinePath, options) + options.signal?.throwIfAborted() + const final = frames.at(-1)! + let cols = 0 + let rows = 0 + for (const sample of frames) { + cols = Math.max(cols, sample.frame.cols) + rows = Math.max(rows, sample.frame.rows) + } + const extension = extname(outputPath).toLowerCase() + const header = (atMs: number) => (typeof options.header === "function" ? options.header(atMs) : options.header) + const progress = progressReporter(options.onProgress) + await mkdir(dirname(outputPath), { recursive: true }) + + if (extension === ".png") { + await writeFile(outputPath, renderFrame(final.frame, { cols, rows, header: header(final.atMs) }), { + signal: options.signal, + }) + progress(100) + } else if (extension === ".mp4") { + const frameKeys = new WeakMap() + await encodeFrames( + frames.map((sample) => { + const label = header(sample.atMs) + let frameKey = frameKeys.get(sample.frame) + if (frameKey === undefined) { + frameKey = createHash("sha256").update(JSON.stringify(sample.frame)).digest("hex") + frameKeys.set(sample.frame, frameKey) + } + return { + atMs: sample.atMs, + key: JSON.stringify([frameKey, label]), + render: () => renderFrame(sample.frame, { cols, rows, header: label }), + } + }), + outputPath, + options, + ) + } else { + throw new Error(`Unsupported recording output extension: ${extension || "(none)"}`) + } + + return { + frames: frames.length, + durationMs: final.atMs, + width: cols * CellWidth, + height: rows * CellHeight + (options.header ? 40 : 0), + } +} + +function progressReporter(onProgress?: (percent: number) => void) { + let reported = 0 + return (percent: number) => { + const target = Math.min(100, Math.floor(percent / 10) * 10) + while (reported < target) { + reported += 10 + onProgress?.(reported) + } + } +} diff --git a/packages/drive/src/recording/ffmpeg.ts b/packages/drive/src/recording/ffmpeg.ts new file mode 100644 index 00000000000..ba3bc2233fd --- /dev/null +++ b/packages/drive/src/recording/ffmpeg.ts @@ -0,0 +1,24 @@ +import * as NodeServices from "@effect/platform-node/NodeServices" +import * as Effect from "effect/Effect" +import * as Process from "../instance/process.js" + +export const ffmpeg = Effect.fn("Recording.ffmpeg")(function* (command: string, args: string[]) { + const output = yield* Process.run([command, ...args], { + stdout: "ignore", + stderrLimit: 16_384, + }) + if (output.status !== 0) + return yield* Effect.fail(new Error(`ffmpeg exited with code ${output.status}: ${output.stderr.trim()}`)) + return undefined +}) + +export function runFfmpeg(command: string, args: string[], signal?: AbortSignal) { + return Effect.runPromise(ffmpeg(command, args).pipe(Effect.provide(NodeServices.layer)), { signal }).then( + () => { + if (signal?.aborted) throw signal.reason ?? new Error("recording export aborted") + }, + (cause) => { + throw signal?.aborted ? (signal.reason ?? new Error("recording export aborted")) : cause + }, + ) +} diff --git a/packages/drive/src/recording/finalize.ts b/packages/drive/src/recording/finalize.ts new file mode 100644 index 00000000000..548ef153de1 --- /dev/null +++ b/packages/drive/src/recording/finalize.ts @@ -0,0 +1,14 @@ +import type { ExportRecordingOptions } from "./export.js" + +export interface RecordingPaths { + readonly timeline: string + readonly video: string +} + +export async function finalizeRecording(timeline: string, expected: RecordingPaths, options?: ExportRecordingOptions) { + if (timeline !== expected.timeline) throw new Error(`OpenCode returned an unexpected recording path: ${timeline}`) + if (!(await Bun.file(timeline).exists())) throw new Error(`OpenCode recording timeline was not created: ${timeline}`) + const { exportRecording } = await import("./export.js") + await exportRecording(timeline, expected.video, options) + return expected.video +} diff --git a/packages/drive/src/recording/frame-rate.ts b/packages/drive/src/recording/frame-rate.ts new file mode 100644 index 00000000000..88f01b191cc --- /dev/null +++ b/packages/drive/src/recording/frame-rate.ts @@ -0,0 +1,6 @@ +const DefaultFps = 60 + +export function resolveFps(fps = DefaultFps) { + if (!Number.isFinite(fps) || fps <= 0) throw new Error("fps must be a positive finite number") + return fps +} diff --git a/packages/drive/src/recording/index.ts b/packages/drive/src/recording/index.ts new file mode 100644 index 00000000000..8c80a55deca --- /dev/null +++ b/packages/drive/src/recording/index.ts @@ -0,0 +1,14 @@ +export { decodeTimeline } from "./decode.js" +export { encodeFrames, type EncodeOptions, type ImageFrame } from "./encode.js" +export { exportRecording, type ExportRecordingOptions, type ExportRecordingResult } from "./export.js" +export { joinFrames, renderFrame } from "./render.js" +export { replayRecording, type ReplayOptions } from "./replay.js" +export type { + CapturedFrame, + CapturedLine, + CapturedSpan, + SampledFrame, + TimelineHeader, + TimelineOutput, + TimelineRecord, +} from "./types.js" diff --git a/packages/drive/src/recording/render.ts b/packages/drive/src/recording/render.ts new file mode 100644 index 00000000000..8fbda4b6cdc --- /dev/null +++ b/packages/drive/src/recording/render.ts @@ -0,0 +1,143 @@ +import { fileURLToPath } from "node:url" +import { GlobalFonts, createCanvas, loadImage } from "@napi-rs/canvas" +import { + CellHeight, + CellWidth, + DimAlpha, + FontSize, + StrikethroughOffset, + TextStyle, + UnderlineOffset, + baselineOffset, + drawBlockGlyph, +} from "../frame/index.js" +import type { CapturedFrame } from "./types.js" + +export { CellHeight, CellWidth } from "../frame/index.js" + +const FontFamily = "OpenCode Mono" +const SymbolFontFamily = "OpenCode Symbols" +const SymbolFontFamily2 = "OpenCode Symbols 2" +const MathFontFamily = "OpenCode Math" +const FontStack = `"${FontFamily}", "${SymbolFontFamily}", "${SymbolFontFamily2}", "${MathFontFamily}"` + +const fontOverride = process.env["OPENCODE_DRIVE_FONT"] +const fontFiles = fontOverride + ? fontOverride + .split(",") + .map((file) => file.trim()) + .filter(Boolean) + : [ + "CommitMono-400-Regular.otf", + "CommitMono-700-Regular.otf", + "CommitMono-400-Italic.otf", + "CommitMono-700-Italic.otf", + ].map((file) => fileURLToPath(new URL(`../../assets/fonts/commit-mono/${file}`, import.meta.url))) + +if (fontFiles.length === 0) throw new Error("OPENCODE_DRIVE_FONT must contain at least one font file") +for (const file of fontFiles) { + if (!GlobalFonts.registerFromPath(file, FontFamily)) throw new Error(`Failed to register capture font: ${file}`) +} +for (const [file, family] of [ + ["NotoSansSymbols.ttf", SymbolFontFamily], + ["NotoSansSymbols2-Regular.ttf", SymbolFontFamily2], + ["NotoSansMath-Regular.ttf", MathFontFamily], +] as const) { + const path = fileURLToPath(new URL(`../../assets/fonts/noto/${file}`, import.meta.url)) + if (!GlobalFonts.registerFromPath(path, family)) throw new Error(`Failed to register capture symbol font: ${path}`) +} + +function color(rgb: number, alpha = 1) { + return `rgba(${(rgb >> 16) & 255}, ${(rgb >> 8) & 255}, ${rgb & 255}, ${alpha})` +} + +export interface RenderFrameOptions { + readonly cols?: number + readonly rows?: number + readonly header?: string +} + +export function renderFrame(frame: CapturedFrame, options: RenderFrameOptions = {}): Buffer { + const cols = Math.max(frame.cols, options.cols ?? frame.cols) + const rows = Math.max(frame.rows, options.rows ?? frame.rows) + const headerHeight = options.header ? 40 : 0 + const canvas = createCanvas(cols * CellWidth, rows * CellHeight + headerHeight) + const context = canvas.getContext("2d") + context.fillStyle = "#080808" + context.fillRect(0, 0, canvas.width, canvas.height) + if (options.header) { + context.fillStyle = "#151515" + context.fillRect(0, 0, canvas.width, headerHeight) + context.font = `700 ${FontSize}px ${FontStack}` + context.fillStyle = "#d8d8d8" + context.textBaseline = "middle" + context.textAlign = "left" + context.fillText(options.header, 16, headerHeight / 2, canvas.width - 32) + } + context.textBaseline = "alphabetic" + context.textAlign = "center" + + frame.lines.forEach((line, row) => { + let column = 0 + for (const span of line.spans) { + const inverse = Boolean(span.attributes & TextStyle.inverse) + const hidden = Boolean(span.attributes & TextStyle.invisible) + const foreground = inverse ? span.bg : span.fg + const background = inverse ? span.fg : span.bg + const y = headerHeight + row * CellHeight + context.fillStyle = color(background) + context.fillRect(column * CellWidth, y, span.width * CellWidth, CellHeight) + if (hidden) { + column += span.width + continue + } + const italic = span.attributes & TextStyle.italic ? "italic " : "" + const weight = span.attributes & TextStyle.bold ? "700 " : "400 " + const font = `${italic}${weight}${FontSize}px ${FontStack}` + context.font = font + context.fillStyle = color(foreground, span.attributes & TextStyle.dim ? DimAlpha : 1) + const baseline = baselineOffset(context, font) + let remaining = span.width + for (const char of span.text) { + const cells = Math.min(Math.max(1, Bun.stringWidth(char)), remaining) + const x = column * CellWidth + if (!drawBlockGlyph(context, char, x, y, cells)) + context.fillText(char, x + (cells * CellWidth) / 2, y + baseline, cells * CellWidth) + if (span.attributes & TextStyle.underline) { + context.fillRect(x, y + UnderlineOffset, cells * CellWidth, 1) + } + if (span.attributes & TextStyle.strikethrough) { + context.fillRect(x, y + StrikethroughOffset, cells * CellWidth, 1) + } + column += cells + remaining -= cells + } + if (remaining > 0) { + column += remaining + } + } + }) + + if (frame.cursor.visible && frame.cursor.row >= 0 && frame.cursor.row < frame.rows) { + context.strokeStyle = "#d8d8d8" + context.lineWidth = 2 + context.strokeRect( + frame.cursor.col * CellWidth + 1, + headerHeight + frame.cursor.row * CellHeight + 1, + CellWidth - 2, + CellHeight - 2, + ) + } + return canvas.toBuffer("image/png") +} + +export async function joinFrames(left: Buffer, right: Buffer): Promise { + const [leftImage, rightImage] = await Promise.all([loadImage(left), loadImage(right)]) + if (leftImage.height !== rightImage.height) + throw new Error(`comparison recordings must have the same height: ${leftImage.height} !== ${rightImage.height}`) + const canvas = createCanvas(leftImage.width + rightImage.width, leftImage.height) + const context = canvas.getContext("2d") + context.drawImage(leftImage, 0, 0) + context.drawImage(rightImage, leftImage.width, 0) + return canvas.toBuffer("image/png") +} diff --git a/packages/drive/src/recording/replay.ts b/packages/drive/src/recording/replay.ts new file mode 100644 index 00000000000..297e5b40787 --- /dev/null +++ b/packages/drive/src/recording/replay.ts @@ -0,0 +1,99 @@ +import { decodeTimeline } from "./decode.js" +import { resolveFps } from "./frame-rate.js" +import { createTerminalParser, type TerminalParserFactory } from "./terminal.js" +import type { SampledFrame, TimelineHeader } from "./types.js" + +export interface ReplayOptions { + fps?: number + signal?: AbortSignal + startAtMs?: number + durationMs?: number +} + +interface InternalReplayOptions extends ReplayOptions { + terminalFactory?: TerminalParserFactory +} + +export async function replayRecording(path: string, options: ReplayOptions = {}): Promise { + return replay(path, options) +} + +export async function replay(path: string, options: InternalReplayOptions = {}): Promise { + options.signal?.throwIfAborted() + const interval = 1000 / resolveFps(options.fps) + if (options.startAtMs !== undefined && (!Number.isFinite(options.startAtMs) || options.startAtMs < 0)) + throw new Error("startAtMs must be a non-negative finite number") + if (options.durationMs !== undefined && (!Number.isFinite(options.durationMs) || options.durationMs < 0)) + throw new Error("durationMs must be a non-negative finite number") + const records = decodeTimeline(path)[Symbol.asyncIterator]() + const first = await records.next() + options.signal?.throwIfAborted() + if (first.done || first.value.type !== "header") throw new Error("Recording timeline is missing its header") + const header: TimelineHeader = first.value + const terminal = await (options.terminalFactory ?? createTerminalParser)(header.cols, header.rows) + options.signal?.throwIfAborted() + const frames: SampledFrame[] = [] + const startAt = options.startAtMs ?? 0 + const endAt = options.durationMs === undefined ? Number.POSITIVE_INFINITY : startAt + options.durationMs + let nextSample = startAt + let finalAt = 0 + let snapshot: SampledFrame["frame"] | undefined + let dirty = true + const currentSnapshot = () => { + if (dirty || !snapshot) { + snapshot = terminal.snapshot() + dirty = false + } + return snapshot + } + + for (;;) { + const next = await records.next() + options.signal?.throwIfAborted() + if (next.done) break + const event = next.value + if (event.type === "header") throw new Error("Recording timeline contains a second header") + if (event.at_ms > endAt) { + finalAt = endAt + break + } + while (nextSample < event.at_ms && nextSample <= endAt) { + frames.push({ atMs: nextSample, frame: currentSnapshot() }) + nextSample += interval + } + if (event.type === "output") { + const data = Buffer.from(event.data, "base64") + terminal.write(data) + if (data.length > 0) dirty = true + } else { + terminal.resize(event.cols, event.rows) + dirty = true + } + finalAt = event.at_ms + } + if (terminal.finish()) dirty = true + + const targetFinal = options.durationMs === undefined ? Math.max(startAt, finalAt) : endAt + while (nextSample <= targetFinal) { + frames.push({ atMs: nextSample, frame: currentSnapshot() }) + nextSample += interval + } + const final = frames.at(-1) + if (final && Math.abs(final.atMs - targetFinal) < 0.000_001) { + frames[frames.length - 1] = { ...final, atMs: targetFinal } + } else { + frames.push({ atMs: targetFinal, frame: currentSnapshot() }) + } + if (options.startAtMs !== undefined) { + return frames.map((sample) => ({ ...sample, atMs: sample.atMs - startAt })) + } + const firstVisible = frames.findIndex((sample) => + sample.frame.lines.some((line) => line.spans.some((span) => span.text.trim().length > 0)), + ) + if (firstVisible < 0) { + const final = frames.at(-1) + return final ? [{ ...final, atMs: 0 }] : [] + } + const start = frames[firstVisible]!.atMs + return frames.slice(firstVisible).map((sample) => ({ ...sample, atMs: sample.atMs - start })) +} diff --git a/packages/drive/src/recording/terminal.ts b/packages/drive/src/recording/terminal.ts new file mode 100644 index 00000000000..f5d51abc0c4 --- /dev/null +++ b/packages/drive/src/recording/terminal.ts @@ -0,0 +1,120 @@ +import type { TerminalCore } from "@wterm/core" +import { GhosttyCore } from "@wterm/ghostty" +import type { CapturedFrame, CapturedSpan } from "./types.js" + +const DefaultForeground = 0xd8d8d8 +const DefaultBackground = 0x080808 +const SyncStart = Buffer.from("\x1b[?2026h") +const SyncEnd = Buffer.from("\x1b[?2026l") + +export interface TerminalParser { + write(data: Uint8Array): void + finish(): boolean + resize(cols: number, rows: number): void + snapshot(): CapturedFrame +} + +export type TerminalParserFactory = (cols: number, rows: number) => Promise + +function characterWidth(char: string) { + return Math.max(1, Bun.stringWidth(char)) +} + +function capture(core: TerminalCore): CapturedFrame { + const cols = core.getCols() + const rows = core.getRows() + const lines = Array.from({ length: rows }, (_, row) => { + const spans: CapturedSpan[] = [] + for (let col = 0; col < cols; ) { + const cell = core.getCell(row, col) + const text = String.fromCodePoint(cell.char || 32) + const width = Math.min(characterWidth(text), cols - col) + const next = { + text, + width, + fg: cell.fgRgb ?? DefaultForeground, + bg: cell.bgRgb ?? DefaultBackground, + attributes: cell.flags, + } + const previous = spans.at(-1) + if (previous && previous.fg === next.fg && previous.bg === next.bg && previous.attributes === next.attributes) { + previous.text += next.text + previous.width += width + } else { + spans.push(next) + } + col += width + } + return { spans } + }) + return { cols, rows, cursor: core.getCursor(), lines } +} + +class GhosttyTerminal implements TerminalParser { + private synchronized = false + private stable?: CapturedFrame + private pending = Buffer.alloc(0) + + constructor(private readonly core: TerminalCore) {} + + write(data: Uint8Array) { + const input = this.pending.length ? Buffer.concat([this.pending, data]) : Buffer.from(data) + this.pending = Buffer.alloc(0) + let offset = 0 + while (offset < input.length) { + const start = input.indexOf(SyncStart, offset) + const end = input.indexOf(SyncEnd, offset) + const marker = start === -1 ? end : end === -1 ? start : Math.min(start, end) + if (marker === -1) { + const keep = partialMarkerLength(input.subarray(offset)) + const boundary = input.length - keep + if (boundary > offset) this.core.writeRaw(input.subarray(offset, boundary)) + if (keep) this.pending = input.subarray(boundary) + return + } + if (marker > offset) this.core.writeRaw(input.subarray(offset, marker)) + if (marker === start) { + if (!this.synchronized) this.stable = capture(this.core) + this.synchronized = true + this.core.writeRaw(SyncStart) + offset = marker + SyncStart.length + } else { + this.core.writeRaw(SyncEnd) + this.synchronized = false + this.stable = undefined + offset = marker + SyncEnd.length + } + } + } + + finish() { + if (!this.pending.length) return false + this.core.writeRaw(this.pending) + this.pending = Buffer.alloc(0) + return true + } + + resize(cols: number, rows: number) { + this.core.resize(cols, rows) + if (this.synchronized) this.stable = capture(this.core) + } + + snapshot() { + return this.synchronized && this.stable ? structuredClone(this.stable) : capture(this.core) + } +} + +function partialMarkerLength(input: Uint8Array) { + const limit = Math.min(input.length, Math.max(SyncStart.length, SyncEnd.length) - 1) + for (let length = limit; length > 0; length--) { + const suffix = input.subarray(input.length - length) + if (SyncStart.subarray(0, length).equals(suffix) || SyncEnd.subarray(0, length).equals(suffix)) return length + } + return 0 +} + +export const createTerminalParser: TerminalParserFactory = async (cols, rows) => { + const core: TerminalCore = await GhosttyCore.load() + core.init(cols, rows) + return new GhosttyTerminal(core) +} diff --git a/packages/drive/src/recording/types.ts b/packages/drive/src/recording/types.ts new file mode 100644 index 00000000000..7289357dec5 --- /dev/null +++ b/packages/drive/src/recording/types.ts @@ -0,0 +1,48 @@ +export { TextStyle } from "../frame/index.js" + +export interface CapturedSpan { + text: string + width: number + fg: number + bg: number + attributes: number +} + +export interface CapturedLine { + spans: CapturedSpan[] +} + +export interface CapturedFrame { + cols: number + rows: number + cursor: { row: number; col: number; visible: boolean } + lines: CapturedLine[] +} + +export interface SampledFrame { + atMs: number + frame: CapturedFrame +} + +export interface TimelineHeader { + type: "header" + version: 1 + cols: number + rows: number + encoding: "base64" +} + +export interface TimelineOutput { + type: "output" + at_ms: number + data: string +} + +export interface TimelineResize { + type: "resize" + at_ms: number + cols: number + rows: number +} + +export type TimelineRecord = TimelineHeader | TimelineOutput | TimelineResize diff --git a/packages/drive/src/script/errors.ts b/packages/drive/src/script/errors.ts new file mode 100644 index 00000000000..1b9742ad62f --- /dev/null +++ b/packages/drive/src/script/errors.ts @@ -0,0 +1,19 @@ +import { RpcClientError as RpcClientErrors } from "effect/unstable/rpc" + +export const RpcClientError = RpcClientErrors.RpcClientError +export type RpcClientError = RpcClientErrors.RpcClientError + +export { FileSystemError } from "../project.js" + +export { OpenCodeDriverError } from "../driver/error.js" +export { LlmControllerError, LlmModeError } from "../driver/llm-controller.js" +export { + UiCapabilityError, + UiElementAmbiguousError, + UiNodeAmbiguousError, + UiPredicateError, + UiTimeoutError, + UiWaitOptionsError, +} from "../driver/ui.js" +export { SimulationCompatibilityError } from "../simulation/connector.js" +export { SimulationRequestError } from "@opencode-ai/protocol/simulation" diff --git a/packages/drive/src/script/filesystem.ts b/packages/drive/src/script/filesystem.ts new file mode 100644 index 00000000000..87f8a14265c --- /dev/null +++ b/packages/drive/src/script/filesystem.ts @@ -0,0 +1,97 @@ +import { lstat, mkdir, writeFile } from "node:fs/promises" +import { dirname, isAbsolute, relative, resolve, sep } from "node:path" +import * as Effect from "effect/Effect" +import { FileSystemError, type ProjectFileSystem } from "../project.js" + +interface FileSystemOptions { + readonly git?: boolean +} + +export function createScriptFileSystem(directory: string, options: FileSystemOptions = {}): ProjectFileSystem { + const root = resolve(directory) + return { + writeFile: (path, contents) => + Effect.tryPromise({ + try: async () => { + const destination = await resolveFile(root, path, options) + await mkdir(dirname(destination), { recursive: true }) + await writeFile(destination, contents) + }, + catch: (cause) => + new FileSystemError({ + path, + cause, + message: cause instanceof Error ? cause.message : String(cause), + }), + }), + } +} + +export async function writeScriptFiles( + directory: string, + files: Readonly>, + options: FileSystemOptions = {}, +) { + const root = resolve(directory) + const entries = await Promise.all( + Object.entries(files).map(async ([path, contents]) => ({ + contents, + destination: await resolveFile(root, path, options), + })), + ) + const destinations = new Set() + for (const entry of entries) { + const destination = entry.destination.toLowerCase() + if (destinations.has(destination)) throw new Error("project.files paths must resolve to unique files") + destinations.add(destination) + } + for (const destination of destinations) { + let parent = dirname(destination) + while (parent !== dirname(parent)) { + if (destinations.has(parent)) throw new Error("project.files paths must not contain file and directory conflicts") + parent = dirname(parent) + } + } + await Promise.all( + entries.map(async ({ contents, destination }) => { + await mkdir(dirname(destination), { recursive: true }) + await writeFile(destination, contents) + }), + ) +} + +async function resolveFile(root: string, path: string, options: FileSystemOptions) { + if (isAbsolute(path)) throw new Error("fs.writeFile path must be relative") + const destination = resolve(root, path) + const resolved = relative(root, destination) + if (resolved === "") throw new Error("fs.writeFile path must name a file") + if (resolved === ".." || resolved.startsWith(`..${sep}`)) + throw new Error("fs.writeFile path must stay inside the simulated project") + if (options.git && resolved.split(sep)[0]?.toLowerCase() === ".git") + throw new Error("fs.writeFile path must not modify Git metadata") + await rejectSymlinks(root, destination) + const stats = await lstat(destination).catch((error: unknown) => { + if (isMissing(error)) return undefined + throw error + }) + if (stats?.isDirectory()) throw new Error("fs.writeFile path must not be a directory") + return destination +} + +async function rejectSymlinks(root: string, destination: string) { + const parts = relative(root, destination).split(sep) + let current = root + for (const part of parts) { + current = resolve(current, part) + const stats = await lstat(current).catch((error: unknown) => { + if (isMissing(error)) return undefined + throw error + }) + if (stats === undefined) return + if (stats.isSymbolicLink()) throw new Error("fs.writeFile path must not contain symbolic links") + } +} + +function isMissing(error: unknown): error is NodeJS.ErrnoException { + return error instanceof Error && "code" in error && error.code === "ENOENT" +} diff --git a/packages/drive/src/script/index.ts b/packages/drive/src/script/index.ts new file mode 100644 index 00000000000..9dc9d385172 --- /dev/null +++ b/packages/drive/src/script/index.ts @@ -0,0 +1,18 @@ +import type { + AutomaticScriptDefinition, + ManualScriptDefinition, + ScriptDefinition, + ScriptDefinitionInput, +} from "./types.js" + +type Defined = Definition & { + readonly kind: "opencode-drive/script" +} + +export function defineScript(script: ManualScriptDefinition): Defined +export function defineScript(script: AutomaticScriptDefinition): Defined +export function defineScript(script: ScriptDefinitionInput): ScriptDefinition { + return { ...script, kind: "opencode-drive/script" } +} + +export type * from "./types.js" diff --git a/packages/drive/src/script/project.ts b/packages/drive/src/script/project.ts new file mode 100644 index 00000000000..3bea0034d63 --- /dev/null +++ b/packages/drive/src/script/project.ts @@ -0,0 +1,72 @@ +import { lstat, readdir, rm } from "node:fs/promises" +import { join } from "node:path" +import * as NodeServices from "@effect/platform-node/NodeServices" +import * as Effect from "effect/Effect" +import * as Process from "../instance/process.js" +import { writeScriptFiles } from "./filesystem.js" +import type { Project } from "./types.js" + +export async function initializeScriptProject(root: string, project: Project) { + if (project.git) await assertGitPlaceholder(root) + await writeScriptFiles(root, project.files ?? {}, { git: true }) +} + +export async function commitScriptProject(root: string) { + await assertGitPlaceholder(root) + const metadata = join(root, ".git") + await rm(metadata, { recursive: true, force: true }) + await git(root, ["init", "--quiet", "--initial-branch=main"]) + await git(root, ["add", "--force", "--all"]) + await git(root, [ + "-c", + "user.name=OpenCode Drive", + "-c", + "user.email=drive@opencode.ai", + "commit", + "--quiet", + "--message=Initial commit", + ]) +} + +async function assertGitPlaceholder(root: string) { + if (await hasGitMetadata(root)) throw new Error("project.git cannot replace existing Git metadata") +} + +export async function hasGitMetadata(root: string) { + const metadata = join(root, ".git") + const stats = await lstat(metadata).catch((error: unknown) => { + if (isMissing(error)) return undefined + throw error + }) + if (!stats) return false + return !stats.isDirectory() || (await readdir(metadata)).length > 0 +} + +async function git(cwd: string, args: ReadonlyArray) { + const output = await Effect.runPromise( + Process.run(["git", ...args], { + cwd, + env: { + ...stripGitEnvironment(Bun.env), + GIT_CONFIG_GLOBAL: "/dev/null", + GIT_CONFIG_NOSYSTEM: "1", + GIT_AUTHOR_DATE: "2000-01-01T00:00:00Z", + GIT_COMMITTER_DATE: "2000-01-01T00:00:00Z", + }, + }).pipe(Effect.provide(NodeServices.layer)), + ) + if (output.status === 0) return + throw new Error(`git ${args[0]} failed: ${output.stderr.trim()}`) +} + +export function stripGitEnvironment(env: Readonly>) { + return Object.fromEntries( + Object.entries(env).filter( + (entry): entry is [string, string] => entry[1] !== undefined && !entry[0].startsWith("GIT_"), + ), + ) +} + +function isMissing(error: unknown): error is NodeJS.ErrnoException { + return error instanceof Error && "code" in error && error.code === "ENOENT" +} diff --git a/packages/drive/src/script/tooling.ts b/packages/drive/src/script/tooling.ts new file mode 100644 index 00000000000..170ad6ed772 --- /dev/null +++ b/packages/drive/src/script/tooling.ts @@ -0,0 +1,158 @@ +import { mkdir, rm, symlink } from "node:fs/promises" +import { createRequire } from "node:module" +import { dirname, join, resolve } from "node:path" +import { fileURLToPath } from "node:url" + +const packageRoot = resolve(fileURLToPath(new URL("../..", import.meta.url))) +const requireFromDrive = createRequire(join(packageRoot, "package.json")) +const effectRoot = dirname(requireFromDrive.resolve("effect/package.json")) +const compilerRoot = dirname(requireFromDrive.resolve("@typescript/native-preview/package.json")) +const bunTypesRoot = dirname(requireFromDrive.resolve("@types/bun/package.json")) +const requireFromBunTypes = createRequire(join(bunTypesRoot, "package.json")) +const bunRuntimeTypesRoot = dirname(requireFromBunTypes.resolve("bun-types/package.json")) + +type Contract = "program" | "script" + +export async function prepareScriptModule(artifacts: string, script: string) { + const source = await resolveSource(script, "script") + const root = await prepareRuntimeRoot(artifacts) + return compileScript(root, source) +} + +export async function prepareProgram(artifacts: string, script: string) { + const source = await resolveSource(script, "program") + const root = await prepareRuntimeRoot(artifacts) + await typecheck(root, source, "program") + const program = await compileScript(root, source) + const runner = join(root, "program-runner.ts") + await Bun.write( + runner, + [ + 'import * as Effect from "effect/Effect"', + `import program from ${JSON.stringify(program)}`, + 'if (!Effect.isEffect(program)) throw new Error("program must default-export a fully provided Effect")', + "await Effect.runPromise(program)", + "", + ].join("\n"), + ) + return runner +} + +export async function checkScript(artifacts: string, script: string) { + const source = await resolveSource(script, "script") + const root = await prepareRuntimeRoot(artifacts) + await typecheck(root, source, "script") +} + +async function resolveSource(script: string, contract: Contract) { + const source = resolve(script) + if (!(await Bun.file(source).exists())) throw new Error(`${contract} not found: ${source}`) + return source +} + +async function compileScript(root: string, source: string) { + const entry = join(root, "script-entry.ts") + const output = join(root, "compiled") + await Bun.write(entry, `export { default } from ${JSON.stringify(source)}\n`) + const result = await Bun.build({ + entrypoints: [entry], + outdir: output, + target: "bun", + packages: "bundle", + external: ["opencode-drive", "opencode-drive/*", "effect", "effect/*"], + sourcemap: "inline", + }) + if (!result.success) { + const diagnostics = result.logs.map((log) => log.message).join("\n") + throw new Error(diagnostics || `failed to compile script: ${source}`) + } + const file = result.outputs.find((item) => item.kind === "entry-point")?.path + if (!file) throw new Error(`script compilation produced no entry point: ${source}`) + return file +} + +async function typecheck(root: string, source: string, contract: Contract) { + const contractFile = join(root, `${contract}-contract.ts`) + const tsconfig = join(root, `${contract}-tsconfig.json`) + await Bun.write( + contractFile, + contract === "program" + ? [ + 'import type * as Effect from "effect/Effect"', + `import program from ${JSON.stringify(source)}`, + "const checked: Effect.Effect = program", + "void checked", + "", + ].join("\n") + : [ + 'import type { ScriptDefinition } from "opencode-drive/script"', + `import script from ${JSON.stringify(source)}`, + "const checked: ScriptDefinition = script", + "void checked", + "", + ].join("\n"), + ) + await Bun.write( + tsconfig, + `${JSON.stringify( + { + compilerOptions: { + strict: true, + noEmit: true, + allowJs: true, + checkJs: true, + lib: ["ESNext"], + target: "ESNext", + module: "Preserve", + moduleResolution: "Bundler", + allowImportingTsExtensions: true, + skipLibCheck: true, + types: ["bun"], + paths: { + "opencode-drive": [join(packageRoot, "src", "index.ts")], + "opencode-drive/*": [join(packageRoot, "src", "*")], + effect: [join(effectRoot, "dist", "index.d.ts")], + "effect/*": [join(effectRoot, "dist", "*.d.ts")], + }, + }, + files: [contractFile], + }, + undefined, + 2, + )}\n`, + ) + const capture = contract === "script" + const child = Bun.spawn([process.execPath, join(compilerRoot, "bin", "tsgo.js"), "-p", tsconfig], { + cwd: root, + stdin: "ignore", + stdout: capture ? "pipe" : "inherit", + stderr: capture ? "pipe" : "inherit", + }) + const [status, stdout, stderr] = await Promise.all([ + child.exited, + capture ? new Response(child.stdout).text() : "", + capture ? new Response(child.stderr).text() : "", + ]) + if (status === 0) return + const diagnostics = [stdout, stderr] + .map((value) => value.trim()) + .filter(Boolean) + .join("\n") + throw new Error(diagnostics || `${contract} type check failed with status ${status}`) +} + +async function prepareRuntimeRoot(artifacts: string) { + const root = join(resolve(artifacts), "script-runtime") + const modules = join(root, "node_modules") + await rm(root, { recursive: true, force: true }) + await mkdir(join(modules, "@types"), { recursive: true }) + await Promise.all([ + symlink(packageRoot, join(modules, "opencode-drive"), linkType), + symlink(effectRoot, join(modules, "effect"), linkType), + symlink(bunTypesRoot, join(modules, "@types", "bun"), linkType), + symlink(bunRuntimeTypesRoot, join(modules, "bun-types"), linkType), + ]) + return root +} + +const linkType = process.platform === "win32" ? "junction" : "dir" diff --git a/packages/drive/src/script/types.ts b/packages/drive/src/script/types.ts new file mode 100644 index 00000000000..694f56a71a4 --- /dev/null +++ b/packages/drive/src/script/types.ts @@ -0,0 +1,83 @@ +import type * as Effect from "effect/Effect" +import type * as Tool from "../tool/index.js" +import type * as OpenCodeUi from "../driver/ui.js" +import type * as OpenCodeTui from "../driver/client.js" +import type { Llm } from "../driver/llm.js" +import type * as OpenCodeServer from "../driver/server.js" +import type * as OpenCodeSdk from "../driver/opencode.js" +import type { OpenCodeConfig, OpenCodeTuiConfig, Project, ProjectFileSystem, Setup } from "../project.js" +export type * from "../project.js" +export type ScriptServerLaunchError = Effect.Error> +export type ScriptServerKillError = Effect.Error> + +export interface ScriptServer { + /** Launches the one shared OpenCode server for this script. */ + launch(): Effect.Effect + /** Stops the shared server. It may be launched again afterward. */ + kill(): Effect.Effect +} + +export interface ScriptContext { + /** Generated SDK client connected to this script's private OpenCode service. */ + readonly opencode: OpenCodeSdk.OpenCode + readonly fs: ProjectFileSystem + readonly tui: OpenCodeTui.Tui + /** Convenience alias for the primary TUI's UI. */ + readonly ui: OpenCodeUi.Ui + readonly tuis: OpenCodeTui.Tuis + readonly server: ScriptServer + readonly llm: Llm + /** Runtime controls for tools declared by name on the script. */ + readonly tools: Tool.Controls + readonly artifacts: string +} + +export interface ManualScriptContext extends Omit { + readonly tui: null + readonly ui: null +} + +export type ScriptRun = (context: ScriptContext) => Effect.Effect +export type ManualScriptRun = (context: ManualScriptContext) => Effect.Effect + +export interface AutomaticScriptDefinition { + /** Declares the isolated project OpenCode runs against. */ + readonly project?: Project + /** OpenCode configuration merged over project fixture configuration. */ + readonly config?: OpenCodeConfig + /** OpenCode TUI configuration merged over project fixture configuration. */ + readonly tuiConfig?: OpenCodeTuiConfig + /** Runs once before OpenCode starts. */ + readonly setup?: Setup + /** Declares runtime-controlled tool names or fixed replacements before OpenCode starts. */ + readonly tools?: Tool.Configuration + /** Configures the automatically launched primary TUI. */ + readonly tui?: OpenCodeTui.TuiOptions + /** Runs after the UI and LLM connections are ready, and again after restart. */ + readonly run: ScriptRun +} + +export interface ManualScriptDefinition { + /** The server and every TUI are launched explicitly by the script. */ + readonly launch: "manual" + /** Declares the isolated project OpenCode runs against. */ + readonly project?: Project + /** OpenCode configuration merged over project fixture configuration. */ + readonly config?: OpenCodeConfig + /** OpenCode TUI configuration merged over project fixture configuration. */ + readonly tuiConfig?: OpenCodeTuiConfig + /** Runs once before OpenCode starts. */ + readonly setup?: Setup + /** Declares runtime-controlled tool names or fixed replacements before OpenCode starts. */ + readonly tools?: Tool.Configuration + /** Defaults for TUIs launched by the script. */ + readonly tui?: OpenCodeTui.TuiOptions + /** Runs after the shared service and LLM connection are ready. */ + readonly run: ManualScriptRun +} + +export type ScriptDefinitionInput = AutomaticScriptDefinition | ManualScriptDefinition + +export type ScriptDefinition = ScriptDefinitionInput & { + readonly kind: "opencode-drive/script" +} diff --git a/packages/drive/src/simulation/connector.ts b/packages/drive/src/simulation/connector.ts new file mode 100644 index 00000000000..040fc5d66ae --- /dev/null +++ b/packages/drive/src/simulation/connector.ts @@ -0,0 +1,349 @@ +import * as Context from "effect/Context" +import * as Cause from "effect/Cause" +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import * as Layer from "effect/Layer" +import * as Option from "effect/Option" +import * as Queue from "effect/Queue" +import * as Schema from "effect/Schema" +import * as Stream from "effect/Stream" +import { RpcClient, RpcClientError } from "effect/unstable/rpc" +import { + Backend as BackendProtocol, + BackendRpcs, + Frontend as FrontendProtocol, + Handshake, + SimulationRequestError, + UiRpcs, +} from "@opencode-ai/protocol/simulation" +import packageJson from "../../package.json" with { type: "json" } +import * as OpenCodeRpcProtocol from "./opencode-protocol.js" + +export class SimulationConnectionError extends Schema.TaggedErrorClass()( + "SimulationConnectionError", + { + endpoint: Schema.String, + operation: Schema.String, + message: Schema.String, + }, +) {} + +export class SimulationCompatibilityError extends Schema.TaggedErrorClass()( + "SimulationCompatibilityError", + { + endpoint: Schema.String, + role: Handshake.EndpointRole, + message: Schema.String, + }, +) {} + +export class SimulationEventStreamError extends Schema.TaggedErrorClass()( + "SimulationEventStreamError", + { + endpoint: Schema.String, + message: Schema.String, + }, +) {} + +export const EndpointCompatibility = Schema.TaggedUnion({ + Negotiated: { + endpoint: Schema.String, + role: Handshake.EndpointRole, + protocolVersion: Handshake.ProtocolVersion, + server: Handshake.Identity, + capabilities: Schema.Array(Handshake.Capability), + }, + Legacy: { + endpoint: Schema.String, + role: Handshake.EndpointRole, + profile: Schema.Literal("opencode-simulation-jsonrpc-v0"), + reason: Schema.String, + }, +}) +export type EndpointCompatibility = typeof EndpointCompatibility.Type + +export function supportsCapability(compatibility: EndpointCompatibility, capability: Handshake.Capability) { + return compatibility._tag === "Negotiated" && compatibility.capabilities.includes(capability) +} + +export type CompatibilityPolicy = "required" | "preferred" + +export interface Options { + readonly connectTimeout?: number + readonly requestTimeout?: number + readonly attach?: boolean + readonly compatibility?: CompatibilityPolicy +} + +export type UiClient = RpcClient.FromGroup +export type BackendClient = RpcClient.FromGroup + +export interface UiConnection { + readonly endpoint: string + readonly rpc: UiClient + readonly compatibility: EndpointCompatibility +} + +export type ToolEvent = + | { readonly type: "invocation"; readonly invocation: BackendProtocol.ToolInvocation } + | { readonly type: "cancellation"; readonly cancellation: BackendProtocol.ToolCancellation } + | { readonly type: "barrier"; readonly completed: Deferred.Deferred } + +export interface BackendConnection { + readonly endpoint: string + readonly rpc: BackendClient + readonly compatibility: EndpointCompatibility + readonly requests: Stream.Stream + readonly toolEvents: Stream.Stream + readonly flushToolEvents: () => Effect.Effect + readonly closed: Effect.Effect + readonly attach: () => Effect.Effect< + { readonly attached: true }, + SimulationConnectionError | RpcClientError.RpcClientError | SimulationRequestError + > + readonly attachTools: ( + tools: ReadonlyArray, + ) => Effect.Effect< + { readonly attached: true }, + SimulationCompatibilityError | SimulationConnectionError | RpcClientError.RpcClientError | SimulationRequestError + > + readonly updateTool: ( + params: BackendProtocol.ToolUpdateParams, + ) => Effect.Effect< + { readonly ok: true }, + SimulationConnectionError | RpcClientError.RpcClientError | SimulationRequestError + > + readonly finishTool: ( + params: BackendProtocol.ToolFinishParams, + ) => Effect.Effect< + { readonly ok: true }, + SimulationConnectionError | RpcClientError.RpcClientError | SimulationRequestError + > + readonly failTool: ( + params: BackendProtocol.ToolFailParams, + ) => Effect.Effect< + { readonly ok: true }, + SimulationConnectionError | RpcClientError.RpcClientError | SimulationRequestError + > +} + +const toolCapabilities = [ + "tool.attach", + "tool.update", + "tool.finish", + "tool.fail", + "tool.invocation", + "tool.cancel", +] as const satisfies ReadonlyArray +const toolCapabilitySet: ReadonlySet = new Set(toolCapabilities) + +export const ui = Effect.fn("SimulationConnector.ui")(function* (endpoint: string, options?: Options) { + const protocol = yield* OpenCodeRpcProtocol.make(endpoint, { + connectTimeout: options?.connectTimeout, + firstWireId: 0, + }) + const rpc = yield* RpcClient.make(UiRpcs).pipe(Effect.provideService(RpcClient.Protocol, protocol)) + const required = FrontendProtocol.Capabilities.filter( + (capability) => capability !== "ui.snapshot" && capability !== "ui.click.semantic", + ) + const compatibility = yield* negotiate( + endpoint, + "ui", + required, + rpc["simulation.handshake"]({ + client: { name: "opencode-drive", version: packageJson.version }, + expectedRole: "ui", + offeredVersions: [1], + requiredCapabilities: required, + optionalCapabilities: ["ui.snapshot", "ui.click.semantic"], + }), + options?.compatibility, + ) + return { endpoint, rpc, compatibility } satisfies UiConnection +}) + +export const backend = Effect.fn("SimulationConnector.backend")(function* (endpoint: string, options?: Options) { + const requests = yield* Queue.unbounded() + const toolEvents = yield* Queue.unbounded() + const closed = yield* Deferred.make() + const close = Effect.all( + [Deferred.succeed(closed, undefined), Queue.shutdown(requests), Queue.shutdown(toolEvents)], + { discard: true }, + ) + yield* Effect.addFinalizer(() => close) + const protocol = yield* OpenCodeRpcProtocol.make(endpoint, { + connectTimeout: options?.connectTimeout, + firstWireId: 0, + onClose: () => close, + onNotification: ({ method, params }) => { + switch (method) { + case "llm.request": + return Effect.matchEffect(Schema.decodeUnknownEffect(BackendProtocol.ProviderInvocation)(params), { + onFailure: (error) => Queue.fail(requests, error).pipe(Effect.asVoid), + onSuccess: (request) => Queue.offer(requests, request).pipe(Effect.asVoid), + }) + case "tool.invocation": + return Effect.matchEffect(Schema.decodeUnknownEffect(BackendProtocol.ToolInvocation)(params), { + onFailure: (error) => Queue.fail(toolEvents, error).pipe(Effect.asVoid), + onSuccess: (invocation) => Queue.offer(toolEvents, { type: "invocation", invocation }).pipe(Effect.asVoid), + }) + case "tool.cancel": + return Effect.matchEffect(Schema.decodeUnknownEffect(BackendProtocol.ToolCancellation)(params), { + onFailure: (error) => Queue.fail(toolEvents, error).pipe(Effect.asVoid), + onSuccess: (cancellation) => + Queue.offer(toolEvents, { type: "cancellation", cancellation }).pipe(Effect.asVoid), + }) + default: + return Effect.void + } + }, + }) + const rpc = yield* RpcClient.make(BackendRpcs).pipe(Effect.provideService(RpcClient.Protocol, protocol)) + const required = BackendProtocol.Capabilities.filter( + (capability) => + capability !== "llm.pending" && capability !== "llm.tool-input-delta" && !toolCapabilitySet.has(capability), + ) + const compatibility = yield* negotiate( + endpoint, + "backend", + required, + rpc["simulation.handshake"]({ + client: { name: "opencode-drive", version: packageJson.version }, + expectedRole: "backend", + offeredVersions: [1], + requiredCapabilities: required, + optionalCapabilities: ["llm.pending", "llm.tool-input-delta", ...toolCapabilities], + }), + options?.compatibility, + ) + const attach = Effect.fn("SimulationConnector.attach")(() => + rpc["llm.attach"]().pipe( + Effect.timeoutOrElse({ + duration: options?.requestTimeout ?? 30_000, + orElse: () => + Effect.fail( + new SimulationConnectionError({ + endpoint, + operation: "llm.attach", + message: `llm.attach timed out after ${options?.requestTimeout ?? 30_000}ms`, + }), + ), + }), + ), + ) + if (options?.attach !== false) yield* attach() + const withTimeout = (operation: string, effect: Effect.Effect) => + effect.pipe( + Effect.timeoutOrElse({ + duration: options?.requestTimeout ?? 30_000, + orElse: () => + Effect.fail( + new SimulationConnectionError({ + endpoint, + operation, + message: `${operation} timed out after ${options?.requestTimeout ?? 30_000}ms`, + }), + ), + }), + ) + const attachTools: BackendConnection["attachTools"] = (tools) => { + const missing = toolCapabilities.filter((capability) => !supportsCapability(compatibility, capability)) + if (missing.length > 0) + return Effect.fail( + new SimulationCompatibilityError({ + endpoint, + role: "backend", + message: `Simulation endpoint is missing required capabilities: ${missing.join(", ")}`, + }), + ) + return withTimeout("tool.attach", rpc["tool.attach"]({ tools })) + } + const updateTool: BackendConnection["updateTool"] = (params) => withTimeout("tool.update", rpc["tool.update"](params)) + const finishTool: BackendConnection["finishTool"] = (params) => withTimeout("tool.finish", rpc["tool.finish"](params)) + const failTool: BackendConnection["failTool"] = (params) => withTimeout("tool.fail", rpc["tool.fail"](params)) + const flushToolEvents = Effect.fn("SimulationConnector.flushToolEvents")(function* () { + const completed = yield* Deferred.make() + const offered = yield* Queue.offer(toolEvents, { type: "barrier", completed }) + if (!offered) + return yield* Effect.fail( + new SimulationEventStreamError({ + endpoint, + message: "Dynamic tool event stream is unavailable", + }), + ) + yield* Deferred.await(completed) + return undefined + }) + return { + endpoint, + rpc, + compatibility, + requests: Stream.fromQueue(requests), + toolEvents: Stream.fromQueue(toolEvents), + flushToolEvents, + closed: Deferred.await(closed), + attach, + attachTools, + updateTool, + finishTool, + failTool, + } satisfies BackendConnection +}) + +export interface Interface { + readonly ui: typeof ui + readonly backend: typeof backend +} + +export class Service extends Context.Service()("opencode-drive/SimulationConnector") {} + +export const layer = Layer.succeed(Service, Service.of({ ui, backend })) + +const negotiate = Effect.fn("SimulationConnector.negotiate")(function* ( + endpoint: string, + role: Handshake.EndpointRole, + required: ReadonlyArray, + handshake: Effect.Effect, + policy: CompatibilityPolicy = "preferred", +) { + const legacy = (reason: string): EndpointCompatibility => + EndpointCompatibility.cases.Legacy.make({ + endpoint, + role, + profile: "opencode-simulation-jsonrpc-v0", + reason, + }) + const result = yield* Effect.exit(handshake) + if (result._tag === "Success") { + const missing = required.filter((capability) => !result.value.capabilities.includes(capability)) + if (result.value.role !== role || missing.length > 0) + return yield* Effect.fail( + new SimulationCompatibilityError({ + endpoint, + role, + message: + result.value.role !== role + ? `Expected ${role} simulation endpoint, received ${result.value.role}` + : `Simulation endpoint is missing required capabilities: ${missing.join(", ")}`, + }), + ) + return EndpointCompatibility.cases.Negotiated.make({ + endpoint, + role: result.value.role, + protocolVersion: result.value.protocolVersion, + server: result.value.server, + capabilities: result.value.capabilities, + }) + } + const cause = result.cause + const message = Cause.pretty(cause) + if (policy === "preferred" && isHandshakeUnavailable(cause)) return legacy(message) + return yield* Effect.fail(new SimulationCompatibilityError({ endpoint, role, message })) +}) + +function isHandshakeUnavailable(cause: Cause.Cause) { + const failure = Cause.findErrorOption(cause) + return Option.isSome(failure) && failure.value instanceof SimulationRequestError && failure.value.code === -32601 +} + +export * as SimulationConnector from "./connector.js" diff --git a/packages/drive/src/simulation/opencode-protocol.ts b/packages/drive/src/simulation/opencode-protocol.ts new file mode 100644 index 00000000000..4d07fb91651 --- /dev/null +++ b/packages/drive/src/simulation/opencode-protocol.ts @@ -0,0 +1,336 @@ +import * as Effect from "effect/Effect" +import * as Option from "effect/Option" +import * as Queue from "effect/Queue" +import * as Schema from "effect/Schema" +import { RpcClient, RpcClientError, type RpcMessage } from "effect/unstable/rpc" +import { JsonRpc, SimulationRequestError } from "@opencode-ai/protocol/simulation" + +interface PendingRequest { + readonly clientId: number + readonly method: string + readonly requestId: string | number +} + +type TransportEvent = + | { readonly _tag: "Message"; readonly data: string } + | { readonly _tag: "Close" } + | { readonly _tag: "Error"; readonly cause: unknown } + +export interface Notification { + readonly method: string + readonly params: unknown +} + +export interface Options { + readonly connectTimeout?: number + readonly firstWireId?: number + readonly onClose?: () => Effect.Effect + readonly onNotification?: (notification: Notification) => Effect.Effect +} + +const decodeResponse = Schema.decodeUnknownOption(JsonRpc.Response) +const encodeRequestError = Schema.encodeSync(Schema.toCodecJson(SimulationRequestError)) + +export const make = Effect.fn("OpenCodeRpcProtocol.make")(function* (endpoint: string, options?: Options) { + const connectTimeout = options?.connectTimeout ?? 30_000 + let closing = false + const socket = yield* Effect.acquireRelease( + open(endpoint).pipe( + Effect.timeoutOrElse({ + duration: connectTimeout, + orElse: () => + Effect.fail( + protocolError( + `cannot connect to ${endpoint}: timed out after ${connectTimeout}ms`, + new Error("WebSocket connection timed out"), + ), + ), + }), + ), + (socket) => + Effect.sync(() => { + closing = true + socket.terminate() + }), + ) + + return yield* RpcClient.Protocol.make((write, clientIds) => + Effect.gen(function* () { + const events = yield* Queue.unbounded() + const pending = new Map() + const wireIds = new Map>() + let nextWireId = options?.firstWireId ?? 1 + let currentError: RpcClientError.RpcClientError | undefined + + const removePending = (wireId: number) => { + const request = pending.get(wireId) + if (request === undefined) return undefined + pending.delete(wireId) + const clientWireIds = wireIds.get(request.clientId) + clientWireIds?.delete(request.requestId) + if (clientWireIds?.size === 0) wireIds.delete(request.clientId) + return request + } + + const failAll = (message: string, cause: unknown) => + Effect.gen(function* () { + if (closing || currentError !== undefined) return + const error = protocolError(message, cause) + currentError = error + pending.clear() + wireIds.clear() + yield* Effect.forEach(clientIds, (clientId) => + write(clientId, { + _tag: "ClientProtocolError", + error, + }), + ) + if (socket.readyState === WebSocket.OPEN) socket.terminate() + }) + + const handleMessage = (data: string): Effect.Effect => { + let value: unknown + try { + value = JSON.parse(data) + } catch (cause) { + return failAll("received invalid JSON", cause) + } + + if (isRecord(value) && typeof value.method === "string") { + if (value.jsonrpc !== "2.0" || "id" in value) + return failAll("received an invalid JSON-RPC notification", value) + return ( + options?.onNotification?.({ + method: value.method, + params: "params" in value ? value.params : undefined, + }) ?? Effect.void + ) + } + + if (!isRecord(value)) return failAll("received an invalid JSON-RPC response", value) + const hasResult = Object.hasOwn(value, "result") + const hasError = Object.hasOwn(value, "error") + if (hasResult === hasError) return failAll("JSON-RPC response must contain result or error", value) + + const decoded = decodeResponse(value) + if (Option.isNone(decoded)) return failAll("received an invalid JSON-RPC response", value) + const response = decoded.value + if (typeof response.id !== "number") return failAll("received an invalid JSON-RPC response ID", response.id) + const request = removePending(response.id) + if (request === undefined) return Effect.void + + if (response.error !== undefined) { + const error = new SimulationRequestError({ + method: request.method, + code: response.error.code, + message: response.error.message, + ...(response.error.data === undefined ? {} : { data: response.error.data }), + }) + return write(request.clientId, { + _tag: "Exit", + requestId: request.requestId, + exit: { + _tag: "Failure", + cause: [{ _tag: "Fail", error: encodeRequestError(error) }], + }, + }) + } + + return write(request.clientId, { + _tag: "Exit", + requestId: request.requestId, + exit: { _tag: "Success", value: response.result }, + }) + } + + const handleEvent = (event: TransportEvent) => { + switch (event._tag) { + case "Message": + return handleMessage(event.data) + case "Close": + return Effect.andThen( + options?.onClose?.() ?? Effect.void, + failAll("connection closed", new Error("connection closed")), + ) + case "Error": + return Effect.andThen(options?.onClose?.() ?? Effect.void, failAll("connection error", event.cause)) + } + return Effect.void + } + + yield* Queue.take(events).pipe(Effect.flatMap(handleEvent), Effect.forever, Effect.forkScoped) + + const onMessage = (event: MessageEvent) => + Queue.offerUnsafe(events, { + _tag: "Message", + data: String(event.data), + }) + const onClose = () => Queue.offerUnsafe(events, { _tag: "Close" }) + const onError = (cause: Event) => Queue.offerUnsafe(events, { _tag: "Error", cause }) + socket.addEventListener("message", onMessage) + socket.addEventListener("close", onClose) + socket.addEventListener("error", onError) + yield* Effect.addFinalizer(() => + Effect.sync(() => { + socket.removeEventListener("message", onMessage) + socket.removeEventListener("close", onClose) + socket.removeEventListener("error", onError) + }).pipe(Effect.andThen(Queue.shutdown(events))), + ) + + const send = (clientId: number, message: RpcMessage.FromClientEncoded) => + Effect.suspend(() => { + if (currentError !== undefined) return Effect.fail(currentError) + if (message._tag === "Interrupt") { + const clientWireIds = wireIds.get(clientId) + const wireId = clientWireIds?.get(message.requestId) + if (wireId !== undefined) removePending(wireId) + return Effect.void + } + if (message._tag !== "Request") return Effect.void + if (socket.readyState !== WebSocket.OPEN) + return Effect.fail(protocolError("connection is not open", new Error("connection is not open"))) + + let clientWireIds = wireIds.get(clientId) + if (clientWireIds === undefined) { + clientWireIds = new Map() + wireIds.set(clientId, clientWireIds) + } + if (clientWireIds.has(message.id)) + return Effect.fail(protocolError("duplicate RPC request ID", new Error(String(message.id)))) + + const wireId = nextWireId++ + const payload = message.tag === "ui.press" ? encodePressPayload(message.payload) : message.payload + pending.set(wireId, { + clientId, + method: message.tag, + requestId: message.id, + }) + clientWireIds.set(message.id, wireId) + return Effect.try({ + try: () => { + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + id: wireId, + method: message.tag, + ...(payload === undefined || payload === null ? {} : { params: payload }), + }), + ) + }, + catch: (cause) => { + removePending(wireId) + return protocolError("failed to send request", cause) + }, + }) + }) + + return { + send, + supportsAck: false, + supportsTransferables: false, + } + }), + ) +}) + +const arrows = { + up: { final: "A", kitty: 57_352 }, + down: { final: "B", kitty: 57_353 }, + right: { final: "C", kitty: 57_351 }, + left: { final: "D", kitty: 57_350 }, +} as const + +function encodePressPayload(payload: unknown) { + if (typeof payload !== "object" || payload === null) return payload + const key = Reflect.get(payload, "key") + if (typeof key !== "string") return payload + const modifiers = Reflect.get(payload, "modifiers") + const modifier = modifierMask(modifiers) + const named = key.toLowerCase() + const arrowName = named.startsWith("arrow_") ? named.slice(6) : named + const arrow = + arrowName === "up" + ? arrows.up + : arrowName === "down" + ? arrows.down + : arrowName === "right" + ? arrows.right + : arrowName === "left" + ? arrows.left + : undefined + if (arrow !== undefined) { + if (modifier & 24) return { key: kittySequence(arrow.kitty, modifier) } + return { + key: modifier === 0 ? `\u001b[${arrow.final}` : `\u001b[1;${modifier + 1}${arrow.final}`, + } + } + if (named === "tab" && modifier !== 0) return { key: kittySequence(9, modifier) } + return payload +} + +function modifierMask(value: unknown) { + if (typeof value !== "object" || value === null) return 0 + return ( + (Reflect.get(value, "shift") === true ? 1 : 0) | + (Reflect.get(value, "meta") === true ? 2 : 0) | + (Reflect.get(value, "ctrl") === true ? 4 : 0) | + (Reflect.get(value, "super") === true ? 8 : 0) | + (Reflect.get(value, "hyper") === true ? 16 : 0) + ) +} + +function kittySequence(codepoint: number, modifier: number) { + return `\u001b[${codepoint};${modifier + 1}u` +} + +function open(endpoint: string) { + return Effect.callback((resume) => { + let socket: WebSocket + try { + socket = new WebSocket(endpoint) + } catch (cause) { + resume(Effect.fail(protocolError(`cannot connect to ${endpoint}`, cause))) + return Effect.void + } + let settled = false + const complete = (effect: Effect.Effect) => { + if (settled) return + settled = true + cleanup() + resume(effect) + } + const onOpen = () => complete(Effect.succeed(socket)) + const onError = (cause: Event) => { + complete(Effect.fail(protocolError(`cannot connect to ${endpoint}`, cause))) + socket.terminate() + } + const onClose = () => { + complete( + Effect.fail(protocolError(`cannot connect to ${endpoint}`, new Error("connection closed before opening"))), + ) + } + const cleanup = () => { + socket.removeEventListener("open", onOpen) + socket.removeEventListener("error", onError) + socket.removeEventListener("close", onClose) + } + socket.addEventListener("open", onOpen) + socket.addEventListener("error", onError) + socket.addEventListener("close", onClose) + return Effect.sync(() => { + cleanup() + socket.terminate() + }) + }) +} + +function protocolError(message: string, cause: unknown) { + return new RpcClientError.RpcClientError({ + reason: new RpcClientError.RpcClientDefect({ message, cause }), + }) +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value) +} diff --git a/packages/drive/src/tool/controller.ts b/packages/drive/src/tool/controller.ts new file mode 100644 index 00000000000..918fb10ac5c --- /dev/null +++ b/packages/drive/src/tool/controller.ts @@ -0,0 +1,676 @@ +import { fileURLToPath } from "node:url" +import * as Cause from "effect/Cause" +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as Option from "effect/Option" +import * as Schema from "effect/Schema" +import * as Semaphore from "effect/Semaphore" +import type { JsonValue, OpenCodeConfig, Setup as ProjectSetup } from "../project.js" +import { + Failure, + ControlError, + ShellInput, + ShellResult, + WebFetchInput, + WebFetchResult, + WebSearchInput, + WebSearchResult, + WriteInput, + WriteResult, + type Configuration, + type ControlledCall, + type ControlledCalls, + type ControlledCallsFor, + type StaticControls, + type Handler, + type Name, + type Registration, + type Registry, + type ShellHandler, + type WebFetchHandler, + type WebSearchHandler, + type WriteHandler, +} from "./types.js" + +type Result = ShellResult | WebFetchResult | WebSearchResult | WriteResult +type Event = + | { readonly type: "progress"; readonly result: Result } + | { readonly type: "success"; readonly result: Result } + | { readonly type: "failure"; readonly message: string } +type BackgroundCompletion = { + readonly shellID: string + readonly command: string + readonly state: "completed" | "error" | "cancelled" + readonly output: string +} +type BackgroundJob = { + readonly input: string + readonly completion: Promise + readonly cancel: () => void +} +type Definition = { + readonly schema: typeof ShellInput | typeof WebFetchInput | typeof WebSearchInput | typeof WriteInput + readonly invoke: ( + input: unknown, + index: number, + id: string, + progress: (result: Result) => Effect.Effect, + ) => Effect.Effect +} + +const MAX_EVENT_BYTES = 1024 * 1024 +const ExecutionRequest = Schema.Struct({ + input: Schema.Unknown, + context: Schema.Struct({ + callID: Schema.String, + }), +}) +const encoder = new TextEncoder() + +function controlError( + operation: ControlError["operation"], + reason: ControlError["reason"], + name: Name, + callID?: string, +) { + const message = + reason === "not-controlled" + ? `tool is not configured for runtime control: ${name}` + : reason === "controller-closed" + ? callID === undefined + ? `tool controller is closed: ${name}` + : `${name} tool call ${callID} was interrupted because the controller closed` + : reason === "already-claimed" + ? `${name} tool call already claimed: ${callID}` + : reason === "already-settled" + ? `${name} tool call ${callID} is settled` + : `${name} tool call ${callID} is interrupted` + return new ControlError({ operation, reason, name, callID, message }) +} + +export interface Controller { + readonly enabled: boolean + readonly controls: StaticControls + readonly configure: (config: OpenCodeConfig) => void + readonly names: ReadonlySet +} + +export function composeSetup(controller: Controller, setup: ProjectSetup | undefined): ProjectSetup | undefined { + if (!controller.enabled && setup === undefined) return undefined + return (context) => + Effect.suspend(() => { + const configured: unknown = setup === undefined ? Effect.void : setup(context) + if (!isEffect(configured)) return Effect.fail(new Error("setup must return an Effect")) + return configured.pipe(Effect.asVoid, Effect.andThen(Effect.sync(() => controller.configure(context.config)))) + }) +} + +function isEffect(value: unknown): value is Effect.Effect { + return Effect.isEffect(value) +} + +export const make = Effect.fn("ToolController.make")(function* (configuration?: Configuration) { + const definitions = new Map() + const closeControls: Array> = [] + let closed = false + const controlledCalls: { + [Tool in Name]?: ControlledCallsFor + } = {} + const add = (name: string, definition: Definition) => { + if (definitions.has(name)) throw new Error(`tool handler already registered: ${name}`) + definitions.set(name, definition) + } + function handle(name: "shell", handler: ShellHandler): void + function handle(name: "webfetch", handler: WebFetchHandler): void + function handle(name: "websearch", handler: WebSearchHandler): void + function handle(name: "write", handler: WriteHandler): void + function handle(...registration: Registration) { + switch (registration[0]) { + case "shell": { + const handler = registration[1] + add("shell", { + schema: ShellInput, + invoke: (raw, index, id, progress) => + Effect.gen(function* () { + const input = yield* Schema.decodeUnknownEffect(ShellInput)(raw) + const result = yield* handler({ + id, + input, + index, + progress: (value) => progress(typeof value === "string" ? { output: value } : value), + }) + return yield* Schema.decodeUnknownEffect(ShellResult)(result) + }), + }) + return + } + case "webfetch": { + const handler = registration[1] + add("webfetch", { + schema: WebFetchInput, + invoke: (raw, index, id, progress) => + Effect.gen(function* () { + const input = yield* Schema.decodeUnknownEffect(WebFetchInput)(raw) + const result = yield* handler({ + id, + input, + index, + progress: (value) => progress(typeof value === "string" ? { output: value } : value), + }) + return yield* Schema.decodeUnknownEffect(WebFetchResult)(result) + }), + }) + return + } + case "websearch": { + const handler = registration[1] + add("websearch", { + schema: WebSearchInput, + invoke: (raw, index, id, progress) => + Effect.gen(function* () { + const input = yield* Schema.decodeUnknownEffect(WebSearchInput)(raw) + const result = yield* handler({ + id, + input, + index, + progress: (value) => progress(typeof value === "string" ? { output: value } : value), + }) + return yield* Schema.decodeUnknownEffect(WebSearchResult)(result) + }), + }) + return + } + case "write": { + const handler = registration[1] + add("write", { + schema: WriteInput, + invoke: (raw, index, id, progress) => + Effect.gen(function* () { + const input = yield* Schema.decodeUnknownEffect(WriteInput)(raw) + const result = yield* handler({ + id, + input, + index, + progress: (value) => progress(typeof value === "string" ? { output: value } : value), + }) + return yield* Schema.decodeUnknownEffect(WriteResult)(result) + }), + }) + } + } + } + const registry: Registry = { handle } + if (typeof configuration === "function") configuration(registry) + if (Array.isArray(configuration)) { + for (const name of configuration) { + switch (name) { + case "shell": { + const controlled = makeControlledHandler("shell") + handle("shell", controlled.handler) + controlledCalls.shell = controlled.calls + closeControls.push(controlled.close) + break + } + case "webfetch": { + const controlled = makeControlledHandler("webfetch") + handle("webfetch", controlled.handler) + controlledCalls.webfetch = controlled.calls + closeControls.push(controlled.close) + break + } + case "websearch": { + const controlled = makeControlledHandler("websearch") + handle("websearch", controlled.handler) + controlledCalls.websearch = controlled.calls + closeControls.push(controlled.close) + break + } + case "write": { + const controlled = makeControlledHandler("write") + handle("write", controlled.handler) + controlledCalls.write = controlled.calls + closeControls.push(controlled.close) + break + } + default: + throw new Error(`unsupported controlled tool: ${String(name)}`) + } + } + } + function control(name: Tool): Effect.Effect, ControlError> { + if (closed) return Effect.fail(controlError("control", "controller-closed", name)) + const calls = controlledCalls[name] + return calls === undefined ? Effect.fail(controlError("control", "not-controlled", name)) : Effect.succeed(calls) + } + const controls: StaticControls = { control } + if (definitions.size === 0) return { enabled: false, controls, configure() {}, names: new Set() } satisfies Controller + + const token = crypto.randomUUID() + const indexes = new Map() + const active = new Map>() + const background = new Map() + let closing = false + const server = yield* Effect.acquireRelease( + Effect.sync(() => + Bun.serve({ + hostname: "127.0.0.1", + port: 0, + idleTimeout: 255, + fetch(request) { + if (request.headers.get("authorization") !== `Bearer ${token}`) + return new Response("Unauthorized", { status: 401 }) + if (closing && request.method === "POST") return new Response("Tool controller is stopping", { status: 503 }) + const pathname = new URL(request.url).pathname + const shellID = pathname.match(/^\/background\/([^/]+)$/)?.[1] + if (request.method === "GET" && shellID !== undefined) { + const job = background.get(shellID) + if (job === undefined) return new Response("Background shell not found", { status: 404 }) + server.timeout(request, 0) + return job.completion.then((completion) => Response.json(completion)) + } + if (request.method === "DELETE" && shellID !== undefined) { + background.delete(shellID) + return new Response(null, { status: 204 }) + } + const name = pathname.match(/^\/execute\/([^/]+)$/)?.[1] + const definition = name === undefined ? undefined : definitions.get(name) + if (request.method !== "POST" || name === undefined) return new Response("Not found", { status: 404 }) + if (definition === undefined) return new Response("Tool handler not registered", { status: 404 }) + return execute(request, name, definition, indexes, active, background) + }, + }), + ), + (server) => + Effect.gen(function* () { + closing = true + closed = true + yield* Effect.all(closeControls, { discard: true }) + yield* Effect.sync(() => { + for (const controller of active.keys()) controller.abort(new Error("Drive tool controller stopped")) + }) + yield* Effect.promise(() => Promise.allSettled(active.values())) + background.clear() + yield* Effect.promise(() => server.stop(true)) + }), + ) + const endpoint = `http://${server.hostname}:${server.port}` + const plugin = fileURLToPath(new URL("./plugin.js", import.meta.url)) + const schemas = Object.fromEntries( + [...definitions].map(([name, definition]) => [ + name, + JSON.parse(JSON.stringify(Schema.toJsonSchemaDocument(definition.schema).schema)), + ]), + ) + + return { + enabled: true, + controls, + names: new Set(definitions.keys()), + configure(config) { + const current = config.plugins + if (current !== undefined && !Array.isArray(current)) throw new Error("OpenCode config plugins must be an array") + config.plugins = [ + ...(current ?? []), + { + package: plugin, + options: { endpoint, token, tools: [...definitions.keys()], schemas }, + }, + ] as JsonValue + }, + } satisfies Controller +}) + +function makeControlledHandler( + name: Name, +): { + readonly calls: ControlledCalls + readonly handler: Handler + readonly close: Effect.Effect +} { + type Call = ControlledCall + type Waiter = { + readonly id?: string + readonly resume: (effect: Effect.Effect) => void + delivered?: Active + } + type Interruption = "transport-interrupted" | "controller-closed" + type Active = { + readonly call: Call + claimed: boolean + readonly interrupt: (reason: Interruption) => void + } + + const records = new Map() + const waiters: Waiter[] = [] + let closed = false + + const deliver = (record: Active) => { + // A caller waiting for this exact ID wins over an earlier generic waiter. + const exact = waiters.findIndex((waiter) => waiter.id === record.call.id) + const index = exact >= 0 ? exact : waiters.findIndex((waiter) => waiter.id === undefined) + if (index < 0) { + record.claimed = false + return + } + const [waiter] = waiters.splice(index, 1) + if (waiter === undefined) throw new Error(`missing ${name} tool call waiter`) + record.claimed = true + waiter.delivered = record + waiter.resume(Effect.succeed(record.call)) + } + + const offer = (record: Active) => + Effect.suspend(() => { + const id = record.call.id + if (closed) + return Effect.fail( + new Failure({ + message: controlError("take", "controller-closed", name, id).message, + }), + ) + if (records.has(id)) + return Effect.fail( + new Failure({ + message: `duplicate ${name} tool call ID: ${id}`, + }), + ) + records.set(id, record) + deliver(record) + return Effect.void + }) + + function take(): Effect.Effect + function take(id: string): Effect.Effect + function take(id?: string): Effect.Effect { + return Effect.callback((resume) => { + if (closed) { + resume(Effect.fail(controlError("take", "controller-closed", name, id))) + return undefined + } + if (id !== undefined && (records.get(id)?.claimed === true || waiters.some((waiter) => waiter.id === id))) { + resume(Effect.fail(controlError("take", "already-claimed", name, id))) + return undefined + } + let record = id === undefined ? undefined : records.get(id) + if (id === undefined) { + for (const candidate of records.values()) { + if (candidate.claimed) continue + record = candidate + break + } + } + if (record !== undefined) { + record.claimed = true + resume(Effect.succeed(record.call)) + return Effect.sync(() => { + if (!closed && records.get(record.call.id) === record) { + record.claimed = false + deliver(record) + } + return undefined + }) + } + const waiter: Waiter = { id, resume } + waiters.push(waiter) + return Effect.sync(() => { + const index = waiters.indexOf(waiter) + if (index >= 0) { + waiters.splice(index, 1) + return undefined + } + const delivered = waiter.delivered + if (delivered !== undefined && !closed && records.get(delivered.call.id) === delivered) { + delivered.claimed = false + deliver(delivered) + } + return undefined + }) + }) + } + + const handler: Handler = (context) => + Effect.uninterruptibleMask((restore) => + Effect.gen(function* () { + const result = Deferred.makeUnsafe() + const interrupted = Deferred.makeUnsafe() + const operations = Semaphore.makeUnsafe(1) + let state: "pending" | "settled" | Interruption = "pending" + const unavailable = (operation: ControlError["operation"]) => { + if (state === "pending") return undefined + return controlError(operation, state === "settled" ? "already-settled" : state, name, context.id) + } + const commit = (operation: "succeed" | "fail", completion: Effect.Effect) => + // Accepted progress must finish before the one terminal commitment. + operations.withPermit( + Effect.suspend(() => { + const failure = unavailable(operation) + if (failure !== undefined) return Effect.fail(failure) + return Effect.sync(() => { + state = "settled" + return Deferred.doneUnsafe(result, completion) + ? undefined + : controlError(operation, "already-settled", name, context.id) + }).pipe(Effect.flatMap((failure) => (failure === undefined ? Effect.void : Effect.fail(failure)))) + }), + ) + const call: Call = { + id: context.id, + input: context.input, + index: context.index, + progress: (output) => + operations.withPermit( + Effect.suspend(() => { + const failure = unavailable("progress") + return failure === undefined ? context.progress(output) : Effect.fail(failure) + }), + ), + succeed: (output) => commit("succeed", Effect.succeed(output)), + fail: (message) => commit("fail", Effect.fail(new Failure({ message }))), + awaitInterrupted: () => Deferred.await(interrupted), + } + const record: Active = { + call, + claimed: false, + interrupt: (reason) => { + if (state !== "pending") return + state = reason + Deferred.doneUnsafe(interrupted, Effect.void) + Deferred.doneUnsafe(result, Effect.interrupt) + }, + } + return yield* offer(record).pipe( + Effect.andThen(restore(Deferred.await(result))), + Effect.onInterrupt(() => Effect.sync(() => record.interrupt("transport-interrupted"))), + Effect.ensuring( + Effect.sync(() => { + if (records.get(context.id) === record) records.delete(context.id) + }), + ), + ) + }), + ) + + const close = Effect.sync(() => { + if (closed) return + closed = true + for (const waiter of waiters) waiter.resume(Effect.fail(controlError("take", "controller-closed", name, waiter.id))) + waiters.length = 0 + for (const record of records.values()) record.interrupt("controller-closed") + }) + + return { calls: { take }, handler, close } +} + +function execute( + request: Request, + name: string, + definition: Definition, + indexes: Map, + active: Map>, + background: Map, +) { + const transport = new TransformStream() + const writer = transport.writable.getWriter() + const controller = new AbortController() + const signal = AbortSignal.any([request.signal, controller.signal]) + const send = (event: Event) => + Effect.suspend(() => { + const frame = encodeEvent(event) + return Effect.promise(() => writer.write(frame)) + }) + let launched: BackgroundJob | undefined + const result = Effect.gen(function* () { + const body = yield* Schema.decodeUnknownEffect(ExecutionRequest)(yield* Effect.promise(() => request.json())) + const input = body.input + if (name === "shell" && isBackgroundShell(input)) { + const shellID = body.context.callID + if (shellID.length === 0) return yield* Effect.die(new Error("Background shell requires a tool call ID")) + const key = JSON.stringify(input) + const existing = background.get(shellID) + if (existing !== undefined) { + if (existing.input !== key) + return yield* Effect.die(new Error(`Background shell ID reused with different input: ${shellID}`)) + return { + output: "The command was moved to the background.", + shellID, + status: "running" as const, + } + } + const index = nextIndex(indexes, name) + const job = startBackgroundShell(definition, input, index, shellID, key, active) + background.set(shellID, job) + launched = job + return { + output: "The command was moved to the background.", + shellID, + status: "running" as const, + } + } + const index = nextIndex(indexes, name) + return yield* definition.invoke(input, index, body.context.callID, (value) => + send({ type: "progress", result: value }), + ) + }) + void writer.closed.catch((cause) => controller.abort(cause)) + const completion = (async () => { + try { + const exit = await Effect.runPromiseExit(result, { signal }) + if (signal.aborted) throw signal.reason ?? new Error("Drive tool execution interrupted") + if (Exit.isSuccess(exit)) await Effect.runPromise(send({ type: "success", result: exit.value }), { signal }) + else { + await Effect.runPromise( + send({ + type: "failure", + message: causeMessage(exit.cause), + }), + { signal }, + ) + } + await writer.close() + } catch { + if (launched !== undefined) launched.cancel() + await writer.abort().catch(() => undefined) + } finally { + active.delete(controller) + } + })() + active.set(controller, completion) + return new Response(transport.readable, { + headers: { "content-type": "application/x-ndjson" }, + }) +} + +function isBackgroundShell(input: unknown): input is { readonly command: string; readonly background: true } { + return ( + typeof input === "object" && + input !== null && + "background" in input && + input.background === true && + "command" in input && + typeof input.command === "string" + ) +} + +function startBackgroundShell( + definition: Definition, + input: { readonly command: string; readonly background: true }, + index: number, + shellID: string, + inputKey: string, + active: Map>, +): BackgroundJob { + const controller = new AbortController() + let output = "" + const result = definition.invoke(input, index, shellID, (value) => + Effect.sync(() => { + encodeEvent({ type: "progress", result: value }) + output = value.output + }), + ) + const completion = Effect.runPromiseExit(result, { signal: controller.signal }) + .then((exit): BackgroundCompletion => { + if (Exit.isSuccess(exit)) { + encodeEvent({ type: "success", result: exit.value }) + return { shellID, command: input.command, state: "completed", output: exit.value.output } + } + if (controller.signal.aborted) + return { shellID, command: input.command, state: "cancelled", output: output || "Command cancelled" } + const message = causeMessage(exit.cause) + return { + shellID, + command: input.command, + state: "error", + output: errorOutput(output, message), + } + }) + .catch( + (cause): BackgroundCompletion => ({ + shellID, + command: input.command, + state: controller.signal.aborted ? "cancelled" : "error", + output: errorOutput(output, cause instanceof Error ? cause.message : String(cause)), + }), + ) + .finally(() => active.delete(controller)) + active.set(controller, completion) + return { + input: inputKey, + completion, + cancel: () => controller.abort(new Error("Background shell launch disconnected")), + } +} + +function nextIndex(indexes: Map, name: string): number { + const index = indexes.get(name) ?? 0 + indexes.set(name, index + 1) + return index +} + +function encodeEvent(event: Event): Uint8Array { + const frame = encoder.encode(`${JSON.stringify(event)}\n`) + if (frame.byteLength > MAX_EVENT_BYTES) throw new Error(`Drive tool event exceeds ${MAX_EVENT_BYTES} bytes`) + return frame +} + +function boundedOutput(output: string): string { + const bytes = Buffer.from(output) + return bytes.byteLength <= MAX_EVENT_BYTES ? output : bytes.subarray(0, MAX_EVENT_BYTES).toString("utf8") +} + +function errorOutput(output: string, message: string): string { + if (!output) return boundedOutput(message) + const suffix = `\n${message}` + const suffixBytes = Buffer.from(suffix) + if (suffixBytes.byteLength >= MAX_EVENT_BYTES) return boundedOutput(message) + const prefix = Buffer.from(output.replace(/\n$/, "")) + .subarray(0, MAX_EVENT_BYTES - suffixBytes.byteLength) + .toString("utf8") + return `${prefix}${suffix}` +} + +function causeMessage(cause: Cause.Cause): string { + const failure = Cause.findErrorOption(cause) + const error = Option.isSome(failure) ? failure.value : Cause.squash(cause) + return error instanceof Failure ? error.message : error instanceof Error ? error.message : String(error) +} diff --git a/packages/drive/src/tool/index.ts b/packages/drive/src/tool/index.ts new file mode 100644 index 00000000000..972201f113c --- /dev/null +++ b/packages/drive/src/tool/index.ts @@ -0,0 +1 @@ +export * from "./types.js" diff --git a/packages/drive/src/tool/plugin.js b/packages/drive/src/tool/plugin.js new file mode 100644 index 00000000000..7c69bbc3a7c --- /dev/null +++ b/packages/drive/src/tool/plugin.js @@ -0,0 +1,167 @@ +import { Effect, Schedule, Schema, Scope } from "effect" + +const MAX_BUFFER_CHARS = 1024 * 1024 +const BACKGROUND_INSTRUCTION = + "You will be notified automatically when the command finishes. DO NOT sleep, poll, or proactively check on its progress." +const descriptions = { + shell: "Executes a shell command.", + webfetch: "Fetch content from an HTTP or HTTPS URL and return it as text, markdown, or HTML.", + websearch: "Search the web using the session's local web search provider.", + write: "Writes a file to the local filesystem, overwriting if one exists.", +} + +class ToolFailure extends Schema.TaggedErrorClass()("LLM.ToolFailure", { + message: Schema.String, +}) {} + +const content = (result) => [ + { type: "text", text: result.output }, + ...(result.status === "running" ? [{ type: "text", text: BACKGROUND_INSTRUCTION }] : []), +] + +const output = (result) => ({ + output: result, + content: content(result), +}) + +const progress = (result) => ({ + structured: result, + content: content(result), +}) + +const failure = (cause) => + cause instanceof ToolFailure + ? cause + : new ToolFailure({ message: cause instanceof Error ? cause.message : String(cause) }) + +const parse = (line) => + Effect.try({ + try: () => JSON.parse(line), + catch: (cause) => failure(cause), + }) + +const waitForBackground = (options, shellID) => + Effect.gen(function* () { + const response = yield* Effect.tryPromise({ + try: (signal) => + fetch(`${options.endpoint}/background/${shellID}`, { + headers: { authorization: `Bearer ${options.token}` }, + signal, + }), + catch: failure, + }) + if (!response.ok) + return yield* new ToolFailure({ message: `Drive background shell returned HTTP ${response.status}` }) + return yield* Effect.tryPromise({ + try: () => response.json(), + catch: failure, + }) + }) + +const notifyWhenDone = (ctx, options, sessionID, shellID) => + Effect.gen(function* () { + const completion = yield* waitForBackground(options, shellID).pipe( + Effect.retry({ times: 3, schedule: Schedule.spaced("100 millis") }), + ) + yield* ctx.session + .synthetic({ + id: `msg_${shellID}_completion`, + sessionID, + text: `\n${completion.output}\n`, + description: completion.command, + metadata: { source: "shell", state: completion.state }, + }) + .pipe(Effect.retry({ times: 3, schedule: Schedule.spaced("100 millis") })) + yield* Effect.tryPromise({ + try: (signal) => + fetch(`${options.endpoint}/background/${shellID}`, { + method: "DELETE", + headers: { authorization: `Bearer ${options.token}` }, + signal, + }).then((response) => { + if (!response.ok) throw new Error(`Drive background shell acknowledgement returned HTTP ${response.status}`) + }), + catch: failure, + }).pipe(Effect.retry({ times: 3, schedule: Schedule.spaced("100 millis") })) + }).pipe(Effect.catch((cause) => Effect.logError("Drive background shell notification failed", cause))) + +const execute = (ctx, scope, options, name, input, context) => + Effect.gen(function* () { + const response = yield* Effect.tryPromise({ + try: (signal) => + fetch(`${options.endpoint}/execute/${name}`, { + method: "POST", + headers: { + authorization: `Bearer ${options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input, + context: { callID: context.id }, + }), + signal, + }), + catch: failure, + }) + if (!response.ok || !response.body) + return yield* new ToolFailure({ message: `Drive tool handler returned HTTP ${response.status}` }) + + const reader = response.body.getReader() + return yield* Effect.acquireUseRelease( + Effect.succeed(reader), + (reader) => + Effect.gen(function* () { + const decoder = new TextDecoder() + let buffer = "" + let result + while (true) { + const chunk = yield* Effect.tryPromise({ + try: () => reader.read(), + catch: failure, + }) + buffer += decoder.decode(chunk.value, { stream: !chunk.done }) + if (buffer.length > MAX_BUFFER_CHARS) + return yield* new ToolFailure({ + message: `Drive tool event exceeds ${MAX_BUFFER_CHARS} characters`, + }) + let newline + while ((newline = buffer.indexOf("\n")) !== -1) { + const line = buffer.slice(0, newline) + buffer = buffer.slice(newline + 1) + if (!line) continue + const event = yield* parse(line) + if (event.type === "progress") yield* context.progress(progress(event.result)) + if (event.type === "success") result = event.result + if (event.type === "failure") return yield* new ToolFailure({ message: event.message }) + } + if (chunk.done) break + } + if (!result) return yield* new ToolFailure({ message: "Drive tool handler ended without a result" }) + if (name === "shell" && result.status === "running" && result.shellID) + yield* notifyWhenDone(ctx, options, context.sessionID, result.shellID).pipe( + Effect.forkIn(scope, { startImmediately: true }), + ) + return output(result) + }), + (reader) => Effect.promise(() => reader.cancel().catch(() => undefined)), + ) + }) + +export default { + id: "opencode-drive.tool-handlers", + effect: (ctx) => + Effect.gen(function* () { + const scope = yield* Scope.Scope + yield* ctx.tool.transform((tools) => { + for (const name of ctx.options.tools) { + tools.add({ + name, + description: descriptions[name], + input: ctx.options.schemas[name], + options: { codemode: false }, + execute: (input, context) => execute(ctx, scope, ctx.options, name, input, context), + }) + } + }) + }), +} diff --git a/packages/drive/src/tool/producer.ts b/packages/drive/src/tool/producer.ts new file mode 100644 index 00000000000..dcd44edfeb5 --- /dev/null +++ b/packages/drive/src/tool/producer.ts @@ -0,0 +1,831 @@ +import { createHash } from "node:crypto" +import * as Cause from "effect/Cause" +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as Queue from "effect/Queue" +import * as Ref from "effect/Ref" +import * as Schema from "effect/Schema" +import * as Semaphore from "effect/Semaphore" +import * as Scope from "effect/Scope" +import * as Stream from "effect/Stream" +import { RpcClientError } from "effect/unstable/rpc" +import { + SimulationCompatibilityError, + SimulationConnectionError, + type BackendConnection, +} from "../simulation/connector.js" +import { Backend, SimulationRequestError } from "@opencode-ai/protocol/simulation" +import { + LifecycleError, + type AttachParams, + type Cancellation, + type DynamicControls, + type Invocation, + type Output, + Progress, +} from "./types.js" + +export interface BackendAttachment { + readonly detach: () => Effect.Effect +} + +export interface Controller { + readonly controls: DynamicControls + readonly connect: (backend: BackendConnection) => Effect.Effect + readonly connectFrom: ( + backend: Effect.Effect, + ) => Effect.Effect< + { readonly backend: BackendConnection; readonly attachment: BackendAttachment }, + E | LifecycleError, + R + > + readonly endGeneration: Effect.Effect + readonly settle: Effect.Effect + readonly shutdown: Effect.Effect + readonly failure: Effect.Effect +} + +type Waiter = { + readonly callID?: string + readonly resume: (effect: Effect.Effect) => void + delivered?: Active +} + +type Active = { + readonly fingerprint: string + readonly call: Invocation + readonly cancelled: Deferred.Deferred + readonly operations: Semaphore.Semaphore + claimed: boolean + sequence: number + state: "pending" | "settled" | "cancelled" +} + +type AttachmentIntent = { + readonly params: AttachParams + previous: AttachmentIntent | undefined + readonly rejection: Deferred.Deferred + attempted: boolean +} + +const decodeAttach = Schema.decodeUnknownEffect(Backend.ToolAttachParams) +const decodeProgress = Schema.decodeUnknownEffect(Progress) +const decodeOutput = Schema.decodeUnknownEffect(Backend.ToolOutput) +const decodeFailure = Schema.decodeUnknownEffect(Schema.String) +const decodeCallID = Schema.decodeUnknownEffect(Schema.String) + +export const make = Effect.fn("ToolProducer.make")(function* (staticNames: ReadonlySet) { + const parentScope = yield* Scope.Scope + const lifecycle = yield* Semaphore.make(1) + const attachmentCalls = yield* Semaphore.make(1) + const attachmentLock = yield* Semaphore.make(1) + const connectionCalls = yield* Semaphore.make(1) + const records = new Map() + const waiters: Waiter[] = [] + const completed = new Map() + const unclaimedCancellations: Active[] = [] + const backendChanges = yield* Queue.sliding(1) + const failure = yield* Deferred.make() + const settlementStarted = yield* Deferred.make() + const current = yield* Ref.make< + | { + readonly backend: BackendConnection + readonly scope: Scope.Scope + readonly disconnected: Deferred.Deferred + } + | undefined + >(undefined) + let desired: AttachmentIntent | undefined + let acknowledged: AttachmentIntent | undefined + let terminalFailure: LifecycleError | undefined + let generationActive = false + let generationEnded = Deferred.makeUnsafe() + let settling = false + let settled = false + let closed = false + + const lifecycleError = ( + operation: LifecycleError["operation"], + reason: LifecycleError["reason"], + message: string, + callID?: string, + ) => + new LifecycleError({ + operation, + reason, + message, + ...(callID === undefined ? {} : { callID }), + }) + + const rejectIntent = (intent: AttachmentIntent, error: LifecycleError) => + Effect.sync(() => { + if (desired === intent) desired = intent.previous + if (acknowledged === intent) acknowledged = intent.previous + Deferred.doneUnsafe(intent.rejection, Effect.fail(error)) + }) + + const publishFailure = (error: LifecycleError) => + Effect.sync(() => { + if (terminalFailure !== undefined) return + terminalFailure = error + Deferred.doneUnsafe(failure, Effect.fail(error)) + }) + + const notifyBackend = Queue.offer(backendChanges, undefined).pipe(Effect.asVoid) + + const remember = (id: string, fingerprint: string) => { + completed.set(id, fingerprint) + if (completed.size > 256) { + const oldest = completed.keys().next().value + if (oldest !== undefined) completed.delete(oldest) + } + } + + const retainCancellation = (record: Active) => { + unclaimedCancellations.push(record) + if (unclaimedCancellations.length <= 256) return + const oldest = unclaimedCancellations.shift() + if ( + oldest !== undefined && + records.get(oldest.call.id) === oldest && + oldest.state === "cancelled" && + !oldest.claimed + ) + records.delete(oldest.call.id) + } + + const deliver = (record: Active) => { + const callID = record.call.context.callID + const exact = waiters.findIndex((waiter) => waiter.callID === callID) + const index = exact >= 0 ? exact : waiters.findIndex((waiter) => waiter.callID === undefined) + if (index < 0) { + record.claimed = false + return + } + const waiter = waiters.splice(index, 1)[0] + if (waiter === undefined) throw new Error(`missing dynamic tool waiter for ${record.call.id}`) + record.claimed = true + waiter.delivered = record + waiter.resume(Effect.succeed(record.call)) + if (record.state === "cancelled") records.delete(record.call.id) + } + + const awaitBackend = ( + operation: LifecycleError["operation"], + callID: string | undefined, + ): Effect.Effect => + Effect.suspend(() => + closed + ? Effect.fail(lifecycleError(operation, "controller-closed", "dynamic tool controller is closed", callID)) + : Ref.get(current).pipe( + Effect.flatMap((attached) => + attached === undefined + ? Queue.take(backendChanges).pipe(Effect.andThen(awaitBackend(operation, callID))) + : Effect.succeed(attached.backend), + ), + ), + ) + + const whileConnected = ( + backend: BackendConnection, + operation: LifecycleError["operation"], + effect: Effect.Effect, + ) => + Effect.raceFirst( + effect, + backend.closed.pipe( + Effect.andThen( + Effect.fail( + new SimulationConnectionError({ + endpoint: backend.endpoint, + operation, + message: `dynamic tool ${operation} connection closed`, + }), + ), + ), + ), + ) + + const request = ( + operation: LifecycleError["operation"], + callID: string | undefined, + send: (backend: BackendConnection) => Effect.Effect, + ): Effect.Effect => + Effect.gen(function* () { + if (closed) + return yield* Effect.fail( + lifecycleError(operation, "controller-closed", "dynamic tool controller is closed", callID), + ) + const backend = yield* awaitBackend(operation, callID) + const result = yield* Effect.exit(whileConnected(backend, operation, send(backend))) + if (Exit.isSuccess(result)) return result.value + if (Cause.hasInterrupts(result.cause)) return yield* Effect.interrupt + const found = Cause.findErrorOption(result.cause) + if (found._tag === "None") { + const defect = Cause.squash(result.cause) + if (Schema.isSchemaError(defect)) + return yield* Effect.fail(lifecycleError(operation, "rejected", defect.message, callID)) + return yield* Effect.die(defect) + } + if (found.value instanceof SimulationRequestError || found.value instanceof SimulationCompatibilityError) + return yield* Effect.fail(lifecycleError(operation, "rejected", found.value.message, callID)) + if ( + !(found.value instanceof SimulationConnectionError) && + !(found.value instanceof RpcClientError.RpcClientError && isTransientRpcError(found.value)) + ) + return yield* Effect.fail(lifecycleError(operation, "rejected", String(found.value), callID)) + yield* Effect.sleep(25) + return yield* request(operation, callID, send) + }) + + const unavailable = (record: Active, operation: LifecycleError["operation"]) => + record.state === "pending" + ? undefined + : lifecycleError( + operation, + record.state === "settled" ? "already-settled" : "cancelled", + record.state === "settled" + ? `dynamic tool call ${record.call.context.callID} is settled` + : `dynamic tool call ${record.call.context.callID} was cancelled`, + record.call.context.callID, + ) + + const operate = ( + record: Active, + operation: "progress" | "finish" | "fail", + effect: Effect.Effect, + ) => + record.operations.withPermit( + Effect.suspend(() => { + const error = unavailable(record, operation) + if (error !== undefined) return Effect.fail(error) + return Effect.raceFirst( + effect, + Deferred.await(record.cancelled).pipe( + Effect.andThen( + Effect.fail( + lifecycleError( + operation, + "cancelled", + `dynamic tool call ${record.call.context.callID} was cancelled`, + record.call.context.callID, + ), + ), + ), + ), + ) + }), + ) + + const commit = (record: Active, operation: "finish" | "fail", effect: Effect.Effect) => + operate( + record, + operation, + effect.pipe( + Effect.andThen( + Effect.sync(() => { + record.state = "settled" + records.delete(record.call.id) + remember(record.call.id, record.fingerprint) + }), + ), + ), + ) + + const makeInvocation = (invocation: Backend.ToolInvocation, fingerprint: string): Active => { + const cancelled = Deferred.makeUnsafe() + const operations = Semaphore.makeUnsafe(1) + let record: Active + const call: Invocation = { + id: invocation.id, + name: invocation.name, + input: invocation.input, + context: { + sessionID: invocation.context.sessionID, + agent: invocation.context.agent, + messageID: invocation.context.messageID, + callID: invocation.context.id, + }, + progress: (update: Progress) => + operate( + record, + "progress", + decodeProgress(update).pipe( + Effect.mapError((error) => lifecycleError("progress", "rejected", error.message, invocation.context.id)), + Effect.flatMap((decoded) => + request("progress", invocation.context.id, (backend) => + backend.updateTool({ + id: invocation.id, + sequence: record.sequence, + update: decoded, + }), + ), + ), + Effect.andThen( + Effect.sync(() => { + record.sequence++ + }), + ), + ), + ), + finish: (output: Output) => + commit( + record, + "finish", + decodeOutput(output).pipe( + Effect.mapError((error) => lifecycleError("finish", "rejected", error.message, invocation.context.id)), + Effect.flatMap((decoded) => + request("finish", invocation.context.id, (backend) => + backend.finishTool({ id: invocation.id, output: decoded }), + ), + ), + ), + ), + fail: (message) => + commit( + record, + "fail", + decodeFailure(message).pipe( + Effect.mapError((error) => lifecycleError("fail", "rejected", error.message, invocation.context.id)), + Effect.flatMap((decoded) => + request("fail", invocation.context.id, (backend) => + backend.failTool({ id: invocation.id, message: decoded }), + ), + ), + ), + ), + awaitCancelled: () => Deferred.await(cancelled), + } + record = { + fingerprint, + call, + cancelled, + operations, + claimed: false, + sequence: 0, + state: "pending", + } + return record + } + + const receiveInvocation = (invocation: Backend.ToolInvocation) => + lifecycle.withPermit( + Effect.gen(function* () { + const fingerprint = fingerprintJson(invocation) + const existing = records.get(invocation.id) + if (existing !== undefined) { + if (existing.fingerprint !== fingerprint) + yield* publishFailure( + lifecycleError( + "take", + "rejected", + `dynamic tool invocation ${invocation.id} was replayed with different input`, + invocation.context.id, + ), + ) + return + } + const settled = completed.get(invocation.id) + if (settled !== undefined) { + if (settled !== fingerprint) + yield* publishFailure( + lifecycleError( + "take", + "rejected", + `dynamic tool invocation ${invocation.id} was reused with different input`, + invocation.context.id, + ), + ) + return + } + const record = makeInvocation(invocation, fingerprint) + records.set(invocation.id, record) + deliver(record) + }), + ) + + const receiveCancellation = (cancellation: Cancellation) => + lifecycle.withPermit( + Effect.sync(() => { + const record = records.get(cancellation.id) + if (record === undefined || record.state !== "pending") return + record.state = "cancelled" + remember(cancellation.id, record.fingerprint) + Deferred.doneUnsafe(record.cancelled, Effect.succeed(cancellation)) + if (record.claimed) records.delete(cancellation.id) + else { + deliver(record) + if (!record.claimed) retainCancellation(record) + } + }), + ) + + const connectBackend: Controller["connect"] = (backend) => + lifecycle.withPermit( + Effect.gen(function* () { + if (closed) + return yield* Effect.fail(lifecycleError("attach", "controller-closed", "dynamic tool controller is closed")) + if ((yield* Ref.get(current)) !== undefined) + return yield* Effect.fail(lifecycleError("attach", "rejected", "dynamic tool backend is already connected")) + const scope = yield* Scope.fork(parentScope) + yield* backend.toolEvents.pipe( + Stream.runForEach((event) => { + if (event.type === "invocation") return receiveInvocation(event.invocation) + if (event.type === "cancellation") return receiveCancellation(event.cancellation) + return Deferred.succeed(event.completed, undefined).pipe(Effect.asVoid) + }), + Effect.matchCauseEffect({ + onFailure: (cause) => { + const error = lifecycleError( + "take", + "rejected", + `dynamic tool event stream failed: ${Cause.pretty(cause)}`, + ) + return publishFailure(error) + }, + onSuccess: () => Effect.void, + }), + Effect.forkIn(scope), + ) + let replayed: AttachmentIntent | undefined + const applied = yield* Effect.exit( + attachmentLock.withPermit( + Effect.suspend(() => { + const intent = desired + if (intent === undefined) return Effect.void + replayed = intent + intent.attempted = true + const reject = (error: unknown) => + lifecycleError( + "attach", + isTransientConnectionError(error) ? "transport-interrupted" : "rejected", + String(error), + ) + return whileConnected(backend, "attach", backend.attachTools(intent.params.tools)).pipe( + Effect.tapError((error) => + error instanceof SimulationRequestError || error instanceof SimulationCompatibilityError + ? rejectIntent(intent, reject(error)) + : Effect.void, + ), + Effect.mapError(reject), + ) + }), + ), + ) + if (Exit.isFailure(applied)) { + yield* Scope.close(scope, Exit.void) + const defect = Cause.squash(applied.cause) + if (Schema.isSchemaError(defect)) { + const error = lifecycleError("attach", "rejected", defect.message) + if (replayed !== undefined) yield* rejectIntent(replayed, error) + return yield* Effect.fail(error) + } + const found = Cause.findErrorOption(applied.cause) + if ( + replayed !== undefined && + found._tag === "Some" && + found.value instanceof LifecycleError && + found.value.reason === "rejected" + ) + yield* rejectIntent(replayed, found.value) + return yield* Effect.failCause(applied.cause) + } + yield* Effect.sync(() => { + if (!generationActive) generationEnded = Deferred.makeUnsafe() + generationActive = true + }) + const disconnected = Deferred.makeUnsafe() + yield* Ref.set(current, { backend, scope, disconnected }) + yield* notifyBackend + const detach = Effect.fn("ToolProducer.detach")(function* () { + const shouldClose = yield* lifecycle.withPermit( + Effect.gen(function* () { + const attached = yield* Ref.get(current) + if (attached?.backend !== backend) return false + yield* Ref.set(current, undefined) + Deferred.doneUnsafe(disconnected, Effect.void) + yield* notifyBackend + return true + }), + ) + if (shouldClose) yield* Scope.close(scope, Exit.void) + }) + return { detach } + }), + ) + + const connectionClosed = () => lifecycleError("attach", "controller-closed", "dynamic tool controller is settled") + + const connect: Controller["connect"] = (backend) => + connectionCalls.withPermit( + Effect.suspend(() => (settled ? Effect.fail(connectionClosed()) : connectBackend(backend))), + ) + + const connectFrom: Controller["connectFrom"] = (backend) => + connectionCalls.withPermit( + Effect.suspend(() => + settled + ? Effect.fail(connectionClosed()) + : backend.pipe( + Effect.flatMap((backend) => + connectBackend(backend).pipe(Effect.map((attachment) => ({ backend, attachment }))), + ), + ), + ), + ) + + const replace = (params: AttachParams, duringSettlement = false) => + Effect.gen(function* () { + const previous = acknowledged + const intent: AttachmentIntent = { + params, + previous, + rejection: Deferred.makeUnsafe(), + attempted: false, + } + desired = intent + const rollback = Effect.sync(() => { + if (desired === intent) desired = previous + }) + const apply = Effect.raceFirst( + request("attach", undefined, (backend) => + attachmentLock.withPermit( + Effect.suspend(() => { + if (desired !== intent) return Effect.succeed({ attached: true as const }) + intent.attempted = true + return backend.attachTools(params.tools).pipe( + Effect.tapError((error) => { + if (!(error instanceof SimulationRequestError) && !(error instanceof SimulationCompatibilityError)) + return Effect.void + return rejectIntent(intent, lifecycleError("attach", "rejected", error.message)) + }), + ) + }), + ), + ).pipe( + Effect.tapError((error) => (error.reason === "rejected" ? rejectIntent(intent, error) : Effect.void)), + Effect.tapError(() => (intent.attempted ? Effect.void : rollback)), + Effect.onInterrupt(() => (intent.attempted ? Effect.void : rollback)), + ), + Deferred.await(intent.rejection), + ) + yield* duringSettlement + ? apply + : Effect.raceFirst( + apply, + Deferred.await(settlementStarted).pipe( + Effect.andThen( + Effect.fail(lifecycleError("attach", "controller-closed", "dynamic tool controller is settling")), + ), + ), + ) + if (desired === intent) { + intent.previous = undefined + acknowledged = intent + } + }) + + const attach: DynamicControls["attach"] = (params) => + Effect.gen(function* () { + const decoded = yield* decodeAttach(params).pipe( + Effect.mapError((error) => lifecycleError("attach", "rejected", error.message)), + ) + const collision = decoded.tools.map(Backend.exposedToolName).find((name) => staticNames.has(name)) + if (collision !== undefined) + yield* Effect.fail( + lifecycleError("attach", "rejected", `dynamic tool conflicts with configured static adapter: ${collision}`), + ) + yield* attachmentCalls.withPermit( + Effect.suspend(() => + settling + ? Effect.fail(lifecycleError("attach", "controller-closed", "dynamic tool controller is settling")) + : replace(decoded), + ), + ) + return undefined + }) + + function take(): Effect.Effect + function take(callID: string): Effect.Effect + function take(callID?: string): Effect.Effect { + const decoded: Effect.Effect = + callID === undefined + ? Effect.succeed(undefined) + : decodeCallID(callID).pipe(Effect.mapError((error) => lifecycleError("take", "rejected", error.message))) + return decoded.pipe( + Effect.flatMap((callID) => + Effect.callback((resume) => { + if (closed || settled) { + resume( + Effect.fail( + lifecycleError( + "take", + "controller-closed", + settled ? "dynamic tool controller is settled" : "dynamic tool controller is closed", + callID, + ), + ), + ) + return undefined + } + if ( + callID !== undefined && + (Array.from(records.values()).some((record) => record.call.context.callID === callID && record.claimed) || + waiters.some((waiter) => waiter.callID === callID)) + ) { + resume( + Effect.fail( + lifecycleError("take", "already-claimed", `dynamic tool call is already claimed: ${callID}`, callID), + ), + ) + return undefined + } + let record = Array.from(records.values()).find( + (candidate) => !candidate.claimed && (callID === undefined || candidate.call.context.callID === callID), + ) + if (record !== undefined) { + record.claimed = true + resume(Effect.succeed(record.call)) + if (record.state === "cancelled") records.delete(record.call.id) + return Effect.sync(() => { + if (record !== undefined && records.get(record.call.id) === record) { + record.claimed = false + deliver(record) + } + }) + } + const waiter: Waiter = { callID, resume } + waiters.push(waiter) + return Effect.sync(() => { + const index = waiters.indexOf(waiter) + if (index >= 0) waiters.splice(index, 1) + else if (waiter.delivered !== undefined) { + record = waiter.delivered + if (records.get(record.call.id) === record) { + record.claimed = false + deliver(record) + } + } + }) + }), + ), + ) + } + + const endGeneration = lifecycle.withPermit( + Effect.gen(function* () { + generationActive = false + Deferred.doneUnsafe(generationEnded, Effect.void) + const attached = yield* Ref.get(current) + if (attached !== undefined) { + yield* Ref.set(current, undefined) + Deferred.doneUnsafe(attached.disconnected, Effect.void) + yield* Scope.close(attached.scope, Exit.void) + } + for (const record of records.values()) { + if (record.state !== "pending") continue + record.state = "cancelled" + Deferred.doneUnsafe(record.cancelled, Effect.succeed({ id: record.call.id, reason: "interrupted" })) + } + records.clear() + completed.clear() + unclaimedCancellations.length = 0 + yield* notifyBackend + }), + ) + + function commitSettlement(): Effect.Effect { + return Effect.gen(function* () { + const retryAfter = yield* connectionCalls.withPermit( + Effect.gen(function* () { + const attached = yield* Ref.get(current) + if (generationActive && attached === undefined) return generationEnded + if (generationActive && attached !== undefined) { + const drained = yield* Effect.raceFirst( + attached.backend.flushToolEvents().pipe( + Effect.mapError((error) => lifecycleError("take", "rejected", error.message)), + Effect.as(true), + ), + Deferred.await(attached.disconnected).pipe(Effect.as(false)), + ) + if (!drained) return generationEnded + } + if (terminalFailure !== undefined) return yield* Effect.fail(terminalFailure) + yield* lifecycle.withPermit( + Effect.suspend(() => { + if (terminalFailure !== undefined) return Effect.fail(terminalFailure) + const pending = Array.from(records.values()).filter((record) => record.state === "pending").length + if (pending > 0) + return Effect.fail( + lifecycleError("take", "rejected", `${pending} dynamic tool invocation(s) remain unsettled`), + ) + return Effect.sync(() => { + settled = true + for (const waiter of waiters) + waiter.resume( + Effect.fail( + lifecycleError("take", "controller-closed", "dynamic tool controller is settled", waiter.callID), + ), + ) + waiters.length = 0 + }) + }), + ) + return undefined + }), + ) + if (retryAfter === undefined) return + yield* Effect.raceFirst( + Deferred.await(retryAfter), + Effect.raceFirst(awaitBackend("take", undefined).pipe(Effect.asVoid), Deferred.await(failure)), + ) + yield* commitSettlement() + }) + } + + const settle = Effect.sync(() => { + settling = true + Deferred.doneUnsafe(settlementStarted, Effect.void) + }).pipe( + Effect.andThen( + attachmentCalls.withPermit( + Effect.gen(function* () { + yield* connectionCalls.withPermit(Effect.void) + if (terminalFailure !== undefined) return yield* Effect.fail(terminalFailure) + if (generationActive && desired !== undefined) { + const ended = generationEnded + if (desired.params.tools.length > 0) + yield* Effect.raceFirst(replace({ tools: [] }, true), Deferred.await(ended)) + if (generationActive) + yield* Effect.raceFirst( + request("take", undefined, (backend) => backend.flushToolEvents()), + Deferred.await(ended), + ) + } + if (terminalFailure !== undefined) return yield* Effect.fail(terminalFailure) + yield* commitSettlement() + return undefined + }), + ), + ), + ) + + const shutdown = Effect.suspend(() => { + if (closed) return Effect.void + return Effect.sync(() => { + closed = true + for (const waiter of waiters) + waiter.resume( + Effect.fail(lifecycleError("take", "controller-closed", "dynamic tool controller is closed", waiter.callID)), + ) + waiters.length = 0 + }).pipe(Effect.andThen(endGeneration), Effect.ensuring(Queue.shutdown(backendChanges))) + }) + + yield* Effect.addFinalizer(() => shutdown) + + return { + controls: { attach, take }, + connect, + connectFrom, + endGeneration, + settle, + shutdown, + failure: Deferred.await(failure), + } satisfies Controller +}) + +function canonicalJson(value: unknown): string { + if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]` + if (typeof value === "object" && value !== null) { + const entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right)) + return `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`).join(",")}}` + } + return JSON.stringify(value) ?? String(value) +} + +function fingerprintJson(value: unknown) { + return createHash("sha256").update(canonicalJson(value)).digest("base64url") +} + +function isTransientConnectionError(error: unknown) { + return ( + error instanceof SimulationConnectionError || + (error instanceof RpcClientError.RpcClientError && isTransientRpcError(error)) + ) +} + +function isTransientRpcError(error: RpcClientError.RpcClientError) { + if (error.reason._tag !== "RpcClientDefect") return true + const message = error.reason.message + return ( + message.startsWith("cannot connect") || + message === "connection closed" || + message === "connection error" || + message === "connection is not open" || + message === "failed to send request" + ) +} + +export * as ToolProducer from "./producer.js" diff --git a/packages/drive/src/tool/types.ts b/packages/drive/src/tool/types.ts new file mode 100644 index 00000000000..7c8e760eb6c --- /dev/null +++ b/packages/drive/src/tool/types.ts @@ -0,0 +1,202 @@ +import * as Effect from "effect/Effect" +import * as Schema from "effect/Schema" +import { Backend } from "@opencode-ai/protocol/simulation" + +const PositiveInt = Schema.Number.check(Schema.isInt(), Schema.isGreaterThan(0)) + +export const ShellInput = Schema.Struct({ + command: Schema.String.annotate({ description: "Shell command string to execute" }), + workdir: Schema.optional(Schema.String).annotate({ + description: "Working directory. Defaults to the active Location; relative paths resolve from that Location.", + }), + timeout: Schema.optional( + Schema.Number.check(Schema.isFinite(), Schema.isGreaterThanOrEqualTo(0), Schema.isLessThanOrEqualTo(600_000)), + ).annotate({ description: "Optional timeout in milliseconds. Zero means unlimited. May not exceed 600000." }), + background: Schema.optional(Schema.Boolean).annotate({ description: "Run the command in the background." }), +}) +export interface ShellInput extends Schema.Schema.Type {} + +export const ShellResult = Schema.Struct({ + output: Schema.String, + exit: Schema.optional(Schema.Number), + shellID: Schema.optional(Schema.String), + truncated: Schema.optional(Schema.Boolean), + timeout: Schema.optional(Schema.Boolean), + status: Schema.optional(Schema.Literals(["completed", "running"])), + warnings: Schema.optional(Schema.Array(Schema.String)), +}) +export interface ShellResult extends Schema.Schema.Type {} + +export const WebFetchInput = Schema.Struct({ + url: Schema.String.annotate({ description: "The HTTP or HTTPS URL to fetch content from" }), + format: Schema.Literals(["text", "markdown", "html"]) + .annotate({ description: "The format to return the content in. Defaults to markdown." }) + .pipe(Schema.withDecodingDefault(Effect.succeed("markdown" as const))), + timeout: Schema.optional(Schema.Number.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(120))).annotate({ + description: "Optional timeout in seconds (maximum: 120)", + }), +}) +export interface WebFetchInput extends Schema.Schema.Type {} + +export const WebFetchResult = Schema.Struct({ + output: Schema.String, + url: Schema.optional(Schema.String), + contentType: Schema.optional(Schema.String), + format: Schema.optional(Schema.Literals(["text", "markdown", "html"])), +}) +export interface WebFetchResult extends Schema.Schema.Type {} + +export const WebSearchInput = Schema.Struct({ + query: Schema.String.annotate({ description: "Websearch query" }), + numResults: Schema.optional(PositiveInt.check(Schema.isLessThanOrEqualTo(20))), + livecrawl: Schema.optional(Schema.Literals(["fallback", "preferred"])), + type: Schema.optional(Schema.Literals(["auto", "fast", "deep"])), + contextMaxCharacters: Schema.optional(PositiveInt.check(Schema.isLessThanOrEqualTo(50_000))), +}) +export interface WebSearchInput extends Schema.Schema.Type {} + +export const WebSearchResult = Schema.Struct({ + output: Schema.String, + provider: Schema.optional(Schema.Literals(["exa", "parallel"])), +}) +export interface WebSearchResult extends Schema.Schema.Type {} + +export const WriteInput = Schema.Struct({ + path: Schema.String.annotate({ description: "Path to the file to write to" }), + content: Schema.String.annotate({ description: "Content to write to the file" }), +}) +export interface WriteInput extends Schema.Schema.Type {} + +export const WriteResult = Schema.Struct({ + output: Schema.String, +}) +export interface WriteResult extends Schema.Schema.Type {} + +export class Failure extends Schema.TaggedErrorClass()("OpenCodeDrive.ToolFailure", { + message: Schema.String, +}) {} + +export const Name = Schema.Literals(["shell", "webfetch", "websearch", "write"]) +export type Name = typeof Name.Type +export const Names = Schema.Array(Name) + +export class ControlError extends Schema.TaggedErrorClass()("OpenCodeDrive.ToolControlError", { + operation: Schema.Literals(["control", "take", "progress", "succeed", "fail"]), + reason: Schema.Literals([ + "not-controlled", + "controller-closed", + "already-claimed", + "already-settled", + "transport-interrupted", + ]), + name: Name, + callID: Schema.optional(Schema.String), + message: Schema.String, +}) {} + +export interface Context { + readonly id: string + readonly input: Input + /** Zero-based invocation index for this handler. */ + readonly index: number + readonly progress: (output: string | Result) => Effect.Effect +} + +export type Handler = (context: Context) => Effect.Effect + +export type ShellHandler = Handler +export type WebFetchHandler = Handler +export type WebSearchHandler = Handler +export type WriteHandler = Handler + +export interface ToolTypes { + readonly shell: { readonly input: ShellInput; readonly result: ShellResult } + readonly webfetch: { readonly input: WebFetchInput; readonly result: WebFetchResult } + readonly websearch: { readonly input: WebSearchInput; readonly result: WebSearchResult } + readonly write: { readonly input: WriteInput; readonly result: WriteResult } +} + +export type HandlerFor = Handler + +export type Registration = { + readonly [Tool in Name]: readonly [name: Tool, handler: HandlerFor] +}[Name] + +export interface Registry { + handle(name: Tool, handler: HandlerFor): void +} + +export type Setup = (tools: Registry) => void + +export type Configuration = Setup | typeof Names.Type + +export interface ControlledCall { + readonly id: string + readonly input: Input + readonly index: number + readonly progress: (output: string | Result) => Effect.Effect + readonly succeed: (result: Result) => Effect.Effect + /** Commits a failed remote tool result; this Effect fails only when control is no longer available. */ + readonly fail: (message: string) => Effect.Effect + /** Completes only when interruption wins before `succeed` or `fail`. */ + readonly awaitInterrupted: () => Effect.Effect +} + +export interface ControlledCalls { + take(): Effect.Effect, ControlError> + take(id: string): Effect.Effect, ControlError> +} + +export type ControlledCallsFor = ControlledCalls + +export interface StaticControls { + control(name: Tool): Effect.Effect, ControlError> +} + +export type Content = Backend.ToolContent +export type DynamicRegistration = Backend.ToolRegistration +export type AttachParams = Backend.ToolAttachParams +export const Progress = Schema.Struct({ + structured: Schema.Record(Schema.String, Schema.Json), + content: Schema.optionalKey(Schema.Array(Backend.ToolContent)), +}) +export interface Progress extends Schema.Schema.Type {} +export type Output = Backend.ToolOutput +export type Cancellation = Backend.ToolCancellation + +export class LifecycleError extends Schema.TaggedErrorClass()("OpenCodeDrive.ToolLifecycleError", { + operation: Schema.Literals(["attach", "take", "progress", "finish", "fail"]), + reason: Schema.Literals([ + "controller-closed", + "already-claimed", + "already-settled", + "cancelled", + "rejected", + "transport-interrupted", + ]), + callID: Schema.optional(Schema.String), + message: Schema.String, +}) {} + +export interface Invocation { + /** Producer invocation ID, stable across controller reconnects. */ + readonly id: string + /** Effective provider-visible name, including any flattened namespace. */ + readonly name: string + readonly input: Backend.ToolInvocation["input"] + readonly context: Omit & { readonly callID: string } + readonly progress: (update: Progress) => Effect.Effect + readonly finish: (output: Output) => Effect.Effect + readonly fail: (message: string) => Effect.Effect + /** Completes only when OpenCode cancels before `finish` or `fail`. */ + readonly awaitCancelled: () => Effect.Effect +} + +export interface DynamicControls { + /** Atomically replaces the complete provider-backed dynamic tool set. */ + readonly attach: (params: AttachParams) => Effect.Effect + take(): Effect.Effect + take(callID: string): Effect.Effect +} + +export interface Controls extends StaticControls, DynamicControls {} diff --git a/packages/drive/test/cli/check.test.ts b/packages/drive/test/cli/check.test.ts new file mode 100644 index 00000000000..aa76fb7dadf --- /dev/null +++ b/packages/drive/test/cli/check.test.ts @@ -0,0 +1,29 @@ +import { describe, expect, test } from "vitest" +import { effectScriptHint } from "../../src/cli/check.js" + +const promiseDiagnostic = (line: number) => + `/tmp/drive.ts:${line}:10 - error TS2322: Type 'Promise' is not assignable to type 'Effect'.` + +describe("Effect script check hints", () => { + test.each([ + ['defineScript({ run: async ({ ui }) => { await ui.submit("Hello") } })', "run: ({ ui }) =>"], + ["defineScript({ setup: () => Promise.resolve() })", "setup: ({ fs }) => fs.writeFile"], + [ + "defineScript({ run: ({ ui }) => ui.waitFor(() => Promise.resolve(false)) })", + "ui.waitFor((state) => Effect.succeed", + ], + ])("describes the failing Promise callback", (callback, expected) => { + const source = `import { defineScript } from "opencode-drive"\n${callback}\n` + expect(effectScriptHint(source, promiseDiagnostic(2))).toContain(expected) + }) + + test("ignores Promise diagnostics on unrelated source lines", () => { + const source = [ + 'import { defineScript } from "opencode-drive"', + "// run: async () => {}", + "const value: Effect.Effect = Promise.resolve()", + "defineScript({ run: () => Effect.void })", + ].join("\n") + expect(effectScriptHint(source, promiseDiagnostic(3))).toBeUndefined() + }) +}) diff --git a/packages/drive/test/cli/integration.test.ts b/packages/drive/test/cli/integration.test.ts new file mode 100644 index 00000000000..5bdf18dff18 --- /dev/null +++ b/packages/drive/test/cli/integration.test.ts @@ -0,0 +1,1816 @@ +import { afterEach, describe, expect, setDefaultTimeout, test } from "bun:test" +import { mkdir, mkdtemp, readdir, realpath, rm } from "node:fs/promises" +import { tmpdir } from "node:os" +import { basename, dirname, join, resolve } from "node:path" +import { + controlPath, + initializeManifest, + listInstances, + manifestPath, + register, + unregister, + type InstanceManifest, +} from "../../src/instance/registry.js" +import { createResponseSettings, generateResponse } from "../../src/cli/response-generator.js" +import { CommandBatchError, executeCommands } from "../../src/cli/commands.js" +import { splitText } from "../../src/cli/mock-backend.js" +import { resolveSendEndpoint } from "../../src/cli/send.js" +import { sendError, sendResult, startTransportPeer } from "../simulation/transport-peer.js" + +const roots: string[] = [] +const instances: Array<{ root: string; name: string }> = [] + +setDefaultTimeout(30_000) + +afterEach(async () => { + await Promise.all( + instances.splice(0).map(async ({ root, name }) => { + await spawn(["stop", "--name", name], root).exited + }), + ) + await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true }))) +}) + +describe("opencode-drive", () => { + test("rejects unsupported optional UI commands without sending them", async () => { + const peers = [ + startTransportPeer( + ({ request, socket }) => { + if (request.method !== "simulation.handshake") return + const params = request.params as { + readonly requiredCapabilities: ReadonlyArray + } + sendResult(socket, request, { + protocolVersion: 1, + role: "ui", + server: { name: "opencode", version: "older" }, + capabilities: params.requiredCapabilities, + }) + }, + { handshake: false }, + ), + startTransportPeer( + ({ request, socket }) => { + if (request.method === "simulation.handshake") sendError(socket, request, "method not found", -32601) + }, + { handshake: false }, + ), + ] + + try { + for (const peer of peers) { + for (const expected of [ + { + command: { operation: "ui.snapshot" as const }, + method: "ui.snapshot", + message: "ui.snapshot is not available on this OpenCode endpoint", + }, + { + command: { + operation: "ui.click" as const, + value: JSON.stringify({ + target: 3, + x: 1, + y: 0, + semantic: { + id: "session.permission.action.once", + instance: "permission-1", + element: 3, + }, + }), + }, + method: "ui.click", + message: "semantic ui.click is not available on this OpenCode endpoint", + }, + ]) { + const result = executeCommands(peer.url, [expected.command]) + await expect(result).rejects.toMatchObject({ + name: "CommandBatchError", + reason: { + name: "SimulationError", + method: expected.method, + message: expected.message, + }, + } satisfies Partial) + } + expect(peer.received.map(({ request }) => request.method)).toEqual([ + "simulation.handshake", + "simulation.handshake", + ]) + } + } finally { + await Promise.all(peers.map((peer) => peer.stop())) + } + }) + + test("requires an explicit name to initialize or start headless", async () => { + const root = await temporary() + for (const command of ["init", "start"]) { + const child = spawn([command], root) + expect(await child.exited).toBe(1) + expect(await new Response(child.stderr).text()).toContain("--name") + } + }) + + test("initializes artifacts and starts from the prepared instance", async () => { + const root = await temporary() + const name = "initialized-test" + const initialized = spawn(["init", "--name", name], root) + const [initStatus, initOutput] = await Promise.all([initialized.exited, new Response(initialized.stdout).text()]) + expect(initStatus).toBe(0) + const artifacts = initOutput.trim() + expect(await Bun.file(join(artifacts, "files", ".opencode", "opencode.jsonc")).exists()).toBe(true) + expect(await Bun.file(join(artifacts, "files", ".opencode", "opencode.jsonc")).json()).toMatchObject({ + model: "simulation/gpt-sim-model", + snapshots: false, + permissions: [{ action: "*", resource: "*", effect: "allow" }], + providers: { + simulation: { + package: "@opencode-ai/ai/providers/openai/chat", + settings: { apiKey: "sim-key" }, + models: { "gpt-sim-model": { capabilities: { tools: true } } }, + }, + }, + }) + expect(await Bun.file(join(artifacts, "drive", "name")).text()).toBe(`${name}\n`) + expect(await Bun.file(join(root, "registry", `${name}.json`)).json()).toMatchObject({ + name, + artifacts, + status: "initialized", + }) + const repeated = spawn(["init", "--name", name], root) + expect(await repeated.exited).toBe(0) + expect((await new Response(repeated.stdout).text()).trim()).toBe(artifacts) + const listed = spawn(["list"], root) + expect(await listed.exited).toBe(0) + expect(await new Response(listed.stdout).text()).toBe(`${name}: ${join(root, "registry", `${name}.json`)}\n`) + + await Bun.write(join(artifacts, "prepared.txt"), "prepared before start\n") + const started = spawn(["start", "--name", name, "--", process.execPath, fixture("fake-opencode.ts")], root) + const [startStatus, startError] = await Promise.all([started.exited, new Response(started.stderr).text()]) + expect(startStatus).toBe(0) + expect(startError).toContain(`opencode-drive: using artifacts ${artifacts}`) + instances.push({ root, name }) + expect(await Bun.file(join(artifacts, "prepared.txt")).text()).toBe("prepared before start\n") + expect(await Bun.file(join(root, "registry", `${name}.json`)).json()).toMatchObject({ + name, + artifacts, + status: "ready", + }) + }) + + test("starts, drives, prints dir, restarts, and stops a named detached instance", async () => { + const root = await temporary() + const name = "detached-test" + const started = spawn( + ["start", "--name", name, "--record", "--", process.execPath, fixture("fake-opencode.ts")], + root, + ) + const [startStatus, startError] = await Promise.all([started.exited, new Response(started.stderr).text()]) + expect(startStatus).toBe(0) + expect(startError).toContain("opencode-drive: using artifacts ") + const startArtifacts = artifactPath(startError) + expect(startError).toContain( + `opencode-drive: opencode instance logs: ${join(startArtifacts, "logs", "opencode", "log", "opencode*.log")}`, + ) + expect(startError).toContain( + `opencode-drive: current run script logs: ${join(startArtifacts, "logs", "opencode-drive.log")}`, + ) + expect(startError).not.toContain(`opencode-drive: ${name}`) + instances.push({ root, name }) + + const manifest = await Bun.file(join(root, "registry", `${name}.json`)).json() + expect(manifest.visible).toBe(false) + expect(manifest.endpoints.ui).toMatch(/^ws:\/\/127\.0\.0\.1:\d+$/) + expect(manifest.endpoints.backend).toMatch(/^ws:\/\/127\.0\.0\.1:\d+$/) + + const state = spawn(["send", "--name", name, "--command.ui.state"], root) + expect(await state.exited).toBe(0) + expect(JSON.parse(await new Response(state.stdout).text()).focused.editor).toBe(true) + + const snapshot = spawn(["send", "--name", name, "--command.ui.snapshot"], root) + expect(await snapshot.exited).toBe(0) + expect(JSON.parse(await new Response(snapshot.stdout).text())).toMatchObject({ + format: "opencode-ui-snapshot-v1", + nodes: [{ id: "prompt", role: "textbox", element: 1 }], + }) + + const matches = spawn(["send", "--name", name, "--command.ui.matches", '{"text":"Fake OpenCode"}'], root) + expect(await matches.exited).toBe(0) + expect(await new Response(matches.stdout).text()).toBe("true\n") + + const literal = spawn(["send", "--name", name, "--command.ui.matches", '{"text":"Fake.*OpenCode"}'], root) + expect(await literal.exited).toBe(0) + expect(await new Response(literal.stdout).text()).toBe("false\n") + + const screenshot = spawn(["send", "--name", name, "--command.ui.screenshot"], root) + expect(await screenshot.exited).toBe(0) + const screenshotPath = (await new Response(screenshot.stdout).text()).trim() + expect(dirname(screenshotPath)).toBe(runOutputDirectory(root, manifest.artifacts, 0)) + expect(basename(screenshotPath).startsWith("screenshot-")).toBe(true) + expect(screenshotPath.endsWith(".png")).toBe(true) + + const listed = spawn(["dir", "--name", name], root) + expect(await listed.exited).toBe(0) + expect(await new Response(listed.stdout).text()).toBe(`${manifest.artifacts}\n`) + const driveLog = join(manifest.artifacts, "logs", "opencode-drive.log") + const driveLogText = await Bun.file(driveLog).text() + expect(driveLogText).toContain("INFO ready detached-test") + expect(driveLogText).toContain( + `INFO opencode instance logs: ${join(manifest.artifacts, "logs", "opencode", "log", "opencode*.log")}`, + ) + expect(driveLogText).toContain(`INFO current run script logs: ${driveLog}`) + expect(driveLogText).toContain("INFO ui command ui.state params=undefined") + expect(driveLogText).toContain('INFO ui command ui.matches params={"text":"Fake OpenCode"}') + + const restarted = spawn(["restart", "--name", name], root) + expect(await restarted.exited).toBe(0) + const restartedRecording = (await new Response(restarted.stdout).text()).trim() + expect(dirname(restartedRecording)).toBe(runOutputDirectory(root, manifest.artifacts, 0)) + expect(basename(restartedRecording)).toMatch(/^recording-.*\.mp4$/) + expect(await Bun.file(restartedRecording).exists()).toBe(true) + await waitForLines(join(manifest.artifacts, "launches.txt"), 2) + expect(await spawn(["send", "--name", name, "--command.ui.state"], root).exited).toBe(0) + + const stopped = spawn(["stop", "--name", name], root) + const [stoppedStatus, stoppedOutput, stoppedError] = await Promise.all([ + stopped.exited, + new Response(stopped.stdout).text(), + new Response(stopped.stderr).text(), + ]) + expect(stoppedStatus).toBe(0) + expect(stoppedOutput).toBe("") + const stoppedRecording = stoppedError.match(/Video successfully created: (.+\.mp4)/)?.[1] + expect(stoppedRecording).toBeDefined() + expect(dirname(stoppedRecording!)).toBe(runOutputDirectory(root, manifest.artifacts, 1)) + expect(basename(stoppedRecording!)).toMatch(/^recording-.*\.mp4$/) + expect(await Bun.file(stoppedRecording!).exists()).toBe(true) + expect(stoppedError).toContain("Rendering video: 10%") + expect(stoppedError).toContain("Rendering video: 100%") + expect(stoppedError).toContain(`Video successfully created: ${stoppedRecording}`) + expect(await Bun.file(join(root, "registry", `${name}.json`)).exists()).toBe(false) + expect(await Bun.file(manifest.artifacts).exists()).toBe(false) + instances.splice( + instances.findIndex((item) => item.name === name), + 1, + ) + }, 60_000) + + test("exports a completed timeline after the OpenCode child exits", async () => { + const root = await temporary() + const name = "exited-recording-test" + const started = spawn( + ["start", "--name", name, "--record", "--", process.execPath, fixture("fake-opencode.ts"), "exit-after-attach"], + root, + ) + const [status, stderr] = await Promise.all([started.exited, new Response(started.stderr).text()]) + expect(status, stderr).toBe(0) + const artifacts = stderr.match(/opencode-drive: using artifacts (.+)/)?.[1] + expect(artifacts).toBeDefined() + + const deadline = Date.now() + 10_000 + while (await Bun.file(join(root, "registry", `${name}.json`)).exists()) { + if (Date.now() >= deadline) throw new Error("timed out waiting for exited instance cleanup") + await Bun.sleep(25) + } + const directory = runOutputDirectory(root, artifacts!, 0) + const files = await readdir(directory) + const video = files.find((file) => file.endsWith(".mp4")) + expect(video).toBeDefined() + expect(await Bun.file(join(directory, video!)).size).toBeGreaterThan(500) + }, 15_000) + + test("does not record unless start receives --record", async () => { + const root = await temporary() + const name = "no-recording-test" + expect( + await spawn(["start", "--name", name, "--", process.execPath, fixture("fake-opencode.ts")], root).exited, + ).toBe(0) + instances.push({ root, name }) + const manifest = await Bun.file(join(root, "registry", `${name}.json`)).json() + const drive = await Bun.file(join(manifest.artifacts, "drive", `${name}.json`)).json() + expect(drive.recording).toBeUndefined() + + const stopped = spawn(["stop", "--name", name], root) + expect(await stopped.exited).toBe(0) + expect(await new Response(stopped.stdout).text()).toBe("success\n") + expect(await Bun.file(join(root, "output")).exists()).toBe(false) + expect(await Bun.file(manifest.artifacts).exists()).toBe(false) + instances.pop() + }) + + test("rejects duplicate names", async () => { + const root = await temporary() + const name = "duplicate-test" + const args = ["start", "--name", name, "--", process.execPath, fixture("fake-opencode.ts")] + expect(await spawn(args, root).exited).toBe(0) + instances.push({ root, name }) + const duplicate = spawn(args, root) + const [status, stderr] = await Promise.all([duplicate.exited, new Response(duplicate.stderr).text()]) + expect(status).toBe(1) + expect(stderr).toContain(`drive instance "${name}" is already running`) + }) + + test( + "only the owning detached launcher starts an automatic instance", + () => expectSingleConcurrentStart(false), + 75_000, + ) + + test("only the owning detached launcher starts a prepared instance", () => expectSingleConcurrentStart(true), 75_000) + + test("registers only one concurrent owner for a name", async () => { + const root = await temporary() + await withRegistry(root, async () => { + const results = await Promise.allSettled([ + register(testManifest("racing", process.pid)), + register(testManifest("racing", process.pid)), + ]) + expect(results.filter((result) => result.status === "fulfilled")).toHaveLength(1) + expect(results.filter((result) => result.status === "rejected")).toHaveLength(1) + }) + }) + + test("transfers temporary initialization only to its declared daemon", async () => { + const root = await temporary() + const owner = Bun.spawn([process.execPath, "-e", "await Bun.sleep(60_000)"]) + try { + await withRegistry(root, async () => { + const name = "temporary-owner" + const artifacts = join(root, "artifacts") + await mkdir(join(root, "registry"), { recursive: true }) + await Bun.write( + manifestPath(name), + `${JSON.stringify({ + version: 1, + name, + createdAt: new Date().toISOString(), + cwd: root, + artifacts, + status: "initialized", + temporary: true, + pid: owner.pid, + })}\n`, + ) + const create = async () => { + throw new Error("existing initialization was replaced") + } + + await expect(initializeManifest(name, root, create, { temporary: true })).rejects.toThrow( + `drive instance "${name}" is already starting`, + ) + owner.kill() + await owner.exited + expect( + await initializeManifest(name, root, create, { + temporary: true, + adoptPid: owner.pid, + }), + ).toMatchObject({ pid: process.pid, artifacts }) + await expect(register(testManifest(name, owner.pid))).rejects.toThrow( + `drive instance "${name}" changed ownership`, + ) + }) + } finally { + if (owner.exitCode === null) owner.kill() + await owner.exited + } + }) + + test("preserves prepared artifacts when reclaiming a dead launcher", async () => { + const root = await temporary() + await withRegistry(root, async () => { + const name = "prepared-owner" + const artifacts = join(root, "prepared-artifacts") + await mkdir(join(root, "registry"), { recursive: true }) + await Bun.write( + manifestPath(name), + `${JSON.stringify({ + version: 1, + name, + createdAt: new Date().toISOString(), + cwd: root, + artifacts, + status: "initialized", + pid: 2_000_000_000, + })}\n`, + ) + + const create = async () => { + throw new Error("prepared artifacts were replaced") + } + const released = await initializeManifest(name, root, create) + expect(released).toMatchObject({ artifacts }) + expect("pid" in released).toBe(false) + expect("pid" in (await Bun.file(manifestPath(name)).json())).toBe(false) + + const reclaimed = await initializeManifest(name, root, create, { temporary: true }) + expect(reclaimed).toMatchObject({ pid: process.pid, artifacts }) + expect("temporary" in reclaimed).toBe(false) + }) + }) + + test("registers only one visible instance", async () => { + const root = await temporary() + await withRegistry(root, async () => { + await register({ + ...testManifest("first-visible", process.pid), + visible: true, + }) + await expect( + register({ + ...testManifest("second-visible", process.pid), + visible: true, + }), + ).rejects.toThrow('visible drive instance "first-visible" is already running') + }) + }) + + test("falls back to the default UI endpoint when no visible instance is registered", async () => { + const root = await temporary() + await withRegistry(root, async () => { + await register(testManifest("headless", process.pid)) + expect(await resolveSendEndpoint()).toBe("ws://127.0.0.1:40900") + }) + }) + + test("does not let a stale owner remove its replacement", async () => { + const root = await temporary() + await withRegistry(root, async () => { + const stalePid = 2_000_000_000 + await register(testManifest("replacement", stalePid)) + await register(testManifest("replacement", process.pid)) + await unregister("replacement", stalePid) + expect((await Bun.file(manifestPath("replacement")).json()).pid).toBe(process.pid) + }) + }) + + test("refuses to drive an instance that is still starting", async () => { + const root = await temporary() + await withRegistry(root, () => register(testManifest("starting", process.pid, "starting"))) + const child = spawn(["send", "--name", "starting", "--command.ui.state"], root) + const [status, stderr] = await Promise.all([child.exited, new Response(child.stderr).text()]) + expect(status).toBe(1) + expect(stderr).toContain('drive instance "starting" is still starting') + }) + + test("lists sorted active instances and prunes stale state", async () => { + const root = await temporary() + await withRegistry(root, async () => { + await register(testManifest("zeta", process.pid)) + await register(testManifest("alpha", process.pid)) + await register(testManifest("stale", 2_000_000_000)) + await Bun.write(controlPath("orphan"), "") + expect((await listInstances()).map((manifest) => manifest.name)).toEqual(["alpha", "zeta"]) + expect(await Bun.file(manifestPath("stale")).exists()).toBe(false) + expect(await Bun.file(controlPath("stale")).exists()).toBe(false) + expect(await Bun.file(controlPath("orphan")).exists()).toBe(false) + }) + const listed = spawn(["list"], root) + expect(await listed.exited).toBe(0) + expect(await new Response(listed.stdout).text()).toBe( + `alpha: ${join(root, "registry", "alpha.json")}\nzeta: ${join(root, "registry", "zeta.json")}\n`, + ) + }) + + test("prunes dead transient initialized manifests", async () => { + const root = await temporary() + await withRegistry(root, async () => { + const stalePid = 2_000_000_000 + await Bun.write( + manifestPath("temporary-initialized"), + `${JSON.stringify({ + version: 1, + name: "temporary-initialized", + createdAt: new Date().toISOString(), + cwd: root, + artifacts: join(root, "opencode-drive", "run-temporary"), + status: "initialized", + temporary: true, + pid: stalePid, + })}\n`, + ) + await Bun.write( + manifestPath("visible-12345"), + `${JSON.stringify({ + version: 1, + name: "visible-12345", + createdAt: new Date().toISOString(), + cwd: root, + artifacts: join(root, "opencode-drive", "run-visible"), + status: "initialized", + })}\n`, + ) + + expect(await listInstances()).toEqual([]) + expect(await Bun.file(manifestPath("temporary-initialized")).exists()).toBe(false) + expect(await Bun.file(manifestPath("visible-12345")).exists()).toBe(false) + }) + }) + + test("prunes artifact directories not referenced by active sessions", async () => { + const root = await temporary() + const artifactsRoot = join(root, "opencode-drive") + const active = join(artifactsRoot, "run-active") + const initialized = join(artifactsRoot, "run-initialized") + const visible = join(artifactsRoot, "run-visible") + const stale = join(artifactsRoot, "run-stale") + const unrelated = join(artifactsRoot, "other") + await Promise.all( + [active, initialized, visible, stale, unrelated].map((directory) => + Bun.write(join(directory, "marker.txt"), "artifact\n"), + ), + ) + await withRegistry(root, async () => { + await register({ + ...testManifest("active", process.pid), + artifacts: active, + }) + await Bun.write( + manifestPath("initialized"), + `${JSON.stringify({ + version: 1, + name: "initialized", + createdAt: new Date().toISOString(), + cwd: root, + artifacts: initialized, + status: "initialized", + })}\n`, + ) + await Bun.write( + manifestPath("visible-12345"), + `${JSON.stringify({ + version: 1, + name: "visible-12345", + createdAt: new Date().toISOString(), + cwd: root, + artifacts: visible, + status: "initialized", + })}\n`, + ) + }) + + const child = spawn(["prune"], root) + expect(await child.exited).toBe(0) + expect(await new Response(child.stdout).text()).toBe("2\n") + expect(await Bun.file(join(active, "marker.txt")).exists()).toBe(true) + expect(await Bun.file(join(initialized, "marker.txt")).exists()).toBe(true) + expect(await Bun.file(join(visible, "marker.txt")).exists()).toBe(false) + expect(await Bun.file(join(stale, "marker.txt")).exists()).toBe(false) + expect(await Bun.file(join(unrelated, "marker.txt")).exists()).toBe(true) + }) + + test("prunes one named inactive artifact directory", async () => { + const root = await temporary() + const artifactsRoot = join(root, "opencode-drive") + const active = join(artifactsRoot, "run-active") + const staleA = join(artifactsRoot, "run-stale-a") + const staleB = join(artifactsRoot, "run-stale-b") + await Promise.all( + [active, staleA, staleB].map((directory) => Bun.write(join(directory, "marker.txt"), "artifact\n")), + ) + await Promise.all([ + Bun.write(join(active, "drive", "name"), "active\n"), + Bun.write(join(staleA, "drive", "name"), "stale-a\n"), + Bun.write(join(staleB, "drive", "name"), "stale-b\n"), + ]) + await withRegistry(root, async () => { + await register({ + ...testManifest("active", process.pid), + artifacts: active, + }) + }) + + const child = spawn(["prune", "--name", "stale-a"], root) + expect(await child.exited).toBe(0) + expect(await new Response(child.stdout).text()).toBe("1\n") + expect(await Bun.file(join(active, "marker.txt")).exists()).toBe(true) + expect(await Bun.file(join(staleA, "marker.txt")).exists()).toBe(false) + expect(await Bun.file(join(staleB, "marker.txt")).exists()).toBe(true) + }) + + test("force prunes matching active artifact directories", async () => { + const root = await temporary() + const artifactsRoot = join(root, "opencode-drive") + const active = join(artifactsRoot, "run-active") + const stale = join(artifactsRoot, "run-stale") + await Promise.all([active, stale].map((directory) => Bun.write(join(directory, "marker.txt"), "artifact\n"))) + await Promise.all([ + Bun.write(join(active, "drive", "name"), "active\n"), + Bun.write(join(stale, "drive", "name"), "stale\n"), + ]) + await withRegistry(root, async () => { + await register({ + ...testManifest("active", process.pid), + artifacts: active, + }) + }) + + const child = spawn(["prune", "--name", "active", "--force"], root) + expect(await child.exited).toBe(0) + expect(await new Response(child.stdout).text()).toBe("1\n") + expect(await Bun.file(join(active, "marker.txt")).exists()).toBe(false) + expect(await Bun.file(join(stale, "marker.txt")).exists()).toBe(true) + }) + + test("force prunes all artifact directories", async () => { + const root = await temporary() + const artifactsRoot = join(root, "opencode-drive") + const active = join(artifactsRoot, "run-active") + const initialized = join(artifactsRoot, "run-initialized") + const stale = join(artifactsRoot, "run-stale") + const unrelated = join(artifactsRoot, "other") + await Promise.all( + [active, initialized, stale, unrelated].map((directory) => + Bun.write(join(directory, "marker.txt"), "artifact\n"), + ), + ) + await withRegistry(root, async () => { + await register({ + ...testManifest("active", process.pid), + artifacts: active, + }) + await Bun.write( + manifestPath("initialized"), + `${JSON.stringify({ + version: 1, + name: "initialized", + createdAt: new Date().toISOString(), + cwd: root, + artifacts: initialized, + status: "initialized", + })}\n`, + ) + }) + + const child = spawn(["prune", "--force"], root) + expect(await child.exited).toBe(0) + expect(await new Response(child.stdout).text()).toBe("3\n") + expect(await Bun.file(join(active, "marker.txt")).exists()).toBe(false) + expect(await Bun.file(join(initialized, "marker.txt")).exists()).toBe(false) + expect(await Bun.file(join(stale, "marker.txt")).exists()).toBe(false) + expect(await Bun.file(join(unrelated, "marker.txt")).exists()).toBe(true) + }) + + test("reports optional-name discovery errors", async () => { + const root = await temporary() + const missing = spawn(["dir"], root) + expect(await missing.exited).toBe(1) + expect(await new Response(missing.stderr).text()).toContain("no drive instances are running") + }) + + test("runs multiple named instances concurrently", async () => { + const root = await temporary() + const names = ["first", "second"] as const + const starts = names.map((name) => + spawn(["start", "--name", name, "--", process.execPath, fixture("fake-opencode.ts")], root), + ) + expect(await Promise.all(starts.map((child) => child.exited))).toEqual([0, 0]) + instances.push(...names.map((name) => ({ root, name }))) + const first = await Bun.file(join(root, "registry", "first.json")).json() + const second = await Bun.file(join(root, "registry", "second.json")).json() + expect(first.endpoints.ui).not.toBe(second.endpoints.ui) + expect(await spawn(["send", "--name", "first", "--command.ui.state"], root).exited).toBe(0) + expect(await spawn(["send", "--name", "second", "--command.ui.state"], root).exited).toBe(0) + const screenshots = await Promise.all( + [first, second].map(async (manifest, index) => { + const name = index === 0 ? "first" : "second" + const screenshot = spawn(["send", "--name", name, "--command.ui.screenshot", '{"name":"shared"}'], root) + expect(await screenshot.exited).toBe(0) + return (await new Response(screenshot.stdout).text()).trim() + }), + ) + expect(screenshots).toEqual([ + join(runOutputDirectory(root, first.artifacts, 0), "shared.png"), + join(runOutputDirectory(root, second.artifacts, 0), "shared.png"), + ]) + + const unnamed = spawn(["dir"], root) + const [status, stderr] = await Promise.all([unnamed.exited, new Response(unnamed.stderr).text()]) + expect(status).toBe(1) + expect(stderr).toContain("no visible drive instance is running; pass --name (first, second)") + const listed = spawn(["list"], root) + expect(await listed.exited).toBe(0) + expect(await new Response(listed.stdout).text()).toBe( + `first: ${join(root, "registry", "first.json")}\nsecond: ${join(root, "registry", "second.json")}\n`, + ) + }) + + test("surfaces the owner log when detached startup fails", async () => { + const root = await temporary() + const name = "failed-start" + const child = spawn(["start", "--name", name, "--", process.execPath, "-e", "process.exit(7)"], root) + const [status, stdout, stderr] = await Promise.all([ + child.exited, + new Response(child.stdout).text(), + new Response(child.stderr).text(), + ]) + expect(status).toBe(1) + expect(stderr).toContain(`see ${join(root, "registry", `${name}.log`)}`) + expect(await Bun.file(join(root, "registry", `${name}.log`)).text()).toContain("OpenCode exited with status 7") + }) + + test("makes the visible instance the nameless target", async () => { + const root = await temporary() + const background = "background" + const backgroundStart = spawn( + ["start", "--name", background, "--", process.execPath, fixture("fake-opencode.ts")], + root, + ) + const [backgroundStatus, backgroundError] = await Promise.all([ + backgroundStart.exited, + new Response(backgroundStart.stderr).text(), + ]) + expect(backgroundStatus).toBe(0) + instances.push({ root, name: background }) + + const running = spawn(["start", "--visible", "--", process.execPath, fixture("fake-opencode.ts"), "30000"], root) + const name = `visible-${running.pid}` + const manifest = await waitForManifest(root, name) + instances.push({ root, name: manifest.name }) + expect(manifest.visible).toBe(true) + + const state = spawn(["send", "--command.ui.state"], root) + expect(await state.exited).toBe(0) + expect(JSON.parse(await new Response(state.stdout).text()).focused.editor).toBe(true) + + expect(await spawn(["stop"], root).exited).toBe(0) + instances.pop() + expect(await running.exited).toBe(0) + expect(await spawn(["stop", "--name", background], root).exited).toBe(0) + instances.pop() + const listed = spawn(["list"], root) + expect(await listed.exited).toBe(0) + expect(await new Response(listed.stdout).text()).toBe("\n") + }) + + test("blocks and stops the instance after a script completes", async () => { + const root = await temporary() + const name = "script-test" + const child = spawn( + ["start", "--name", name, "--script", fixture("script.ts"), "--", process.execPath, fixture("fake-opencode.ts")], + root, + ) + const started = Date.now() + const [status, stdout, stderr] = await Promise.all([ + child.exited, + new Response(child.stdout).text(), + new Response(child.stderr).text(), + ]) + expect(status).toBe(0) + expect(Date.now() - started).toBeLessThan(10_000) + const artifacts = artifactPath(stderr) + expect(await Bun.file(join(artifacts, "script-result.json")).json()).toMatchObject({ + frame: { cols: 80, rows: 24 }, + gitWriteError: expect.stringContaining("must not modify Git metadata"), + matches: true, + }) + expect(await Bun.file(join(artifacts, "files", ".opencode", "opencode.jsonc")).json()).toMatchObject({ + autoupdate: false, + model: "simulation/gpt-sim-model", + providers: { simulation: { models: { "gpt-sim-model": {} } } }, + test: { declared: true, setup: true }, + }) + expect(await Bun.file(join(artifacts, "files", ".opencode", "tui.jsonc")).json()).toEqual({ + test: { declared: true, setup: true }, + }) + const backendEvents = (await Bun.file(join(artifacts, "backend-events.jsonl")).text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + expect( + backendEvents + .filter((event) => event.method === "llm.chunk") + .flatMap((event) => event.params.items) + .filter((item) => item.type === "textDelta") + .map((item) => item.text) + .join(""), + ).toBe("script response") + expect(backendEvents.filter((event) => event.method === "llm.chunk").length).toBeGreaterThan(1) + expect( + backendEvents + .filter((event) => event.method === "llm.chunk") + .flatMap((event) => event.params.items) + .every((item) => item.type !== "textDelta" || item.text.length <= 8), + ).toBe(true) + expect(backendEvents.filter((event) => event.method === "llm.finish")).toEqual([ + { method: "llm.finish", params: { id: "ex_mock", reason: "stop" } }, + ]) + expect(await Bun.file(join(artifacts, "seeded-at-launch.txt")).text()).toBe("export const seeded = true\n") + expect(await Bun.file(join(artifacts, "files", "setup-seeded.txt")).text()).toBe("included in baseline\n") + expect(await Bun.$`git status --porcelain`.cwd(join(artifacts, "files")).text()).toBe("") + expect((await Bun.$`git log -1 --format=%s`.cwd(join(artifacts, "files")).text()).trim()).toBe("Initial commit") + expect(await realpath(await Bun.file(join(artifacts, "child-cwd.txt")).text())).toBe( + await realpath(join(artifacts, "files")), + ) + expect(await Bun.file(join(artifacts, "service-argv.json")).json()).toEqual([ + "serve", + "--service", + "--port", + expect.stringMatching(/^\d+$/), + ]) + const pid = Number(await Bun.file(join(artifacts, "child.pid")).text()) + expect(running(pid)).toBe(false) + expect(await Bun.file(join(root, "registry", `${name}.json`)).exists()).toBe(false) + }) + + test("protects Git metadata in prepared project scripts", async () => { + const root = await temporary() + const name = "prepared-git-script-test" + const initialized = spawn(["init", "--name", name], root) + expect(await initialized.exited).toBe(0) + const artifacts = (await new Response(initialized.stdout).text()).trim() + const files = join(artifacts, "files") + await rm(join(files, ".git"), { recursive: true }) + await Bun.$`git init --quiet --initial-branch=main`.cwd(files) + await Bun.$`git add --all`.cwd(files) + await Bun.$`git -c user.name=Fixture -c user.email=fixture@example.com commit --quiet --message=Prepared`.cwd(files) + const gitConfig = await Bun.file(join(files, ".git", "config")).text() + + const started = spawn(["start", "--name", name, "--script", fixture("prepared-git-script.ts")], root) + expect(await started.exited).toBe(0) + expect(await Bun.file(join(artifacts, "prepared-git-result.json")).json()).toEqual({ + runGitError: expect.stringContaining("must not modify Git metadata"), + setupGitError: expect.stringContaining("must not modify Git metadata"), + }) + expect(await Bun.file(join(files, ".git", "config")).text()).toBe(gitConfig) + expect((await Bun.$`git log -1 --format=%s`.cwd(files).text()).trim()).toBe("Prepared") + }, 10_000) + + test("cleans artifacts after a successful scripted run", async () => { + const root = await temporary() + const name = "script-cleanup-test" + const child = spawn( + ["start", "--name", name, "--script", fixture("script.ts"), "--", process.execPath, fixture("fake-opencode.ts")], + root, + { keepArtifacts: false }, + ) + const [status, stderr] = await Promise.all([child.exited, new Response(child.stderr).text()]) + expect(status).toBe(0) + const artifacts = artifactPath(stderr) + expect(await Bun.file(artifacts).exists()).toBe(false) + expect(await Bun.file(join(root, "registry", `${name}.json`)).exists()).toBe(false) + }) + + test("aborts the script run when a UI wait times out even if the script catches it", async () => { + const root = await temporary() + const name = "caught-timeout-test" + const child = spawn( + [ + "start", + "--name", + name, + "--script", + fixture("caught-timeout-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const [status, stderr] = await Promise.all([child.exited, new Response(child.stderr).text()]) + expect(status).toBe(1) + const artifacts = artifactPath(stderr) + expect(stderr).toContain('timed out waiting for the UI to match "this text never appears"') + expect(await Bun.file(join(root, "registry", `${name}.json`)).exists()).toBe(false) + }, 10_000) + + test("stops the whole run when a script crashes", async () => { + const root = await temporary() + const name = "crashing-script-test" + const child = spawn( + [ + "start", + "--name", + name, + "--script", + fixture("crashing-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const [status, stderr] = await Promise.all([child.exited, new Response(child.stderr).text()]) + expect(status).toBe(1) + const artifacts = artifactPath(stderr) + expect(stderr).toContain("script crashed") + expect(await Bun.file(join(root, "registry", `${name}.json`)).exists()).toBe(false) + const pid = Number(await Bun.file(join(artifacts, "child.pid")).text()) + expect(running(pid)).toBe(false) + const pruned = spawn(["prune", "--name", name], root) + expect(await pruned.exited).toBe(0) + expect(await new Response(pruned.stdout).text()).toBe("1\n") + expect(await Bun.file(artifacts).exists()).toBe(false) + }) + + test("checks a typed script without modifying its source directory", async () => { + const root = await temporary() + const directory = join(root, "scripts") + await mkdir(directory, { recursive: true }) + await Bun.write( + join(directory, "valid.ts"), + 'import { Effect } from "effect"\nimport { defineScript } from "opencode-drive"\nexport default defineScript({ project: { git: true, files: { "src/index.ts": "export {}\\n" } }, run: () => Effect.sleep(1) })\n', + ) + const checked = spawn(["check", join(directory, "valid.ts")], root) + expect(await checked.exited).toBe(0) + expect(await Bun.file(join(directory, "node_modules", "opencode-drive")).exists()).toBe(false) + expect(await Bun.file(join(directory, "node_modules", ".bin", "tsgo")).exists()).toBe(false) + expect(await Bun.file(join(directory, "node_modules")).exists()).toBe(false) + + await Bun.write(join(directory, "invalid.ts"), 'import { Effect } from "effect"\nEffect.sleep("wrong")\n') + const invalid = spawn(["check", join(directory, "invalid.ts")], root) + const invalidError = new Response(invalid.stderr).text() + expect(await invalid.exited).toBe(1) + expect(await invalidError).toContain("is not assignable to parameter of type") + + await Bun.write( + join(directory, "plain-object.ts"), + 'import { Effect } from "effect"\nexport default { run: () => Effect.void }\n', + ) + const plainObject = spawn(["check", join(directory, "plain-object.ts")], root) + expect(await plainObject.exited).toBe(1) + expect(await new Response(plainObject.stderr).text()).toContain("kind") + + await Bun.write( + join(directory, "promise.ts"), + 'import { defineScript } from "opencode-drive"\nexport default defineScript({ run: async ({ ui }) => { await ui.submit("Hello") } })\n', + ) + const promise = spawn(["check", join(directory, "promise.ts")], root) + const promiseError = new Response(promise.stderr).text() + expect(await promise.exited).toBe(1) + expect(await promiseError).toContain("OpenCode Drive scripts are Effect-only") + expect(await promiseError).toContain("Effect.gen(function* ()") + }, 60_000) + + test("runs a script imported from the Drive source checkout", async () => { + const root = await temporary() + const name = "source-script-test" + const child = spawn( + [ + "start", + "--name", + name, + "--script", + fixture("source-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const [status, stderr] = await Promise.all([child.exited, new Response(child.stderr).text()]) + + expect(status).toBe(0) + expect(stderr).not.toContain("Failed to register capture font") + }, 10_000) + + test("creates a type-checkable Effect script without overwriting it", async () => { + const root = await temporary() + const file = join(root, "scripts", "drive.ts") + const created = spawn(["script", "init", file], root) + const [status, stdout] = await Promise.all([created.exited, new Response(created.stdout).text()]) + expect(status).toBe(0) + expect(stdout.trim()).toBe(file) + const source = await Bun.file(file).text() + expect(source).toContain('import { defineScript, Effect, Llm } from "opencode-drive"') + expect(source).toContain('llm.queue(Llm.text("The value is 1."))') + + const checked = spawn(["check", file], root) + expect(await checked.exited).toBe(0) + + const repeated = spawn(["script", "init", file], root) + expect(await repeated.exited).toBe(1) + expect(await new Response(repeated.stderr).text()).toContain("script already exists") + expect(await Bun.file(file).text()).toBe(source) + }, 60_000) + + test("launches all TUIs explicitly for a manual UI script", async () => { + const root = await temporary() + const name = "manual-clients-test" + const child = spawn( + [ + "start", + "--name", + name, + "--script", + fixture("manual-clients-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const stderr = new Response(child.stderr).text() + expect(await child.exited).toBe(0) + const error = await stderr + const artifacts = artifactPath(error) + expect(await Bun.file(join(artifacts, "manual-clients.json")).json()).toEqual({ + apiHealthy: true, + aliceFrame: { cols: 80, rows: 24 }, + aliceMatches: true, + bobMatches: true, + tuiBeforeServer: "launch the script server before launching TUIs", + duplicateServer: "the script server has already been launched", + aliceScreenshot: join(runOutputDirectory(root, artifacts, 0), "alice.png"), + bobScreenshot: join(runOutputDirectory(root, artifacts, 0), "bob.png"), + }) + expect((await Bun.file(join(artifacts, "launches.txt")).text()).trim().split("\n")).toHaveLength(2) + }, 60_000) + + test("controls a statically declared tool from the running script", async () => { + const root = await temporary() + const child = spawn( + [ + "start", + "--name", + "tool-control-script-test", + "--script", + fixture("tool-control-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const stderr = new Response(child.stderr).text() + expect(await child.exited).toBe(0) + const artifacts = artifactPath(await stderr) + const events = (await Bun.file(join(artifacts, "tool-control-events.jsonl")).text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + expect(events).toEqual([ + { type: "progress", result: { output: "script progress\n" } }, + { type: "success", result: { output: "script success\n", exit: 0 } }, + ]) + }, 60_000) + + test("closes the automatic script's primary TUI", async () => { + const root = await temporary() + const child = spawn( + [ + "start", + "--name", + "kill-primary-test", + "--script", + fixture("kill-primary-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const stderr = new Response(child.stderr).text() + expect(await child.exited).toBe(0) + }, 60_000) + + test("kills and relaunches the scripted server and TUIs", async () => { + const root = await temporary() + const child = spawn( + [ + "start", + "--name", + "kill-server-test", + "--script", + fixture("kill-server-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const stderr = new Response(child.stderr).text() + expect(await child.exited).toBe(0) + const error = await stderr + const artifacts = artifactPath(error) + const result = await Bun.file(join(artifacts, "kill-server-result.json")).json() + expect(Number.isInteger(result.firstServer)).toBe(true) + expect(Number.isInteger(result.secondServer)).toBe(true) + expect(result.secondServer).not.toBe(result.firstServer) + expect(dirname(result.aliceRecording)).toBe(runOutputDirectory(root, artifacts, 0)) + expect(basename(result.aliceRecording)).toMatch(/^recording-.*\.mp4$/) + expect(await Bun.file(result.aliceRecording).exists()).toBe(true) + const recordings = [...error.matchAll(/opencode-drive: recording (.+\.mp4)/g)].map((match) => match[1]!) + expect(recordings).toHaveLength(2) + expect(await Promise.all(recordings.map((path) => Bun.file(path).exists()))).toEqual([true, true]) + expect((await Bun.file(join(artifacts, "launches.txt")).text()).trim().split("\n")).toHaveLength(3) + }, 60_000) + + test("retries a launch that fails after LLM attachment", async () => { + const root = await temporary() + const child = spawn( + [ + "start", + "--name", + "failed-launch-retry-test", + "--script", + fixture("failed-launch-retry-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + "omit-service-registration", + ], + root, + ) + const stderr = new Response(child.stderr).text() + expect(await child.exited).toBe(0) + const artifacts = artifactPath(await stderr) + const result = await Bun.file(join(artifacts, "failed-launch-retry.json")).json() + expect(Number.isInteger(result.firstPid)).toBe(true) + expect(Number.isInteger(result.secondPid)).toBe(true) + expect(result.secondPid).not.toBe(result.firstPid) + }, 60_000) + + test("rejects the removed callback script shape", async () => { + const root = await temporary() + const child = spawn(["start", "--name", "callback-script-test", "--script", fixture("callback-script.ts")], root) + expect(await child.exited).toBe(1) + expect(await new Response(child.stderr).text()).toContain("script must default-export defineScript(...)") + }) + + test("does not apply primary TUI options to additional TUIs", async () => { + const root = await temporary() + const child = spawn( + [ + "start", + "--name", + "tui-options-test", + "--script", + fixture("tui-options-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const stderr = new Response(child.stderr).text() + expect(await child.exited).toBe(0) + const artifacts = artifactPath(await stderr) + expect(await Bun.file(join(artifacts, "tui-options.json")).json()).toEqual({ + primaryRecording: true, + secondaryRecording: false, + }) + }) + + test.each(["setup", "run"] as const)("rejects a Promise-returning script %s callback", async (callback) => { + const root = await temporary() + const script = join(root, `promise-${callback}-script.js`) + await Bun.write( + script, + callback === "setup" + ? `import { Effect } from "effect"\nimport { defineScript } from "opencode-drive"\nexport default defineScript({ setup: async () => {}, run: () => Effect.void })\n` + : `import { defineScript } from "opencode-drive"\nexport default defineScript({ run: async () => {} })\n`, + ) + const child = spawn( + [ + "start", + "--name", + `promise-${callback}-script-test`, + "--script", + script, + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + expect(await child.exited).toBe(1) + expect(await new Response(child.stderr).text()).toContain( + callback === "setup" ? "setup must return an Effect" : "script run must return an Effect", + ) + }) + + test("rejects a Promise-returning UI predicate", async () => { + const root = await temporary() + const script = join(root, "promise-predicate-script.js") + await Bun.write( + script, + `import { defineScript } from "opencode-drive"\nexport default defineScript({ run: ({ ui }) => ui.waitFor(() => Promise.resolve(false)) })\n`, + ) + const child = spawn( + [ + "start", + "--name", + "promise-predicate-script-test", + "--script", + script, + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + expect(await child.exited).toBe(1) + expect(await new Response(child.stderr).text()).toContain("ui.waitFor predicate must return a boolean or Effect") + }) + + test("stops a visible instance after a script completes", async () => { + const root = await temporary() + const name = "visible-script-test" + const child = spawn( + [ + "start", + "--visible", + "--name", + name, + "--script", + fixture("script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + expect(await child.exited).toBe(0) + expect(await Bun.file(join(root, "registry", `${name}.json`)).exists()).toBe(false) + }) + + test("keeps service and progress output out of a visible client terminal", async () => { + const root = await temporary() + const child = spawn( + [ + "start", + "--visible", + "--name", + "visible-output-test", + "--script", + fixture("script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + "stdio-markers", + ], + root, + ) + const [status, stdout, stderr] = await Promise.all([ + child.exited, + new Response(child.stdout).text(), + new Response(child.stderr).text(), + ]) + expect(status).toBe(0) + expect(stdout).toContain("fake-client-stdout") + expect(stdout).not.toContain("fake-service-stdout") + expect(stderr).toContain("fake-client-stderr") + expect(stderr).not.toContain("fake-service-stderr") + expect(stderr).not.toContain("script completed") + + const artifacts = artifactPath(stderr) + expect(await Bun.file(join(artifacts, "logs", "service.stdout.log")).text()).toContain("fake-service-stdout") + expect(await Bun.file(join(artifacts, "logs", "service.stderr.log")).text()).toContain("fake-service-stderr") + expect(await Bun.file(join(artifacts, "logs", "opencode-drive.log")).text()).toContain("script completed") + }) + + test.each(["title-requests", "latest-title-requests"])( + "routes %s outside the normal LLM response sequence", + async (mode) => { + const root = await temporary() + const child = spawn( + [ + "start", + "--name", + "title-script-test", + "--script", + fixture("title-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + mode, + ], + root, + ) + const stderr = new Response(child.stderr).text() + expect(await child.exited).toBe(0) + const artifacts = artifactPath(await stderr) + const events = (await Bun.file(join(artifacts, "backend-events.jsonl")).text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + const text = (id: string) => + events + .filter((event) => event.method === "llm.chunk" && event.params.id === id) + .flatMap((event) => event.params.items) + .filter((item) => item.type === "textDelta") + .map((item) => item.text) + .join("") + expect(text("ex_title")).toBe("Custom title") + expect(text("ex_mock")).toBe("Normal response") + }, + ) + + test("serves typed LLM chunks and preserves an explicit finish", async () => { + const root = await temporary() + const child = spawn( + [ + "start", + "--name", + "serve-script-test", + "--script", + fixture("serve-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const stderr = new Response(child.stderr).text() + expect(await child.exited).toBe(0) + const artifacts = artifactPath(await stderr) + const events = (await Bun.file(join(artifacts, "backend-events.jsonl")).text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + expect( + events + .filter((event) => event.method === "llm.chunk") + .flatMap((event) => event.params.items) + .filter((item) => item.type === "textDelta") + .map((item) => item.text) + .join(""), + ).toBe("served response") + expect( + events + .filter((event) => event.method === "llm.chunk") + .flatMap((event) => event.params.items) + .filter((item) => item.type === "reasoningDelta") + .map((item) => item.text) + .join(""), + ).toBe("thinking") + expect(events.filter((event) => event.method === "llm.finish")).toEqual([ + { method: "llm.finish", params: { id: "ex_mock", reason: "length" } }, + ]) + }) + + test("waits for a delayed request to accept a sent LLM response", async () => { + const root = await temporary() + const child = spawn( + [ + "start", + "--name", + "delayed-queue-test", + "--script", + fixture("script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + "10000", + "250", + ], + root, + ) + expect(await child.exited).toBe(0) + }) + + test("restarts an active scripted run", async () => { + const root = await temporary() + const name = "restart-script-test" + const owner = spawn( + [ + "start", + "--name", + name, + "--script", + fixture("restart-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + ], + root, + ) + const manifest = await waitForManifest(root, name) + await waitForLines(join(manifest.artifacts, "script-runs.txt"), 1) + + expect(await spawn(["restart", "--name", name], root).exited).toBe(0) + await waitForLines(join(manifest.artifacts, "script-runs.txt"), 2) + const screenshots = (await Bun.file(join(manifest.artifacts, "script-screenshots.txt")).text()).trim().split("\n") + expect(screenshots).toEqual([ + join(runOutputDirectory(root, manifest.artifacts, 0), "restart-shared.png"), + join(runOutputDirectory(root, manifest.artifacts, 1), "restart-shared.png"), + ]) + expect(await spawn(["stop", "--name", name], root).exited).toBe(0) + expect(await owner.exited).toBe(0) + }) + + test("stops a hanging script after the OpenCode child exits", async () => { + const root = await temporary() + const name = "exited-script-test" + const child = spawn( + [ + "start", + "--name", + name, + "--script", + fixture("hanging-script.ts"), + "--", + process.execPath, + fixture("fake-opencode.ts"), + "500", + ], + root, + ) + expect(await child.exited).toBe(0) + expect(await Bun.file(join(root, "registry", `${name}.json`)).exists()).toBe(false) + }) + + test("waits for script cancellation and lifecycle cleanup on interruption", async () => { + const root = await temporary() + const name = "interrupted-script-test" + const script = join(root, "interrupted-script.ts") + const marker = join(root, "script-interrupted") + await Bun.write( + script, + `import { Effect } from "effect"\nimport { defineScript } from "opencode-drive"\nexport default defineScript({ run: ({ artifacts }) => Effect.never.pipe(Effect.ensuring(Effect.promise(async () => { const pid = Number(await Bun.file(artifacts + "/child.pid").text()); let running = true; try { process.kill(pid, 0) } catch { running = false }; await Bun.write(${JSON.stringify(marker)}, running ? "child-running\\n" : "child-stopped\\n") }))) })\n`, + ) + const child = spawn( + ["start", "--daemon", "--name", name, "--script", script, "--", process.execPath, fixture("fake-opencode.ts")], + root, + ) + const manifest = await waitForManifest(root, name) + const openCodePid = Number(await Bun.file(join(manifest.artifacts, "child.pid")).text()) + + process.kill(child.pid, "SIGTERM") + await child.exited + + expect(await Bun.file(marker).text()).toBe("child-running\n") + expect(running(openCodePid)).toBe(false) + expect(await Bun.file(join(root, "registry", `${name}.json`)).exists()).toBe(false) + expect(await Bun.file(join(root, "registry", `${name}.sock`)).exists()).toBe(false) + expect(await Bun.file(join(root, "node_modules", "opencode-drive")).exists()).toBe(false) + expect(await Bun.file(join(root, "node_modules")).exists()).toBe(false) + }) + + test("finalizes recording before interrupted owner teardown completes", async () => { + const root = await temporary() + const name = "interrupted-recording-test" + const child = spawn( + ["start", "--daemon", "--name", name, "--record", "--", process.execPath, fixture("fake-opencode.ts")], + root, + ) + const manifest = await waitForManifest(root, name) + + process.kill(child.pid, "SIGTERM") + await child.exited + + expect((await readdir(runOutputDirectory(root, manifest.artifacts, 0))).some((file) => file.endsWith(".mp4"))).toBe( + true, + ) + expect(await Bun.file(join(root, "registry", `${name}.json`)).exists()).toBe(false) + expect(await Bun.file(join(root, "registry", `${name}.sock`)).exists()).toBe(false) + }, 60_000) + + test("rejects removed LLM commands", async () => { + const root = await temporary() + expect(await spawn(["send", "--command.llm.pending"], root).exited).toBe(1) + }) + + test("generates configured tool calls from offered schemas", () => { + const settings = createResponseSettings() + settings.update({ types: ["tool"], tools: ["read"] }) + const tools = [ + { + type: "function", + function: { + name: "shell", + parameters: { + type: "object", + properties: { command: { type: "string" } }, + required: ["command"], + }, + }, + }, + { + type: "function", + function: { + name: "read", + parameters: { + type: "object", + properties: { + path: { type: "string" }, + offset: { type: "integer" }, + limit: { type: "integer" }, + }, + required: ["path", "offset", "limit"], + }, + }, + }, + ] + const response = generateResponse(settings.current(), { + id: "ex_1", + url: "https://api.openai.com/v1/chat/completions", + body: { tools }, + }) + expect(response.finish).toBe("tool-calls") + expect(response.items).toEqual([ + { + type: "toolCall", + index: 0, + id: expect.stringMatching(/^call_[a-f0-9]{16}$/), + name: "read", + input: { + path: ".opencode/opencode.jsonc", + offset: 1, + limit: 120, + }, + }, + ]) + + settings.update({ types: ["tool"], tools: ["shell", "read"] }) + const multiple = generateResponse(settings.current(), { + id: "ex_2", + url: "https://api.openai.com/v1/chat/completions", + body: { tools }, + }) + expect(multiple.items).toHaveLength(2) + expect(multiple.items).toMatchObject([ + { type: "toolCall", index: 0, name: "shell" }, + { type: "toolCall", index: 1, name: "read" }, + ]) + }) + + test("generates patches and finishes tool continuations with text", () => { + const settings = createResponseSettings() + settings.update({ types: ["diff"], tools: ["apply_patch"] }) + const body = { + tools: [ + { + type: "function", + function: { + name: "apply_patch", + parameters: { + type: "object", + properties: { patchText: { type: "string" } }, + required: ["patchText"], + }, + }, + }, + ], + } + const response = generateResponse(settings.current(), { + id: "ex_1", + url: "https://api.openai.com/v1/chat/completions", + body, + }) + expect(response.finish).toBe("tool-calls") + expect(response.items[0]).toMatchObject({ + type: "toolCall", + name: "apply_patch", + input: { + patchText: expect.stringMatching(/\n-export function greet\([^)]+\)[\s\S]+\n\+export function greet\(/), + }, + }) + + const continuation = generateResponse(settings.current(), { + id: "ex_2", + url: "https://api.openai.com/v1/chat/completions", + body: { ...body, messages: [{ role: "tool", content: "done" }] }, + }) + expect(continuation.finish).toBe("stop") + expect(continuation.items[0]).toMatchObject({ type: "textDelta" }) + + const laterTurn = generateResponse(settings.current(), { + id: "ex_later", + url: "https://api.openai.com/v1/chat/completions", + body: { + ...body, + messages: [ + { role: "tool", content: "done" }, + { role: "assistant", content: "Finished." }, + { role: "user", content: "Make another change." }, + ], + }, + }) + expect(laterTurn.finish).toBe("tool-calls") + + settings.update({ types: ["diff"], tools: ["edit", "write"] }) + const write = generateResponse(settings.current(), { + id: "ex_3", + url: "https://api.openai.com/v1/chat/completions", + body: { + tools: [ + { + type: "function", + function: { + name: "edit", + parameters: { + type: "object", + properties: { + path: { type: "string" }, + oldString: { type: "string" }, + newString: { type: "string" }, + }, + required: ["path", "oldString", "newString"], + }, + }, + }, + { + type: "function", + function: { + name: "write", + parameters: { + type: "object", + properties: { + path: { type: "string" }, + content: { type: "string" }, + }, + required: ["path", "content"], + }, + }, + }, + ], + }, + }) + expect(write.items[0]).toMatchObject({ + type: "toolCall", + name: "write", + input: { + path: "src/garden.js", + content: expect.stringContaining("export function greet"), + }, + }) + }) + + test("splits generated prose into small streaming chunks", () => { + const text = "Mushrooms gather quietly while flowers map the path home." + const chunks = splitText(text) + expect(chunks.join("")).toBe(text) + expect(chunks.length).toBeGreaterThan(1) + expect(chunks.every((chunk) => chunk.trim().split(/\s+/).length <= 3)).toBe(true) + }) +}) + +function spawn(args: ReadonlyArray, root: string, options: { readonly keepArtifacts?: boolean } = {}) { + const env = { + ...process.env, + DRIVE_REGISTRY_DIR: join(root, "registry"), + OPENCODE_DRIVE_MEDIA_DIR: join(root, "output"), + OPENCODE_DRIVE_KEEP_ARTIFACTS: "1", + TMPDIR: root, + } + if (options.keepArtifacts === false) delete env.OPENCODE_DRIVE_KEEP_ARTIFACTS + return Bun.spawn([process.execPath, resolve("src/cli/index.ts"), ...args], { + cwd: resolve("."), + env, + stdin: "ignore", + stdout: "pipe", + stderr: "pipe", + }) +} + +function fixture(name: string) { + return resolve("test", "fixtures", name) +} + +function runOutputDirectory(root: string, artifacts: string, generation: number) { + return join(root, "output", basename(artifacts), `generation-${generation}`) +} + +async function temporary() { + const root = await mkdtemp(join(tmpdir(), "opencode-drive-test-")) + roots.push(root) + return root +} + +async function waitForLines(file: string, count: number) { + const deadline = Date.now() + 10_000 + while (Date.now() < deadline) { + const lines = await Bun.file(file) + .text() + .then((text) => text.trim().split("\n").length) + .catch(() => 0) + if (lines >= count) return + await Bun.sleep(25) + } + throw new Error(`timed out waiting for ${count} lines in ${file}`) +} + +async function waitForManifest(root: string, name: string, timeout = 10_000) { + const file = join(root, "registry", `${name}.json`) + const deadline = Date.now() + timeout + while (Date.now() < deadline) { + const manifest = await Bun.file(file) + .json() + .catch(() => undefined) + if (manifest?.status === "ready") return manifest as InstanceManifest + await Bun.sleep(25) + } + throw new Error(`timed out waiting for ${file}`) +} + +async function waitForLauncher(child: ReturnType, stderr: Promise) { + let timer: ReturnType | undefined + const timeout = new Promise<"timeout">((resolve) => { + timer = setTimeout(() => resolve("timeout"), 10_000) + }) + try { + const status = await Promise.race([child.exited, timeout]) + if (status !== "timeout") return status + if (child.exitCode === null) child.kill() + await child.exited + throw new Error(`launcher ${child.pid} did not exit after ownership resolved: ${await stderr}`) + } finally { + if (timer !== undefined) clearTimeout(timer) + } +} + +async function expectSingleConcurrentStart(prepared: boolean) { + const root = await temporary() + const name = `concurrent-start-${prepared ? "prepared" : "automatic"}` + if (prepared) expect(await spawn(["init", "--name", name], root).exited).toBe(0) + const args = ["start", "--name", name, "--", process.execPath, fixture("fake-opencode.ts")] + const children = [spawn(args, root), spawn(args, root)] + const stderr = children.map((child) => new Response(child.stderr).text()) + let managed = false + try { + const manifest = await waitForManifest(root, name, 65_000) + instances.push({ root, name }) + managed = true + const statuses = await Promise.all(children.map((child, index) => waitForLauncher(child, stderr[index]!))) + const errors = await Promise.all(stderr) + expect(statuses.sort()).toEqual([0, 1]) + expect(errors.filter((error) => error.includes("is already starting"))).toHaveLength(1) + expect(errors.some((error) => error.includes("detached instance exited"))).toBe(false) + expect(manifest.pid).toBeGreaterThan(0) + } finally { + await Promise.all( + children.map(async (child) => { + if (child.exitCode === null) child.kill() + await child.exited + }), + ) + await Promise.allSettled(stderr) + if (!managed) await terminateUnmanagedInstance(root, name) + } +} + +async function terminateUnmanagedInstance(root: string, name: string) { + const manifest: unknown = await Bun.file(join(root, "registry", `${name}.json`)) + .json() + .catch(() => undefined) + if (typeof manifest !== "object" || manifest === null || !("pid" in manifest) || typeof manifest.pid !== "number") + return + for (const signal of ["SIGTERM", "SIGKILL"] as const) { + if (!running(manifest.pid)) return + try { + process.kill(manifest.pid, signal) + } catch (error) { + if (!running(manifest.pid)) return + throw error + } + const deadline = Date.now() + 2_000 + while (running(manifest.pid) && Date.now() < deadline) await Bun.sleep(25) + } + if (running(manifest.pid)) throw new Error(`failed to terminate drive owner ${manifest.pid}`) +} + +async function waitForMissing(file: string) { + const deadline = Date.now() + 10_000 + while (Date.now() < deadline) { + if (!(await Bun.file(file).exists())) return + await Bun.sleep(25) + } + throw new Error(`timed out waiting for ${file} removal`) +} + +function artifactPath(stderr: string) { + const line = stderr.split("\n").find((value) => value.startsWith("opencode-drive: using artifacts ")) + if (!line) throw new Error("artifact path was not reported") + return line.slice("opencode-drive: using artifacts ".length) +} + +function running(pid: number) { + try { + process.kill(pid, 0) + return true + } catch { + return false + } +} + +function testManifest(name: string, pid: number, status: "starting" | "ready" = "ready") { + return { + version: 1 as const, + name, + pid, + startedAt: new Date().toISOString(), + cwd: process.cwd(), + artifacts: join(tmpdir(), name), + visible: false, + status, + endpoints: { + ui: "ws://127.0.0.1:1", + backend: "ws://127.0.0.1:2", + }, + control: join(tmpdir(), `${name}.sock`), + } +} + +async function withRegistry(root: string, task: () => Promise) { + const previous = process.env.DRIVE_REGISTRY_DIR + process.env.DRIVE_REGISTRY_DIR = join(root, "registry") + try { + return await task() + } finally { + if (previous === undefined) delete process.env.DRIVE_REGISTRY_DIR + else process.env.DRIVE_REGISTRY_DIR = previous + } +} diff --git a/packages/drive/test/cli/parse.test.ts b/packages/drive/test/cli/parse.test.ts new file mode 100644 index 00000000000..36d55d534dc --- /dev/null +++ b/packages/drive/test/cli/parse.test.ts @@ -0,0 +1,46 @@ +import { describe, expect, test } from "vitest" +import { extractCommands } from "../../src/cli/parse.js" + +describe("drive CLI parser", () => { + test("preserves namespaced command order", () => { + expect( + extractCommands([ + "send", + "--command.ui.type", + '{"text":"hello"}', + "--command.ui.screenshot", + '{"name":"home"}', + "--command.ui.screenshot", + "--command.ui.matches", + '{"text":"hello"}', + "--command.ui.state", + ]), + ).toEqual({ + args: ["send"], + app: [], + commands: [ + { operation: "ui.type", value: '{"text":"hello"}' }, + { operation: "ui.screenshot", value: '{"name":"home"}' }, + { operation: "ui.screenshot" }, + { operation: "ui.matches", value: '{"text":"hello"}' }, + { operation: "ui.state" }, + ], + }) + }) + + test("keeps the custom OpenCode argv intact", () => { + expect(extractCommands(["start", "--", "bun", "app.ts", "--standalone", "--help"])).toEqual({ + args: ["start"], + app: ["bun", "app.ts", "--standalone", "--help"], + commands: [], + }) + }) + + test("rejects unknown namespaced commands", () => { + expect(() => extractCommands(["send", "--command.unknown"])).toThrow("unknown drive command") + }) + + test("rejects LLM commands", () => { + expect(() => extractCommands(["send", "--command.llm.pending"])).toThrow("unknown drive command") + }) +}) diff --git a/packages/drive/test/cli/run.test.ts b/packages/drive/test/cli/run.test.ts new file mode 100644 index 00000000000..9b4981470c4 --- /dev/null +++ b/packages/drive/test/cli/run.test.ts @@ -0,0 +1,100 @@ +import { afterEach, describe, expect, test } from "vitest" +import { mkdtemp, rm } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join, resolve } from "node:path" + +const roots: string[] = [] + +afterEach(async () => { + await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true }))) +}) + +describe("opencode-drive run", () => { + test("type-checks and executes a default-exported Effect", async () => { + const root = await temporary() + const marker = join(root, "executed.txt") + await Bun.write(join(root, "helper.ts"), 'export const value = "yes\\n"\n') + const program = await writeProgram( + root, + "valid.ts", + `import { Effect } from "effect"\nimport { OpenCodeDriver } from "opencode-drive"\nimport { value } from "./helper.ts"\nvoid OpenCodeDriver\nexport default Effect.promise(() => Bun.write(${JSON.stringify(marker)}, value))\n`, + ) + + const child = spawn(["run", program]) + const [status, stdout, stderr] = await Promise.all([ + child.exited, + new Response(child.stdout).text(), + new Response(child.stderr).text(), + ]) + expect(status, `${stdout}\n${stderr}`).toBe(0) + expect(await Bun.file(marker).text()).toBe("yes\n") + expect(await Bun.file(join(root, "node_modules")).exists()).toBe(false) + }, 30_000) + + test("rejects a program with unprovided requirements before importing it", async () => { + const root = await temporary() + const marker = join(root, "imported.txt") + const program = await writeProgram( + root, + "requirements.ts", + `import type { Effect } from "effect"\nawait Bun.write(${JSON.stringify(marker)}, "imported\\n")\ndeclare const program: Effect.Effect\nexport default program\n`, + ) + + const child = spawn(["run", program]) + const [status, stdout] = await Promise.all([child.exited, new Response(child.stdout).text()]) + expect(status).toBe(1) + expect(stdout).toContain("not assignable") + expect(await Bun.file(marker).exists()).toBe(false) + expect(await Bun.file(join(root, "node_modules")).exists()).toBe(false) + }, 30_000) + + test("validates the imported value at runtime", async () => { + const root = await temporary() + const program = await writeProgram( + root, + "invalid.js", + 'const program = /** @type {import("effect/Effect").Effect} */ ({})\nexport default program\n', + ) + + const child = spawn(["run", program]) + const [status, stdout, stderr] = await Promise.all([ + child.exited, + new Response(child.stdout).text(), + new Response(child.stderr).text(), + ]) + expect(status).toBe(1) + expect(`${stdout}\n${stderr}`).toContain("program must default-export a fully provided Effect") + expect(await Bun.file(join(root, "node_modules")).exists()).toBe(false) + }, 30_000) + + test.each([ + [["run", "program.ts", "--command.ui.state"], "command flags"], + [["run", "program.ts", "--", "argument"], "arguments after --"], + ] as const)("rejects unsupported invocation %#", async (args, message) => { + const child = spawn(args) + const [status, stderr] = await Promise.all([child.exited, new Response(child.stderr).text()]) + expect(status).toBe(1) + expect(stderr).toContain(message) + }) +}) + +function spawn(args: ReadonlyArray) { + return Bun.spawn([process.execPath, resolve("src/cli/index.ts"), ...args], { + cwd: resolve("."), + stdin: "ignore", + stdout: "pipe", + stderr: "pipe", + }) +} + +async function temporary() { + const root = await mkdtemp(join(tmpdir(), "opencode-drive-run-test-")) + roots.push(root) + return root +} + +async function writeProgram(root: string, name: string, contents: string) { + const file = join(root, name) + await Bun.write(file, contents) + return file +} diff --git a/packages/drive/test/driver/index.test.ts b/packages/drive/test/driver/index.test.ts new file mode 100644 index 00000000000..59d8c00ce40 --- /dev/null +++ b/packages/drive/test/driver/index.test.ts @@ -0,0 +1,619 @@ +import { readFile, readdir, rm, stat } from "node:fs/promises" +import { resolve } from "node:path" +import { expect, it } from "@effect/vitest" +import { Cause, Effect, Exit } from "effect" +import { Llm, OpenCodeDriver } from "../../src/index.js" + +const fakeOpenCode = [process.execPath, resolve("test", "fixtures", "fake-opencode.ts")] + +it.live("runs and settles a complete scoped driver", () => + Effect.gen(function* () { + const result = yield* OpenCodeDriver.use( + { + keepArtifacts: true, + project: { + git: true, + files: { + "src/seeded.ts": "export const seeded = true\n", + }, + }, + config: { + autoupdate: false, + nested: { declared: true, winner: "declared" }, + items: ["declared"], + }, + tuiConfig: { theme: { declared: true } }, + setup: ({ config, tuiConfig }) => + Effect.sync(() => { + config.nested = { + ...(config.nested as Record), + winner: "setup", + } + tuiConfig.theme = { + ...(tuiConfig.theme as Record), + setup: true, + } + }), + tui: { + recording: true, + viewport: { cols: 96, rows: 32 }, + }, + opencode: { command: fakeOpenCode }, + }, + (driver) => + Effect.gen(function* () { + expect(yield* driver.opencode.health.get()).toMatchObject({ + healthy: true, + version: "test", + }) + expect(yield* driver.opencode.server.get()).toEqual({ urls: [] }) + yield* driver.llm.queue(Llm.text("library response", { delay: 0, chunkSize: 100 })) + yield* driver.ui.submit("hello from library") + yield* driver.ui.waitFor("hello from library") + const secondary = yield* driver.tuis.launch({ + viewport: { cols: 120, rows: 40 }, + }) + yield* secondary.ui.submit("hello from secondary") + yield* secondary.ui.waitFor("hello from secondary") + return { + artifacts: driver.artifacts, + recording: driver.tui.recording?.path, + } + }), + ) + + yield* Effect.addFinalizer(() => + Effect.tryPromise({ + try: async () => { + await rm(result.artifacts, { recursive: true, force: true }) + if (result.recording !== undefined) await rm(result.recording, { force: true }) + }, + catch: () => undefined, + }).pipe(Effect.ignore), + ) + + expect(result.recording).toBeDefined() + expect(yield* Effect.promise(() => readFile(`${result.artifacts}/seeded-at-launch.txt`, "utf8"))).toBe( + "export const seeded = true\n", + ) + expect( + yield* Effect.promise(() => + readFile(`${result.artifacts}/files/.opencode/opencode.jsonc`, "utf8").then(JSON.parse), + ), + ).toMatchObject({ + autoupdate: false, + nested: { declared: true, winner: "setup" }, + items: ["declared"], + }) + expect( + yield* Effect.promise(() => readFile(`${result.artifacts}/files/.opencode/tui.jsonc`, "utf8").then(JSON.parse)), + ).toEqual({ theme: { declared: true, setup: true } }) + expect(yield* Effect.promise(() => readFile(`${result.artifacts}/backend-events.jsonl`, "utf8"))).toContain( + "library response", + ) + expect( + result.recording === undefined + ? false + : yield* Effect.promise(() => + stat(result.recording).then( + () => true, + () => false, + ), + ), + ).toBe(true) + + for (const file of ["service.pid", "child.pid"]) { + const pid = Number(yield* Effect.promise(() => readFile(`${result.artifacts}/${file}`, "utf8"))) + expect(isRunning(pid)).toBe(false) + } + }), +) + +it.live("rejects a setup callback that does not return an Effect", () => + Effect.gen(function* () { + const failure = yield* OpenCodeDriver.use( + { + setup() {}, + opencode: { command: fakeOpenCode }, + }, + () => Effect.void, + ).pipe(Effect.flip) + + expect(failure).toMatchObject({ + _tag: "OpenCodeDriverError", + operation: "project.prepare", + message: "setup must return an Effect", + }) + }), +) + +it.live("rejects recording for a visible TUI", () => + Effect.gen(function* () { + const failure = yield* OpenCodeDriver.make({ + tui: { recording: true }, + opencode: { command: fakeOpenCode, visible: true }, + }).pipe(Effect.scoped, Effect.flip) + + expect(failure).toMatchObject({ + _tag: "OpenCodeDriverError", + operation: "tui.launch", + message: "recording requires a headless OpenCode TUI", + }) + }), +) + +it.live("supports explicit terminal settlement with make", () => + Effect.gen(function* () { + let artifacts = "" + yield* Effect.scoped( + Effect.gen(function* () { + const driver = yield* OpenCodeDriver.make({ + opencode: { command: fakeOpenCode }, + }) + artifacts = driver.artifacts + yield* driver.llm.queue(Llm.text("explicit settlement", { delay: 0, chunkSize: 100 })) + const settlement = yield* driver.settle() + expect(settlement).toMatchObject({ + artifacts: driver.artifacts, + retained: false, + compatibility: [ + { _tag: "Negotiated", role: "backend", protocolVersion: 1 }, + { _tag: "Negotiated", role: "ui", protocolVersion: 1 }, + ], + recordings: [], + }) + const error = yield* driver.tuis.launch().pipe(Effect.flip) + expect(error).toMatchObject({ + _tag: "OpenCodeDriverError", + operation: "tui.launch", + }) + }), + ) + expect( + yield* Effect.promise(() => + stat(artifacts).then( + () => true, + () => false, + ), + ), + ).toBe(false) + }), +) + +it.live("rolls back a failed initial tool connection", () => + Effect.gen(function* () { + const failure = yield* OpenCodeDriver.make({ + opencode: { command: [...fakeOpenCode, "reject-tool-handshake"] }, + }).pipe( + Effect.scoped, + Effect.timeoutOrElse({ + duration: 10_000, + orElse: () => Effect.dieMessage("failed tool connection did not roll back"), + }), + Effect.flip, + ) + expect(failure).toMatchObject({ + _tag: "OpenCodeDriverError", + operation: "tools.connect", + }) + }), +) + +it.live("injects declared tool handlers for library drivers", () => + Effect.gen(function* () { + const artifacts = yield* OpenCodeDriver.use( + { + keepArtifacts: true, + opencode: { command: fakeOpenCode }, + tools(tools) { + tools.handle("shell", () => Effect.succeed({ output: "controlled\n" })) + }, + }, + (driver) => Effect.succeed(driver.artifacts), + ) + yield* Effect.addFinalizer(() => Effect.promise(() => rm(artifacts, { recursive: true, force: true }))) + const config = yield* Effect.promise(() => + readFile(`${artifacts}/files/.opencode/opencode.jsonc`, "utf8").then(JSON.parse), + ) + expect(config.plugins).toEqual([ + expect.objectContaining({ + package: expect.stringMatching(/\/src\/tool\/plugin\.js$/), + options: expect.objectContaining({ tools: ["shell"] }), + }), + ]) + }), +) + +it.live("exposes runtime controls for tools declared by name", () => + Effect.gen(function* () { + const artifacts = yield* OpenCodeDriver.use( + { + keepArtifacts: true, + opencode: { command: fakeOpenCode }, + tools: ["shell"], + }, + (driver) => + Effect.gen(function* () { + yield* driver.tools.control("shell") + return driver.artifacts + }), + ) + yield* Effect.addFinalizer(() => Effect.promise(() => rm(artifacts, { recursive: true, force: true }))) + const config = yield* Effect.promise(() => + readFile(`${artifacts}/files/.opencode/opencode.jsonc`, "utf8").then(JSON.parse), + ) + expect(config.plugins).toEqual([ + expect.objectContaining({ + package: expect.stringMatching(/\/src\/tool\/plugin\.js$/), + options: expect.objectContaining({ tools: ["shell"] }), + }), + ]) + }), +) + +it.live("controls arbitrary provider-backed tools through the runtime lifecycle", () => + Effect.gen(function* () { + const artifacts = yield* OpenCodeDriver.use( + { + keepArtifacts: true, + opencode: { + command: [...fakeOpenCode, "dynamic-tool", "reconnect-tool"], + }, + }, + (driver) => + Effect.gen(function* () { + yield* driver.tools.attach({ + tools: [ + { + name: "lookup", + description: "Look up a value", + inputSchema: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, + outputSchema: { + type: "object", + properties: { answer: { type: "number" } }, + required: ["answer"], + }, + options: { codemode: false }, + }, + ], + }) + const call = yield* driver.tools.take("call_lookup") + expect(call).toMatchObject({ + name: "lookup", + input: { query: "meaning" }, + context: { sessionID: "ses_dynamic", callID: "call_lookup" }, + }) + yield* call.progress({ + structured: { phase: "searching" }, + content: [{ type: "text", text: "Searching" }], + }) + yield* call.finish({ + structured: { answer: 42 }, + content: [{ type: "text", text: "42" }], + }) + return driver.artifacts + }), + ) + yield* Effect.addFinalizer(() => Effect.promise(() => rm(artifacts, { recursive: true, force: true }))) + const events = (yield* Effect.promise(() => readFile(`${artifacts}/tool-events.jsonl`, "utf8"))) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + expect(events).toEqual([ + expect.objectContaining({ method: "tool.attach" }), + expect.objectContaining({ method: "tool.attach" }), + { + method: "tool.update", + params: { + id: "tool_1", + sequence: 0, + update: { + structured: { phase: "searching" }, + content: [{ type: "text", text: "Searching" }], + }, + }, + }, + { + method: "tool.finish", + params: { + id: "tool_1", + output: { + structured: { answer: 42 }, + content: [{ type: "text", text: "42" }], + }, + }, + }, + { + method: "tool.attach", + params: { tools: [] }, + }, + ]) + }), +) + +it.live("surfaces a permanent tool reconnect failure", () => + Effect.gen(function* () { + let artifacts = "" + const result = yield* Effect.exit( + OpenCodeDriver.use( + { + keepArtifacts: true, + opencode: { + command: [...fakeOpenCode, "dynamic-tool", "reconnect-tool", "reject-tool-reconnect"], + }, + }, + (driver) => + Effect.gen(function* () { + artifacts = driver.artifacts + yield* driver.tools.attach({ + tools: [ + { + name: "lookup", + description: "Look up a value", + inputSchema: { type: "object" }, + options: { codemode: false }, + }, + ], + }) + return yield* Effect.never + }), + ).pipe( + Effect.timeoutOrElse({ + duration: 10_000, + orElse: () => Effect.dieMessage("permanent tool reconnect failure was not observed"), + }), + ), + ) + yield* Effect.addFinalizer(() => + artifacts === "" ? Effect.void : Effect.promise(() => rm(artifacts, { recursive: true, force: true })), + ) + if (Exit.isSuccess(result)) return yield* Effect.dieMessage("driver unexpectedly succeeded") + expect(result.cause.reasons.filter(Cause.isFailReason).map((reason) => reason.error)).toContainEqual( + expect.objectContaining({ + _tag: "OpenCodeDriverError", + operation: "tools.connect", + }), + ) + }), +) + +it.live("returns structured evidence from the safe lifecycle boundary", () => + Effect.gen(function* () { + const result = yield* OpenCodeDriver.useReport( + { + keepArtifacts: true, + opencode: { command: fakeOpenCode }, + }, + ({ artifacts }) => Effect.succeed(artifacts), + ) + + expect(result.value).toBe(result.report.artifacts) + expect(result.report).toMatchObject({ + artifacts: result.value, + retained: true, + recordings: [], + compatibility: [ + { _tag: "Negotiated", role: "backend", protocolVersion: 1 }, + { _tag: "Negotiated", role: "ui", protocolVersion: 1 }, + ], + }) + yield* Effect.promise(() => rm(result.value, { recursive: true, force: true })) + }), +) + +it.live("settles and exports recordings when the user program fails", () => + Effect.gen(function* () { + let artifacts = "" + let recording = "" + const result = yield* Effect.exit( + OpenCodeDriver.use( + { + keepArtifacts: true, + tui: { recording: true }, + opencode: { command: fakeOpenCode }, + }, + (driver) => { + artifacts = driver.artifacts + recording = driver.tui.recording?.path ?? "" + return Effect.fail("user program failed") + }, + ), + ) + + yield* Effect.addFinalizer(() => + Effect.promise(async () => { + await rm(artifacts, { recursive: true, force: true }) + await rm(recording, { force: true }) + }), + ) + + expect(Exit.isFailure(result)).toBe(true) + expect(yield* exists(recording)).toBe(true) + for (const file of ["service.pid", "child.pid"]) { + const pid = Number(yield* Effect.promise(() => readFile(`${artifacts}/${file}`, "utf8"))) + expect(isRunning(pid)).toBe(false) + } + }), +) + +it.live("preserves user and settlement failures", () => + Effect.gen(function* () { + let artifacts = "" + const result = yield* Effect.exit( + OpenCodeDriver.use( + { + keepArtifacts: true, + tui: { recording: true }, + opencode: { command: fakeOpenCode }, + }, + (driver) => + Effect.gen(function* () { + artifacts = driver.artifacts + yield* Effect.promise(async () => { + const directory = `${driver.artifacts}/drive` + for (const file of await readdir(directory)) { + if (!file.endsWith(".json")) continue + const manifest: unknown = JSON.parse(await readFile(`${directory}/${file}`, "utf8")) + if ( + typeof manifest === "object" && + manifest !== null && + "recording" in manifest && + typeof manifest.recording === "object" && + manifest.recording !== null && + "timeline" in manifest.recording && + typeof manifest.recording.timeline === "string" + ) + await rm(manifest.recording.timeline, { force: true }) + } + }) + return yield* Effect.fail("user program failed") + }), + ), + ) + + yield* Effect.addFinalizer(() => Effect.promise(() => rm(artifacts, { recursive: true, force: true }))) + if (Exit.isSuccess(result)) return yield* Effect.dieMessage("driver unexpectedly succeeded") + const failures = result.cause.reasons.filter(Cause.isFailReason).map((reason) => reason.error) + expect(failures).toContain("user program failed") + expect(failures).toContainEqual( + expect.objectContaining({ + _tag: "OpenCodeDriverError", + operation: "recording.export", + }), + ) + }), +) + +it.live("interrupts use when the backend disconnects", () => + Effect.gen(function* () { + let artifacts = "" + const result = yield* Effect.exit( + OpenCodeDriver.use( + { + keepArtifacts: true, + opencode: { command: fakeOpenCode }, + }, + (driver) => + Effect.gen(function* () { + artifacts = driver.artifacts + yield* driver.tools.attach({ + tools: [ + { + name: "lookup", + description: "Look up a value", + inputSchema: { type: "object" }, + options: { codemode: false }, + }, + ], + }) + const pid = Number(yield* Effect.promise(() => readFile(`${artifacts}/service.pid`, "utf8"))) + process.kill(pid, "SIGKILL") + return yield* Effect.never + }), + ).pipe( + Effect.timeoutOrElse({ + duration: 10_000, + orElse: () => Effect.dieMessage("backend disconnect was not observed"), + }), + ), + ) + + yield* Effect.addFinalizer(() => Effect.promise(() => rm(artifacts, { recursive: true, force: true }))) + if (Exit.isSuccess(result)) return yield* Effect.dieMessage("driver unexpectedly succeeded") + expect(Cause.squash(result.cause)).toMatchObject({ + _tag: "LlmControllerError", + operation: "backend", + }) + }), +) + +it.live("closes TUIs and exports recordings after LLM settlement fails", () => + Effect.gen(function* () { + let artifacts = "" + let recording = "" + yield* Effect.scoped( + Effect.gen(function* () { + const driver = yield* OpenCodeDriver.make({ + keepArtifacts: true, + tui: { recording: true }, + opencode: { command: fakeOpenCode }, + }) + artifacts = driver.artifacts + recording = driver.tui.recording?.path ?? "" + yield* driver.llm.queue(Llm.finish(), Llm.text("too late", { delay: 0 })) + yield* driver.ui.submit("trigger invalid response") + const failure = yield* driver.settle().pipe(Effect.flip) + expect(failure).toMatchObject({ + _tag: "LlmControllerError", + operation: "respond", + }) + expect(yield* exists(recording)).toBe(true) + expect((yield* driver.tuis.launch().pipe(Effect.flip)).operation).toBe("tui.launch") + }), + ) + + yield* Effect.addFinalizer(() => + Effect.promise(async () => { + await rm(artifacts, { recursive: true, force: true }) + await rm(recording, { force: true }) + }), + ) + for (const file of ["service.pid", "child.pid"]) { + const pid = Number(yield* Effect.promise(() => readFile(`${artifacts}/${file}`, "utf8"))) + expect(isRunning(pid)).toBe(false) + } + }), +) + +it.live("force kills unresponsive processes and preserves their logs", () => + Effect.gen(function* () { + const started = Date.now() + const artifacts = yield* OpenCodeDriver.use( + { + keepArtifacts: true, + opencode: { + command: [...fakeOpenCode, "ignore-sigterm", "write-stdio"], + }, + }, + (driver) => + driver.llm.queue(Llm.text("shutdown response", { delay: 0, chunkSize: 100 })).pipe(Effect.as(driver.artifacts)), + ) + const elapsed = Date.now() - started + + yield* Effect.addFinalizer(() => Effect.promise(() => rm(artifacts, { recursive: true, force: true }))) + + expect(yield* Effect.promise(() => readFile(`${artifacts}/logs/service.stdout.log`, "utf8"))).toContain( + "fake opencode service stdout", + ) + expect(yield* Effect.promise(() => readFile(`${artifacts}/logs/tui-0.stderr.log`, "utf8"))).toContain( + "fake opencode client stderr", + ) + expect(elapsed).toBeGreaterThanOrEqual(900) + expect(elapsed).toBeLessThan(10_000) + for (const file of ["service.pid", "child.pid"]) { + const pid = Number(yield* Effect.promise(() => readFile(`${artifacts}/${file}`, "utf8"))) + expect(isRunning(pid)).toBe(false) + } + }), +) + +const exists = (path: string) => + Effect.promise(() => + stat(path).then( + () => true, + () => false, + ), + ) + +function isRunning(pid: number) { + try { + process.kill(pid, 0) + return true + } catch { + return false + } +} diff --git a/packages/drive/test/driver/llm-controller.test.ts b/packages/drive/test/driver/llm-controller.test.ts new file mode 100644 index 00000000000..5301fc1cf9e --- /dev/null +++ b/packages/drive/test/driver/llm-controller.test.ts @@ -0,0 +1,539 @@ +import { describe, expect, it, vi } from "@effect/vitest" +import { Effect, Fiber } from "effect" +import { TestClock } from "effect/testing" +import * as LlmController from "../../src/driver/llm-controller.js" +import * as Llm from "../../src/llm/index.js" +import * as SimulationConnector from "../../src/simulation/connector.js" +import { sendError, sendResult, startTransportPeer } from "../simulation/transport-peer.js" + +const request = { + id: "exchange-1", + url: "https://api.openai.com/v1/responses", + body: { model: "test-model" }, +} + +describe("LlmController", () => { + it.live("preserves response state across backend generations", () => { + const peer = (id: string) => + startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.attach") + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: { ...request, id }, + }), + ) + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }) + }) + const first = peer("generation-1") + const second = peer("generation-2") + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => Promise.all([first.stop(), second.stop()]))) + const llm = yield* LlmController.make() + const firstBackend = yield* SimulationConnector.backend(first.url) + const firstAttachment = yield* llm.attach(firstBackend) + yield* llm.send(Llm.text("first", { delay: 0 })) + yield* firstAttachment.detach() + + const secondBackend = yield* SimulationConnector.backend(second.url) + yield* llm.attach(secondBackend) + yield* llm.send(Llm.text("second", { delay: 0 })) + yield* llm.settle() + + expect(first.received.some(({ request: frame }) => JSON.stringify(frame).includes("first"))).toBe(true) + expect(second.received.some(({ request: frame }) => JSON.stringify(frame).includes("second"))).toBe(true) + }) + }) + + it.live("queues and streams one future response", () => { + const peer = startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.attach") + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: request, + }), + ) + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* llm.queue(Llm.text("hello", { delay: 0, chunkSize: 100 }), Llm.finish("length")) + yield* llm.settle() + + expect(peer.received.map(({ request }) => request)).toEqual([ + { jsonrpc: "2.0", id: 1, method: "llm.attach" }, + { + jsonrpc: "2.0", + id: 2, + method: "llm.chunk", + params: { + id: "exchange-1", + items: [{ type: "textDelta", text: "hello" }], + }, + }, + { + jsonrpc: "2.0", + id: 3, + method: "llm.finish", + params: { id: "exchange-1", reason: "length" }, + }, + ]) + }) + }) + + it.live("streams tool call input as provider-neutral deltas", () => { + const random = vi.spyOn(Math, "random").mockReturnValue(0.5) + const peer = startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.attach") + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: request, + }), + ) + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.sync(() => random.mockRestore())) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* llm.queue( + Llm.toolCall( + { + index: 0, + id: "call_1", + name: "lookup", + input: { query: "weather" }, + }, + { delay: 0, chunkSize: 10 }, + ), + Llm.finish("tool-calls"), + ) + yield* llm.settle() + + const chunks = peer.received.map(({ request: frame }) => frame).filter((frame) => frame.method === "llm.chunk") + expect(chunks).toEqual([ + expect.objectContaining({ + params: { + id: "exchange-1", + items: [ + { + type: "toolInputStart", + index: 0, + id: "call_1", + name: "lookup", + }, + ], + }, + }), + expect.objectContaining({ + params: { + id: "exchange-1", + items: [ + { + type: "toolInputDelta", + index: 0, + text: '{"query":"', + }, + ], + }, + }), + expect.objectContaining({ + params: { + id: "exchange-1", + items: [ + { + type: "toolInputDelta", + index: 0, + text: 'weather"}', + }, + ], + }, + }), + ]) + }) + }) + + it.live("falls back to OpenAI deltas when partial tool input is unavailable", () => { + const peer = startTransportPeer( + ({ request: frame, socket }) => { + if (frame.method === "llm.attach") + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: request, + }), + ) + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }) + }, + { + capabilities: (offered) => offered.filter((capability) => capability !== "llm.tool-input-delta"), + }, + ) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* llm.queue( + Llm.toolCall( + { + index: 0, + id: "call_legacy", + name: "lookup", + input: { query: "weather" }, + }, + { delay: 0, chunkSize: 100 }, + ), + Llm.finish("tool-calls"), + ) + yield* llm.settle() + + const chunk = peer.received.find(({ request: frame }) => frame.method === "llm.chunk")?.request + expect(chunk).toMatchObject({ + params: { + id: "exchange-1", + items: [ + { + type: "raw", + chunk: { + choices: [ + { + delta: { + tool_calls: [ + { + index: 0, + id: "call_legacy", + function: { + name: "lookup", + arguments: '{"query":"weather"}', + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }) + }) + }) + + it.live("serves requests and keeps titles outside normal sequencing", () => { + const random = vi.spyOn(Math, "random").mockReturnValue(0.5) + const titleRequest = { + ...request, + id: "title-1", + body: { + messages: [ + { + role: "system", + content: "You are a title generator. Generate a title.", + }, + ], + }, + } + const chunksSent = Promise.withResolvers() + let chunkCount = 0 + const peer = startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.chunk" && ++chunkCount === 2) chunksSent.resolve() + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.sync(() => random.mockRestore())) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* llm.title(() => Effect.succeed("A concise title")) + yield* llm.serve(() => LlmController.response(Llm.text("served", { delay: 0, chunkSize: 100 }))) + const attached = peer.received[0] + if (attached === undefined) return yield* Effect.dieMessage("llm.attach was not received") + const socket = attached.socket + for (const params of [titleRequest, request]) + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params, + }), + ) + yield* Effect.promise(() => chunksSent.promise) + yield* llm.settle() + + const chunks = peer.received.map(({ request }) => request).filter((frame) => frame.method === "llm.chunk") + expect(chunks).toHaveLength(2) + expect(chunks).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + params: { + id: "title-1", + items: [{ type: "textDelta", text: "A concise title" }], + }, + }), + expect.objectContaining({ + params: { + id: "exchange-1", + items: [{ type: "textDelta", text: "served" }], + }, + }), + ]), + ) + }) + }) + + it.live("fails settlement for output after a terminal event", () => { + const peer = startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.attach") + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: request, + }), + ) + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* llm.queue(Llm.finish(), Llm.text("too late", { delay: 0 })) + const error = yield* llm.settle().pipe(Effect.flip) + expect(error).toMatchObject({ + _tag: "LlmControllerError", + operation: "respond", + requestId: "exchange-1", + }) + expect(error.message).toContain("after its terminal event") + }) + }) + + it.live("settles when pending confirms an invocation was terminated externally", () => { + let chunks = 0 + const peer = startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.attach") { + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: request, + }), + ) + return sendResult(socket, frame, { attached: true }) + } + if (frame.method === "llm.chunk" && ++chunks === 2) + return sendError(socket, frame, "Simulated provider invocation not found or already finished: exchange-1") + if (frame.method === "llm.pending") return sendResult(socket, frame, { invocations: [] }) + sendResult(socket, frame, { ok: true }) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* llm.queue( + Llm.text("first", { delay: 0, chunkSize: 100 }), + Llm.text("second", { delay: 0, chunkSize: 100 }), + ) + yield* llm.settle() + + expect(peer.received.map(({ request: frame }) => frame.method)).toEqual([ + "llm.attach", + "llm.chunk", + "llm.chunk", + "llm.pending", + ]) + }) + }) + + it.live("preserves a write failure while the invocation is still pending", () => { + const peer = startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.attach") { + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: request, + }), + ) + return sendResult(socket, frame, { attached: true }) + } + if (frame.method === "llm.chunk") return sendError(socket, frame, "chunk rejected") + if (frame.method === "llm.pending") return sendResult(socket, frame, { invocations: [request] }) + sendResult(socket, frame, { ok: true }) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* llm.queue(Llm.text("rejected", { delay: 0, chunkSize: 100 })) + const error = yield* llm.settle().pipe(Effect.flip) + + expect(error).toMatchObject({ + _tag: "LlmControllerError", + operation: "llm.chunk", + requestId: "exchange-1", + }) + expect(error.message).toContain("chunk rejected") + }) + }) + + it.effect("reports unused queued responses at settlement", () => { + const peer = startTransportPeer(({ request: frame, socket }) => + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }), + ) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend, { + settlementTimeout: 20, + }) + yield* llm.queue(Llm.text("unused")) + const settlement = yield* Effect.forkChild(llm.settle().pipe(Effect.flip)) + yield* TestClock.adjust(20) + const error = yield* Fiber.join(settlement) + expect(error).toBeInstanceOf(LlmController.LlmSettlementError) + expect(error).toMatchObject({ + unusedResponses: 1, + unexpectedRequests: 0, + }) + }) + }) + + it.live("send waits until its response is accepted", () => { + const peer = startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.attach") + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: request, + }), + ) + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* llm.send(Llm.raw({ accepted: true })) + yield* llm.settle() + expect(peer.received.some(({ request }) => request.method === "llm.finish")).toBe(true) + }) + }) + + it.live("serves a request that arrived before serve mode was selected", () => { + const peer = startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.attach") + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: request, + }), + ) + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* Effect.yieldNow + yield* llm.serve(() => LlmController.response(Llm.text("late serve", { delay: 0, chunkSize: 100 }))) + yield* llm.settle() + expect( + peer.received.some( + ({ request }) => request.method === "llm.chunk" && JSON.stringify(request.params).includes("late serve"), + ), + ).toBe(true) + }) + }) + + it.live("reports defects thrown by serve handlers", () => { + const peer = startTransportPeer(({ request: frame, socket }) => { + if (frame.method === "llm.attach") + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: request, + }), + ) + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* llm.serve(() => { + throw new Error("serve exploded") + }) + const failure = yield* llm.settle().pipe(Effect.flip) + expect(failure).toMatchObject({ + _tag: "LlmControllerError", + operation: "respond", + requestId: "exchange-1", + }) + expect(failure.message).toContain("serve exploded") + }) + }) + + it.live("fails a pending send when the controller shuts down", () => { + const peer = startTransportPeer(({ request: frame, socket }) => + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }), + ) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + const sending = yield* Effect.forkChild(llm.send(Llm.text("pending")).pipe(Effect.flip)) + yield* Effect.yieldNow + yield* llm.shutdown() + const failure = yield* Fiber.join(sending) + expect(failure).toMatchObject({ + _tag: "LlmControllerError", + operation: "shutdown", + }) + }) + }) + + it.live("fails when the backend connection closes unexpectedly", () => { + const peer = startTransportPeer(({ request: frame, socket }) => + sendResult(socket, frame, frame.method === "llm.attach" ? { attached: true } : { ok: true }), + ) + + return Effect.gen(function* () { + const backend = yield* SimulationConnector.backend(peer.url) + const llm = yield* LlmController.make(backend) + yield* Effect.promise(() => peer.stop()) + yield* backend.closed + yield* Effect.yieldNow + const failure = yield* llm.settle().pipe(Effect.flip) + expect(failure).toMatchObject({ + _tag: "LlmControllerError", + operation: "backend", + }) + }) + }) +}) diff --git a/packages/drive/test/driver/llm-state.test.ts b/packages/drive/test/driver/llm-state.test.ts new file mode 100644 index 00000000000..2fc3476deea --- /dev/null +++ b/packages/drive/test/driver/llm-state.test.ts @@ -0,0 +1,95 @@ +import { describe, expect, it } from "vitest" +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import * as Stream from "effect/Stream" +import { LlmControllerError } from "../../src/driver/llm-errors.js" +import * as LlmState from "../../src/driver/llm-state.js" + +const completion = () => Effect.runSync(Deferred.make()) + +const request = (id: string): LlmState.AttachedRequest => ({ + request: { id, url: "https://example.test", body: {} }, + backend: {} as LlmState.AttachedRequest["backend"], +}) + +const handler: LlmState.ServeHandler = () => Stream.empty + +describe("LlmState", () => { + it("rejects queue/send after serve mode is selected", () => { + const state = LlmState.serve(LlmState.initial, handler) + expect(LlmState.rejectEnqueue(state, "queue")).toMatchObject({ + _tag: "LlmModeError", + operation: "queue", + }) + }) + + it("rejects serve after queue mode is selected", () => { + const state = LlmState.enqueue(LlmState.initial, { output: [] }) + expect(LlmState.rejectServe(state)).toMatchObject({ + _tag: "LlmModeError", + operation: "serve", + }) + }) + + it("rejects control calls while settling", () => { + const state = LlmState.beginSettling(LlmState.initial) + expect(LlmState.rejectEnqueue(state, "send")).toMatchObject({ + _tag: "LlmControllerError", + operation: "send", + }) + }) + + it("selects no job until a queued request has a queued response", () => { + const requested = LlmState.pushRequest(LlmState.initial, request("r1")) + expect(LlmState.nextNormal(requested)).toBeUndefined() + + const responded = LlmState.enqueue(requested, { output: [] }) + const start = LlmState.nextNormal(responded) + expect(start?.request.request.id).toBe("r1") + expect(start?.source._tag).toBe("Queued") + }) + + it("serve mode runs requests without queued responses", () => { + const state = LlmState.pushRequest(LlmState.serve(LlmState.initial, handler), request("r1")) + expect(LlmState.nextNormal(state)?.source._tag).toBe("Served") + }) + + it("startNormal consumes the request and response and bumps the index", () => { + const state = LlmState.enqueue(LlmState.pushRequest(LlmState.initial, request("r1")), { output: [] }) + const start = LlmState.nextNormal(state)! + const next = LlmState.startNormal(state, start, completion()) + expect(next.requests).toHaveLength(0) + expect(next.responses).toHaveLength(0) + expect(next.activeNormal).toHaveLength(1) + expect(next.requestIndex).toBe(1) + expect(LlmState.nextNormal(next)).toBeUndefined() + }) + + it("settles Done when idle, Wait while work remains, Fail on unexpected requests", () => { + expect(LlmState.inspectSettlement(LlmState.initial)._tag).toBe("Done") + + const waiting = LlmState.enqueue(LlmState.initial, { output: [] }) + expect(LlmState.inspectSettlement(waiting)._tag).toBe("Wait") + + const unexpected = LlmState.pushRequest(LlmState.enqueue(LlmState.initial, { output: [] }), request("r1")) + const drained = LlmState.startNormal(unexpected, LlmState.nextNormal(unexpected)!, completion()) + const late = LlmState.pushRequest(drained, request("r2")) + const settlement = LlmState.inspectSettlement({ + ...late, + activeNormal: [], + }) + expect(settlement).toMatchObject({ + _tag: "Fail", + error: { _tag: "LlmSettlementError", unexpectedRequests: 1 }, + }) + }) + + it("records only the first failure and keeps it", () => { + const error = (message: string) => new LlmControllerError({ operation: "test", message }) + const first = LlmState.recordFailure(LlmState.initial, error("first")) + expect(first[1].isFirst).toBe(true) + const second = LlmState.recordFailure(first[0], error("second")) + expect(second[1].isFirst).toBe(false) + expect(second[1].failure).toBe(first[1].failure) + }) +}) diff --git a/packages/drive/test/driver/report.test.ts b/packages/drive/test/driver/report.test.ts new file mode 100644 index 00000000000..e69e6b1a28b --- /dev/null +++ b/packages/drive/test/driver/report.test.ts @@ -0,0 +1,48 @@ +import { describe, expect, it } from "@effect/vitest" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import { AbsolutePath, decodeAbsolutePath, decodeRunReport } from "../../src/driver/report.js" + +const negotiated = { + _tag: "Negotiated" as const, + endpoint: "ws://127.0.0.1:40900", + role: "ui" as const, + protocolVersion: 1 as const, + server: { name: "opencode", version: "2.0.0" }, + capabilities: ["ui.state"], +} + +describe("driver report", () => { + it.effect("brands POSIX and Windows absolute paths", () => + Effect.gen(function* () { + expect(yield* decodeAbsolutePath("/tmp/drive")).toBe("/tmp/drive") + expect(yield* decodeAbsolutePath("C:\\drive\\output.mp4")).toBe("C:\\drive\\output.mp4") + expect(yield* decodeAbsolutePath("\\\\server\\share\\output.mp4")).toBe("\\\\server\\share\\output.mp4") + }), + ) + + it.effect("rejects relative and malformed paths", () => + Effect.gen(function* () { + for (const path of ["tmp/drive", "../drive", "", "C:drive", "/tmp/\0drive"]) { + expect(Exit.isFailure(yield* Effect.exit(decodeAbsolutePath(path)))).toBe(true) + } + }), + ) + + it.effect("decodes a compact structured report", () => + Effect.gen(function* () { + const report = yield* decodeRunReport({ + artifacts: "/tmp/drive", + retained: true, + recordings: ["/tmp/output.mp4"], + compatibility: [negotiated], + }) + expect(report).toEqual({ + artifacts: AbsolutePath.make("/tmp/drive"), + retained: true, + recordings: [AbsolutePath.make("/tmp/output.mp4")], + compatibility: [negotiated], + }) + }), + ) +}) diff --git a/packages/drive/test/driver/shared.test.ts b/packages/drive/test/driver/shared.test.ts new file mode 100644 index 00000000000..62eb74b6a7f --- /dev/null +++ b/packages/drive/test/driver/shared.test.ts @@ -0,0 +1,20 @@ +import { expect, it } from "@effect/vitest" +import { Deferred, Effect, Fiber, Ref } from "effect" +import * as SharedEffect from "../../src/driver/shared.js" + +it.effect("does not let an interrupted caller poison terminal work", () => + Effect.gen(function* () { + const gate = yield* Deferred.make() + const runs = yield* Ref.make(0) + const shared = yield* SharedEffect.make( + Ref.update(runs, (count) => count + 1).pipe(Effect.andThen(Deferred.await(gate)), Effect.as("settled")), + ) + const first = yield* Effect.forkChild(shared) + yield* Effect.yieldNow + yield* Fiber.interrupt(first) + yield* Deferred.succeed(gate, undefined) + + expect(yield* shared).toBe("settled") + expect(yield* Ref.get(runs)).toBe(1) + }), +) diff --git a/packages/drive/test/driver/ui.test.ts b/packages/drive/test/driver/ui.test.ts new file mode 100644 index 00000000000..89f4c7365fc --- /dev/null +++ b/packages/drive/test/driver/ui.test.ts @@ -0,0 +1,427 @@ +import { describe, expect, it } from "@effect/vitest" +import { Effect } from "effect" +import * as OpenCodeUi from "../../src/driver/ui.js" +import * as SimulationConnector from "../../src/simulation/connector.js" +import { sendError, sendResult, startTransportPeer } from "../simulation/transport-peer.js" + +const editor = { + id: "prompt", + num: 3, + x: 2, + y: 4, + width: 20, + height: 6, + focusable: true, + focused: true, + clickable: true, + editor: true, +} + +const state = { + focused: { renderable: 3, editor: true }, + elements: [editor], +} + +const snapshot = { + format: "opencode-ui-snapshot-v1", + nodes: [ + { + id: "session.permission", + instance: "permission-1", + role: "dialog", + label: "Permission required: Edit fixture.txt", + element: 2, + expanded: false, + }, + { + id: "session.permission.action.once", + instance: "permission-1", + parent: "session.permission", + role: "option", + label: "Allow once", + element: 3, + focused: true, + selected: true, + disabled: false, + }, + ], +} + +const frame = { + cols: 2, + rows: 1, + cursor: [0, 0] as const, + lines: [ + { + spans: [{ text: "ok", fg: [255, 255, 255, 255] as const, bg: [0, 0, 0, 255] as const, attributes: 0, width: 2 }], + }, + ], +} + +describe("OpenCodeUi", () => { + it.live("captures a normalized terminal frame", () => { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, frame)) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + expect(yield* OpenCodeUi.make(connection).capture()).toEqual(frame) + expect(peer.received.map(({ request }) => request)).toEqual([{ jsonrpc: "2.0", id: 1, method: "ui.capture" }]) + }) + }) + + it.live("wraps generated UI RPCs with user-level operations", () => { + let matchCalls = 0 + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "ui.matches") { + matchCalls++ + sendResult(socket, request, matchCalls > 1) + return + } + if (request.method === "ui.screenshot") { + sendResult(socket, request, "/tmp/home.png") + return + } + sendResult(socket, request, state) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const ui = OpenCodeUi.make(connection) + + expect(yield* ui.submit("hello")).toEqual(state) + expect(yield* ui.press("escape", { ctrl: true })).toEqual(state) + expect(yield* ui.click(3)).toEqual(state) + expect(yield* ui.screenshot("home")).toBe("/tmp/home.png") + expect(yield* ui.waitFor("ready", { timeout: 1_000, interval: 1 })).toEqual(state) + expect(yield* ui.getElement({ editor: true })).toEqual(editor) + + expect(peer.received.map(({ request }) => request)).toEqual([ + { + jsonrpc: "2.0", + id: 1, + method: "ui.type", + params: { text: "hello" }, + }, + { jsonrpc: "2.0", id: 2, method: "ui.enter" }, + { + jsonrpc: "2.0", + id: 3, + method: "ui.press", + params: { key: "escape", modifiers: { ctrl: true } }, + }, + { jsonrpc: "2.0", id: 4, method: "ui.state" }, + { + jsonrpc: "2.0", + id: 5, + method: "ui.click", + params: { target: 3, x: 10, y: 3 }, + }, + { + jsonrpc: "2.0", + id: 6, + method: "ui.screenshot", + params: { name: "home" }, + }, + { + jsonrpc: "2.0", + id: 7, + method: "ui.matches", + params: { text: "ready" }, + }, + { + jsonrpc: "2.0", + id: 8, + method: "ui.matches", + params: { text: "ready" }, + }, + { jsonrpc: "2.0", id: 9, method: "ui.state" }, + { jsonrpc: "2.0", id: 10, method: "ui.state" }, + ]) + }) + }) + + it.live("selects and clicks semantic UI nodes", () => { + let snapshotCalls = 0 + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "ui.snapshot") { + snapshotCalls++ + sendResult(socket, request, snapshotCalls === 2 ? { format: "opencode-ui-snapshot-v1", nodes: [] } : snapshot) + return + } + sendResult(socket, request, state) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const ui = OpenCodeUi.make(connection) + + expect(yield* ui.snapshot()).toEqual(snapshot) + const option = yield* ui.getNode( + { + instance: "permission-1", + role: "option", + selected: true, + disabled: false, + }, + { interval: 1 }, + ) + expect(option).toEqual(snapshot.nodes[1]) + expect(yield* ui.click(option)).toEqual(state) + expect(peer.received.map(({ request }) => request)).toEqual([ + { jsonrpc: "2.0", id: 1, method: "ui.snapshot" }, + { jsonrpc: "2.0", id: 2, method: "ui.snapshot" }, + { jsonrpc: "2.0", id: 3, method: "ui.snapshot" }, + { jsonrpc: "2.0", id: 4, method: "ui.state" }, + { + jsonrpc: "2.0", + id: 5, + method: "ui.click", + params: { + target: 3, + x: 10, + y: 3, + semantic: { + id: "session.permission.action.once", + instance: "permission-1", + element: 3, + }, + }, + }, + ]) + }) + }) + + it.live("sends stale semantic handles to the endpoint without polling", () => { + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "ui.state") { + sendResult(socket, request, { ...state, elements: [] }) + return + } + sendError(socket, request, "target is stale") + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const error = yield* OpenCodeUi.make(connection).click(snapshot.nodes[1]!).pipe(Effect.flip) + + expect(error).toMatchObject({ + _tag: "SimulationRequestError", + method: "ui.click", + message: "target is stale", + }) + expect(peer.received.map(({ request }) => request)).toEqual([ + { jsonrpc: "2.0", id: 1, method: "ui.state" }, + { + jsonrpc: "2.0", + id: 2, + method: "ui.click", + params: { + target: 3, + x: 0, + y: 0, + semantic: { + id: "session.permission.action.once", + instance: "permission-1", + element: 3, + }, + }, + }, + ]) + }) + }) + + it.live("reports unavailable semantic snapshots without breaking older endpoints", () => { + const peer = startTransportPeer( + ({ request, socket }) => { + if (request.method === "simulation.handshake") { + const params = request.params as { + readonly requiredCapabilities: ReadonlyArray + } + sendResult(socket, request, { + protocolVersion: 1, + role: "ui", + server: { name: "opencode", version: "older" }, + capabilities: params.requiredCapabilities, + }) + return + } + sendResult(socket, request, state) + }, + { handshake: false }, + ) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const ui = OpenCodeUi.make(connection) + + expect(yield* ui.state()).toEqual(state) + const error = yield* ui.snapshot().pipe(Effect.flip) + expect(error).toBeInstanceOf(OpenCodeUi.UiCapabilityError) + expect(error).toMatchObject({ + capability: "ui.snapshot", + message: "ui.snapshot is not available on this OpenCode endpoint", + }) + const clickError = yield* ui.click(snapshot.nodes[1]!).pipe(Effect.flip) + expect(clickError).toMatchObject({ + capability: "ui.click.semantic", + message: "semantic ui.click is not available on this OpenCode endpoint", + }) + expect(peer.received.map(({ request }) => request.method)).toEqual(["simulation.handshake", "ui.state"]) + }) + }) + + it.live("reports ambiguous semantic nodes as typed UI failures", () => { + const peer = startTransportPeer(({ request, socket }) => + sendResult(socket, request, { + ...snapshot, + nodes: [ + snapshot.nodes[0], + snapshot.nodes[1], + { + ...snapshot.nodes[1], + id: "session.permission.action.always", + element: 4, + }, + ], + }), + ) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const error = yield* OpenCodeUi.make(connection).getNode({ role: "option" }).pipe(Effect.flip) + expect(error).toBeInstanceOf(OpenCodeUi.UiNodeAmbiguousError) + expect(error).toMatchObject({ + count: 2, + message: "ui.getNode matched 2 semantic nodes", + }) + }) + }) + + it.live("reports ambiguous elements as typed UI failures", () => { + const peer = startTransportPeer(({ request, socket }) => + sendResult(socket, request, { + ...state, + elements: [editor, { ...editor, num: 4 }], + }), + ) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const error = yield* OpenCodeUi.make(connection).getElement({ editor: true }).pipe(Effect.flip) + expect(error).toBeInstanceOf(OpenCodeUi.UiElementAmbiguousError) + expect(error).toMatchObject({ + count: 2, + message: "ui.getElement matched 2 elements", + }) + }) + }) + + it.live("rejects non-boolean Effect predicate values", () => { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, state)) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const predicate = (() => Effect.succeed("not boolean")) as unknown as OpenCodeUi.EffectPredicate + const error = yield* OpenCodeUi.make(connection).waitFor(predicate).pipe(Effect.flip) + + expect(error).toBeInstanceOf(OpenCodeUi.UiPredicateError) + expect(error).toMatchObject({ + message: "ui.waitFor predicate must return a boolean or Effect", + }) + }) + }) + + it.live("interrupts timed-out polling and remains usable", () => { + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "ui.matches") return + if (request.method === "ui.capture") { + sendResult(socket, request, frame) + return + } + sendResult(socket, request, state) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const ui = OpenCodeUi.make(connection) + const error = yield* ui.waitFor("never", { timeout: 20, interval: 100 }).pipe(Effect.flip) + + expect(error).toBeInstanceOf(OpenCodeUi.UiTimeoutError) + expect(error).toMatchObject({ + operation: "waitFor", + milliseconds: 20, + frame, + }) + expect(yield* ui.state()).toEqual(state) + expect(peer.received.map(({ request }) => request)).toEqual([ + { + jsonrpc: "2.0", + id: 1, + method: "ui.matches", + params: { text: "never" }, + }, + { jsonrpc: "2.0", id: 2, method: "ui.capture" }, + { jsonrpc: "2.0", id: 3, method: "ui.state" }, + ]) + }) + }) + + it.live("preserves the polling timeout when evidence capture fails", () => { + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "ui.matches") return + sendError(socket, request, "capture failed") + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const error = yield* OpenCodeUi.make(connection) + .waitFor("never", { timeout: 20, interval: 100 }) + .pipe(Effect.flip) + + expect(error).toBeInstanceOf(OpenCodeUi.UiTimeoutError) + expect(error).toMatchObject({ + operation: "waitFor", + milliseconds: 20, + message: 'timed out waiting for the UI to match "never"', + }) + expect(error).not.toHaveProperty("frame") + expect(peer.received.map(({ request }) => request)).toEqual([ + { + jsonrpc: "2.0", + id: 1, + method: "ui.matches", + params: { text: "never" }, + }, + { jsonrpc: "2.0", id: 2, method: "ui.capture" }, + ]) + }) + }) + + it.live("does not retry RPC failures while polling", () => { + const peer = startTransportPeer(({ request, socket }) => sendError(socket, request, "match failed")) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.ui(peer.url) + const error = yield* OpenCodeUi.make(connection) + .waitFor("ready", { timeout: 1_000, interval: 1 }) + .pipe(Effect.flip) + expect(error).toMatchObject({ + _tag: "SimulationRequestError", + method: "ui.matches", + message: "match failed", + }) + expect(peer.received).toHaveLength(1) + }) + }) +}) diff --git a/packages/drive/test/fixtures/callback-script.ts b/packages/drive/test/fixtures/callback-script.ts new file mode 100644 index 00000000000..3fe96464f1d --- /dev/null +++ b/packages/drive/test/fixtures/callback-script.ts @@ -0,0 +1 @@ +export default async function callbackScript() {} diff --git a/packages/drive/test/fixtures/caught-timeout-script.ts b/packages/drive/test/fixtures/caught-timeout-script.ts new file mode 100644 index 00000000000..a98df98e19a --- /dev/null +++ b/packages/drive/test/fixtures/caught-timeout-script.ts @@ -0,0 +1,12 @@ +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" + +export default defineScript({ + run: ({ ui }) => + Effect.gen(function* () { + yield* Effect.matchEffect(ui.waitFor("this text never appears", { timeout: 50 }), { + onFailure: () => Effect.sleep(30_000), + onSuccess: Effect.succeed, + }) + }), +}) diff --git a/packages/drive/test/fixtures/crashing-script.ts b/packages/drive/test/fixtures/crashing-script.ts new file mode 100644 index 00000000000..4eb2a466ef5 --- /dev/null +++ b/packages/drive/test/fixtures/crashing-script.ts @@ -0,0 +1,14 @@ +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" + +export default defineScript({ + run: () => + Effect.gen(function* () { + Bun.serve({ + hostname: "127.0.0.1", + port: 0, + fetch: () => new Response("leaked script server"), + }) + yield* Effect.fail(new Error("script crashed")) + }), +}) diff --git a/packages/drive/test/fixtures/failed-launch-retry-script.ts b/packages/drive/test/fixtures/failed-launch-retry-script.ts new file mode 100644 index 00000000000..b281fef11ec --- /dev/null +++ b/packages/drive/test/fixtures/failed-launch-retry-script.ts @@ -0,0 +1,43 @@ +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" + +export default defineScript({ + launch: "manual", + run: ({ server, artifacts }) => + Effect.gen(function* () { + const first = yield* server.launch().pipe(Effect.flip) + const firstPid = yield* servicePid(artifacts) + yield* waitUntilStopped(firstPid) + + const second = yield* server.launch().pipe(Effect.flip) + const secondPid = yield* servicePid(artifacts) + yield* waitUntilStopped(secondPid) + + if (first.operation !== "opencode.connect" || second.operation !== "opencode.connect") + return yield* Effect.fail(new Error(`unexpected launch failures: ${first.operation}, ${second.operation}`)) + if (firstPid === secondPid) + return yield* Effect.fail(new Error("failed launch did not start a fresh server process")) + + yield* Effect.tryPromise(() => + Bun.write(`${artifacts}/failed-launch-retry.json`, JSON.stringify({ firstPid, secondPid })), + ) + }), +}) + +const servicePid = (artifacts: string) => + Effect.tryPromise(() => Bun.file(`${artifacts}/service.pid`).text().then(Number)) + +const waitUntilStopped = (pid: number) => + Effect.gen(function* () { + for (let attempt = 0; attempt < 100 && running(pid); attempt++) yield* Effect.sleep(10) + if (running(pid)) return yield* Effect.fail(new Error(`server process ${pid} is still running`)) + }) + +function running(pid: number) { + try { + process.kill(pid, 0) + return true + } catch { + return false + } +} diff --git a/packages/drive/test/fixtures/fake-opencode.ts b/packages/drive/test/fixtures/fake-opencode.ts new file mode 100644 index 00000000000..c1ccc64eded --- /dev/null +++ b/packages/drive/test/fixtures/fake-opencode.ts @@ -0,0 +1,387 @@ +import { mkdir } from "node:fs/promises" +import { resolve } from "node:path" + +const serviceMode = process.env.OPENCODE_DRIVE_SCRIPTED === "1" +const role = serviceMode + ? process.argv.includes("serve") && process.argv.includes("--service") + ? "service" + : "client" + : "legacy" +if (process.argv.includes("stdio-markers")) { + console.log(`fake-${role}-stdout`) + console.error(`fake-${role}-stderr`) +} +if (role === "service" && process.env.OPENCODE_TEST_HOME) + await Promise.all([ + Bun.write(`${process.env.OPENCODE_TEST_HOME}/service.pid`, String(process.pid)), + Bun.write(`${process.env.OPENCODE_TEST_HOME}/service-argv.json`, JSON.stringify(process.argv.slice(2))), + Bun.write(`${process.env.OPENCODE_TEST_HOME}/service-db.txt`, process.env.OPENCODE_DB ?? "missing"), + ]) + +const screen = { value: `Fake OpenCode${role === "client" ? ` ${process.env.OPENCODE_DRIVE}` : ""}` } +const drive = await resolveDrive() +const recordingStarted = performance.now() +const endpoints = drive.endpoints +let toolAttachments = 0 +let backendHandshakes = 0 +const exitAfterAttach = Promise.withResolvers() +const servicePassword = "drive-test-password" +const api = + role === "service" + ? Bun.serve({ + hostname: "127.0.0.1", + port: 0, + fetch(request) { + if (request.headers.get("authorization") !== `Basic ${btoa(`opencode:${servicePassword}`)}`) + return Response.json({ _tag: "UnauthorizedError", message: "Unauthorized" }, { status: 401 }) + const url = new URL(request.url) + if (url.pathname === "/api/health") return Response.json({ healthy: true, version: "test", pid: process.pid }) + if (url.pathname === "/api/server") { + const directory = process.env.XDG_STATE_HOME + ? resolve(process.env.XDG_STATE_HOME, "../../..", "files") + : undefined + if (request.headers.get("x-opencode-directory") !== encodeURIComponent(directory ?? "")) + return Response.json({ _tag: "InvalidRequestError", message: "Wrong directory" }, { status: 400 }) + return Response.json({ urls: [] }) + } + return Response.json({ _tag: "InvalidRequestError", message: "Not found" }, { status: 404 }) + }, + }) + : undefined +if (api !== undefined && process.env.XDG_STATE_HOME && !process.argv.includes("omit-service-registration")) { + const directory = `${process.env.XDG_STATE_HOME}/opencode` + await mkdir(directory, { recursive: true }) + await Bun.write( + `${directory}/service-testchannel.json`, + JSON.stringify({ + id: crypto.randomUUID(), + version: "test", + url: `http://127.0.0.1:${api.port}`, + pid: process.pid, + password: servicePassword, + }), + ) +} +if (drive.recording && role !== "service") + await Bun.write( + drive.recording.timeline, + `${JSON.stringify({ type: "header", version: 1, cols: 100, rows: 40, encoding: "base64" })}\n${JSON.stringify({ type: "output", at_ms: 0, data: Buffer.from("Fake OpenCode").toString("base64") })}\n`, + ) +if (process.env.OPENCODE_TEST_HOME && role !== "service") { + await Bun.write(`${process.env.OPENCODE_TEST_HOME}/child.pid`, String(process.pid)) + const launches = `${process.env.OPENCODE_TEST_HOME}/launches.txt` + await appendFile(launches, "launch\n") + await Bun.write(`${process.env.OPENCODE_TEST_HOME}/renderer.txt`, process.env.OPENCODE_DRIVE_RENDERER ?? "missing") + await Bun.write(`${process.env.OPENCODE_TEST_HOME}/child-cwd.txt`, process.cwd()) + const seeded = `${process.cwd()}/src/seeded.ts` + if (await Bun.file(seeded).exists()) + await Bun.write(`${process.env.OPENCODE_TEST_HOME}/seeded-at-launch.txt`, await Bun.file(seeded).text()) +} + +const ui = + role === "service" || process.argv.includes("no-ui") + ? undefined + : Bun.serve({ + hostname: "127.0.0.1", + port: Number(new URL(endpoints.ui).port), + fetch(request, server) { + if (server.upgrade(request)) return + return new Response("drive websocket", { status: 426 }) + }, + websocket: { + message(socket, input) { + const request = JSON.parse(String(input)) as { + readonly id?: number + readonly method: string + readonly params?: unknown + } + const result = frontend(request.method, request.params) + if (request.id !== undefined) socket.send(JSON.stringify({ jsonrpc: "2.0", id: request.id, result })) + }, + }, + }) + +const backend = + role === "client" + ? undefined + : Bun.serve({ + hostname: "127.0.0.1", + port: Number(new URL(endpoints.backend).port), + fetch(request, server) { + if (server.upgrade(request)) return + return new Response("drive websocket", { status: 426 }) + }, + websocket: { + async message(socket, input) { + const request = JSON.parse(String(input)) as { + readonly id?: number + readonly method: string + readonly params?: unknown + } + if ( + request.method === "simulation.handshake" && + process.argv.includes("reject-tool-handshake") && + ++backendHandshakes === 2 + ) { + if (request.id !== undefined) + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + id: request.id, + error: { code: -32000, message: "tool handshake rejected" }, + }), + ) + return + } + if (request.method === "llm.chunk" && process.env.OPENCODE_TEST_HOME) { + await Bun.write(`${process.env.OPENCODE_TEST_HOME}/mock-response.json`, JSON.stringify(request.params)) + } + if (request.method.startsWith("llm.") && process.env.OPENCODE_TEST_HOME) { + const events = `${process.env.OPENCODE_TEST_HOME}/backend-events.jsonl` + await appendFile(events, `${JSON.stringify({ method: request.method, params: request.params })}\n`) + } + if (request.method.startsWith("tool.") && process.env.OPENCODE_TEST_HOME) { + const events = `${process.env.OPENCODE_TEST_HOME}/tool-events.jsonl` + await appendFile(events, `${JSON.stringify({ method: request.method, params: request.params })}\n`) + } + if (request.method === "tool.attach" && process.argv.includes("dynamic-tool")) + if ((++toolAttachments === 1 && !process.argv.includes("reconnect-tool")) || toolAttachments === 2) + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "tool.invocation", + params: { + id: "tool_1", + name: "lookup", + input: { query: "meaning" }, + context: { + sessionID: "ses_dynamic", + agent: "build", + messageID: "msg_dynamic", + id: "call_lookup", + }, + }, + }), + ) + if ( + request.method === "tool.attach" && + process.argv.includes("reject-tool-reconnect") && + toolAttachments === 2 + ) { + if (request.id !== undefined) + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + id: request.id, + error: { code: -32000, message: "tool reconnect rejected" }, + }), + ) + return + } + const result = + request.method === "simulation.handshake" + ? handshake(request.params, "backend") + : request.method === "llm.attach" || request.method === "tool.attach" + ? { attached: true } + : { ok: true } + if (request.id !== undefined) socket.send(JSON.stringify({ jsonrpc: "2.0", id: request.id, result })) + if (request.method === "tool.attach" && process.argv.includes("reconnect-tool") && toolAttachments === 1) + setTimeout(() => socket.close(), 10) + if (request.method === "llm.attach") { + const requestDelay = Number(process.argv[3]) + if (Number.isFinite(requestDelay)) await Bun.sleep(requestDelay) + if (process.argv.includes("title-requests")) + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: { + id: "ex_title", + url: "https://api.openai.com/v1/chat/completions", + body: { + messages: [ + { + role: "system", + content: "You are a title generator. You output ONLY a thread title.", + }, + ], + }, + }, + }), + ) + if (process.argv.includes("latest-title-requests")) + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: { + id: "ex_title", + url: "https://api.openai.com/v1/chat/completions", + body: { + messages: [ + { + role: "user", + content: "Generate a title for this conversation:\n", + }, + { + role: "user", + content: "Show a compact status report for the viewport resize demo.", + }, + ], + }, + }, + }), + ) + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: { + id: "ex_mock", + url: "https://api.openai.com/v1/chat/completions", + body: {}, + }, + }), + ) + if (process.argv.includes("exit-after-attach")) exitAfterAttach.resolve() + } + }, + }, + }) + +if (process.argv.includes("write-stdio")) { + console.log(`fake opencode ${role} stdout`) + console.error(`fake opencode ${role} stderr`) +} + +await new Promise((resolve) => { + process.once("SIGINT", resolve) + if (process.argv.includes("ignore-sigterm")) process.on("SIGTERM", () => undefined) + else process.once("SIGTERM", resolve) + const lifetime = role === "service" ? Number.NaN : Number(process.argv[2]) + if (Number.isFinite(lifetime)) setTimeout(resolve, lifetime) + if (process.argv.includes("exit-after-attach")) void exitAfterAttach.promise.then(resolve) +}) +await Promise.all([ui?.stop(true), backend?.stop(true)]) + +function frontend(method: string, params: unknown) { + if (method === "simulation.handshake") return handshake(params, "ui") + if (method === "ui.capture") { + return { + cols: 80, + rows: 24, + cursor: [0, 0], + lines: [ + { + spans: [ + { + text: screen.value, + fg: [255, 255, 255, 255], + bg: [0, 0, 0, 255], + attributes: 0, + width: screen.value.length, + }, + ], + }, + ], + } + } + if (method === "ui.snapshot") { + return { + format: "opencode-ui-snapshot-v1", + nodes: [ + { + id: "prompt", + role: "textbox", + label: "Prompt", + element: 1, + focused: true, + disabled: false, + }, + ], + } + } + if (method === "ui.screenshot") { + const name = isRecord(params) && typeof params.name === "string" ? params.name : `screenshot-${crypto.randomUUID()}` + return `${process.env.OPENCODE_DRIVE_MEDIA_DIR}/${name}.png` + } + if (method === "ui.recording.finish") { + if (!drive.recording) throw new Error("recording is not enabled") + return drive.recording.timeline + } + if (method === "ui.resize" && drive.recording && isRecord(params)) { + void appendFile( + drive.recording.timeline, + `${JSON.stringify({ + type: "resize", + at_ms: Math.max(1, Math.round(performance.now() - recordingStarted)), + cols: params.cols, + rows: params.rows, + })}\n`, + ) + } + if (method === "ui.matches" && isRecord(params) && typeof params.text === "string") + return screen.value.includes(params.text) + if (method === "ui.type" && isRecord(params) && typeof params.text === "string") screen.value += `\n${params.text}` + if (method === "ui.enter") screen.value += "\n[enter]" + if (method === "trace.list" || method === "trace.export") return { records: [] } + if (method === "trace.clear") return { cleared: true } + return { + screen: screen.value, + focused: { renderable: 1, editor: true }, + elements: [ + { + id: "prompt", + num: 1, + x: 0, + y: 0, + width: 80, + height: 1, + focusable: true, + focused: true, + clickable: true, + editor: true, + }, + ], + } +} + +function handshake(params: unknown, role: "ui" | "backend") { + if (!isRecord(params)) throw new Error("invalid handshake") + const required = Array.isArray(params.requiredCapabilities) + ? params.requiredCapabilities.filter((value): value is string => typeof value === "string") + : [] + const optional = Array.isArray(params.optionalCapabilities) + ? params.optionalCapabilities.filter((value): value is string => typeof value === "string") + : [] + return { + protocolVersion: 1, + role, + server: { name: "opencode", version: "test" }, + capabilities: [...required, ...optional], + } +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +async function resolveDrive() { + if (process.env.DRIVE_REGISTRY_DIR && process.env.OPENCODE_DRIVE !== "1") { + const manifest = (await Bun.file( + `${process.env.DRIVE_REGISTRY_DIR}/${process.env.OPENCODE_DRIVE}.json`, + ).json()) as { + readonly endpoints: { readonly ui: string; readonly backend: string } + readonly recording?: { readonly timeline: string } + } + return manifest + } + return { + endpoints: { + ui: "ws://127.0.0.1:40900", + backend: "ws://127.0.0.1:40950", + }, + recording: { timeline: "/tmp/opencode-drive-fake/recording.jsonl" }, + } +} +import { appendFile } from "node:fs/promises" diff --git a/packages/drive/test/fixtures/hanging-script.ts b/packages/drive/test/fixtures/hanging-script.ts new file mode 100644 index 00000000000..95581dcd639 --- /dev/null +++ b/packages/drive/test/fixtures/hanging-script.ts @@ -0,0 +1,9 @@ +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" + +export default defineScript({ + run: () => + Effect.gen(function* () { + yield* Effect.never + }), +}) diff --git a/packages/drive/test/fixtures/kill-primary-script.ts b/packages/drive/test/fixtures/kill-primary-script.ts new file mode 100644 index 00000000000..22d704db0db --- /dev/null +++ b/packages/drive/test/fixtures/kill-primary-script.ts @@ -0,0 +1,12 @@ +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" + +export default defineScript({ + run: ({ tui, ui }) => + Effect.gen(function* () { + yield* tui.close() + const closed = Exit.isFailure(yield* Effect.exit(ui.state())) + if (!closed) yield* Effect.fail(new Error("primary TUI remained connected after tui.close()")) + }), +}) diff --git a/packages/drive/test/fixtures/kill-server-script.ts b/packages/drive/test/fixtures/kill-server-script.ts new file mode 100644 index 00000000000..d5f6af494fb --- /dev/null +++ b/packages/drive/test/fixtures/kill-server-script.ts @@ -0,0 +1,57 @@ +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" + +export default defineScript({ + launch: "manual", + run: ({ server, tools, tuis, artifacts }) => + Effect.gen(function* () { + yield* server.launch() + const firstServer = Number(yield* Effect.tryPromise(() => Bun.file(`${artifacts}/service.pid`).text())) + const [alice] = yield* Effect.all( + [tuis.launch("alice", { recording: true }), tuis.launch("bob", { recording: true })], + { concurrency: "unbounded" }, + ) + + yield* server.kill() + for (let attempt = 0; attempt < 100 && running(firstServer); attempt++) yield* Effect.sleep(10) + if (running(firstServer)) return yield* Effect.fail(new Error("the first server is still running")) + + yield* server.launch() + const secondServer = Number(yield* Effect.tryPromise(() => Bun.file(`${artifacts}/service.pid`).text())) + if (secondServer === firstServer) return yield* Effect.fail(new Error("the server was not relaunched")) + + const recording = alice.recording + if (recording === undefined) return yield* Effect.fail(new Error("alice recording was not configured")) + const aliceRecording = yield* recording.finish() + yield* alice.close() + const relaunchedAlice = yield* tuis.launch("alice") + yield* relaunchedAlice.close() + yield* tools.attach({ + tools: [ + { + name: "lookup", + description: "Look up a value", + inputSchema: { type: "object" }, + options: { codemode: false }, + }, + ], + }) + yield* server.kill() + + yield* Effect.tryPromise(() => + Bun.write( + `${artifacts}/kill-server-result.json`, + JSON.stringify({ firstServer, secondServer, aliceRecording }), + ), + ) + }), +}) + +function running(pid: number) { + try { + process.kill(pid, 0) + return true + } catch { + return false + } +} diff --git a/packages/drive/test/fixtures/manual-clients-script.ts b/packages/drive/test/fixtures/manual-clients-script.ts new file mode 100644 index 00000000000..391cc9b49ae --- /dev/null +++ b/packages/drive/test/fixtures/manual-clients-script.ts @@ -0,0 +1,52 @@ +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" + +export default defineScript({ + launch: "manual", + run: ({ ui, server, tuis, artifacts }) => + Effect.gen(function* () { + if (ui !== null) return yield* Effect.fail(new Error("manual scripts must not receive a default UI")) + const tuiBeforeServer = yield* Effect.matchEffect(tuis.launch("too-early"), { + onFailure: (error) => Effect.succeed(errorMessage(error)), + onSuccess: () => Effect.succeed("unexpected success"), + }) + const opencode = yield* server.launch() + const health = yield* opencode.health.get() + const duplicateServer = yield* Effect.matchEffect(server.launch(), { + onFailure: (error) => Effect.succeed(errorMessage(error)), + onSuccess: () => Effect.succeed("unexpected success"), + }) + const [alice, bob] = yield* Effect.all([tuis.launch("alice"), tuis.launch("bob")], { concurrency: "unbounded" }) + yield* alice.ui.submit("from alice") + yield* bob.ui.submit("from bob") + const [aliceMatches, bobMatches, aliceScreenshot, bobScreenshot, aliceFrame] = yield* Effect.all( + [ + alice.ui.matches("tui-alice"), + bob.ui.matches("tui-bob"), + alice.ui.screenshot("alice"), + bob.ui.screenshot("bob"), + alice.ui.capture(), + ], + { concurrency: "unbounded" }, + ) + yield* Effect.tryPromise(() => + Bun.write( + `${artifacts}/manual-clients.json`, + JSON.stringify({ + aliceMatches, + aliceFrame: { cols: aliceFrame.cols, rows: aliceFrame.rows }, + bobMatches, + apiHealthy: health.healthy, + tuiBeforeServer, + duplicateServer, + aliceScreenshot, + bobScreenshot, + }), + ), + ) + }), +}) + +function errorMessage(error: unknown) { + return error instanceof Error ? error.message : String(error) +} diff --git a/packages/drive/test/fixtures/prepared-git-script.ts b/packages/drive/test/fixtures/prepared-git-script.ts new file mode 100644 index 00000000000..28df43b7b2b --- /dev/null +++ b/packages/drive/test/fixtures/prepared-git-script.ts @@ -0,0 +1,32 @@ +import { join } from "node:path" +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" + +let setupGitError: string | undefined + +export default defineScript({ + launch: "manual", + setup: ({ fs }) => + Effect.gen(function* () { + setupGitError = yield* Effect.matchEffect(fs.writeFile(".GIT/config", "setup must not replace Git metadata\n"), { + onFailure: (error) => Effect.succeed(String(error)), + onSuccess: () => Effect.succeed(undefined), + }) + }), + run: ({ artifacts, fs }) => + Effect.gen(function* () { + const runGitError = yield* Effect.matchEffect( + fs.writeFile(".GIT/config", "run must not replace Git metadata\n"), + { + onFailure: (error) => Effect.succeed(String(error)), + onSuccess: () => Effect.succeed(undefined), + }, + ) + yield* Effect.tryPromise(() => + Bun.write( + join(artifacts, "prepared-git-result.json"), + `${JSON.stringify({ runGitError, setupGitError }, undefined, 2)}\n`, + ), + ) + }), +}) diff --git a/packages/drive/test/fixtures/restart-script.ts b/packages/drive/test/fixtures/restart-script.ts new file mode 100644 index 00000000000..cdc4497d137 --- /dev/null +++ b/packages/drive/test/fixtures/restart-script.ts @@ -0,0 +1,26 @@ +import { defineScript, Llm } from "opencode-drive" +import * as Effect from "effect/Effect" +import * as Stream from "effect/Stream" + +export default defineScript({ + run: ({ artifacts, llm, ui }) => + Effect.gen(function* () { + yield* llm.serve(() => Stream.fromEffect(Effect.sleep(500).pipe(Effect.as(Llm.text("late response"))))) + const file = `${artifacts}/script-runs.txt` + const screenshotFile = `${artifacts}/script-screenshots.txt` + const previous = yield* Effect.promise(() => + Bun.file(file) + .text() + .catch(() => ""), + ) + const screenshots = yield* Effect.promise(() => + Bun.file(screenshotFile) + .text() + .catch(() => ""), + ) + const screenshot = yield* ui.screenshot("restart-shared") + yield* Effect.tryPromise(() => Bun.write(screenshotFile, `${screenshots}${screenshot}\n`)) + yield* Effect.tryPromise(() => Bun.write(file, `${previous}run\n`)) + yield* Effect.never + }), +}) diff --git a/packages/drive/test/fixtures/script.ts b/packages/drive/test/fixtures/script.ts new file mode 100644 index 00000000000..51cba946f0c --- /dev/null +++ b/packages/drive/test/fixtures/script.ts @@ -0,0 +1,50 @@ +import { join } from "node:path" +import { defineScript, Llm } from "opencode-drive" +import * as Effect from "effect/Effect" + +export default defineScript({ + config: { + test: { declared: true }, + }, + tuiConfig: { + test: { declared: true }, + }, + project: { + git: true, + files: { + "src/seeded.ts": "export const seeded = true\n", + }, + }, + setup: ({ fs, config, tuiConfig }) => + Effect.gen(function* () { + config.autoupdate = false + config.test = { ...(config.test as Record), setup: true } + tuiConfig.test = { ...(tuiConfig.test as Record), setup: true } + yield* fs.writeFile("setup-seeded.txt", "included in baseline\n") + }), + + run: ({ artifacts, fs, llm, ui }) => + Effect.gen(function* () { + const gitWriteError = yield* Effect.matchEffect(fs.writeFile(".GIT/config", "no"), { + onFailure: (error) => Effect.succeed(String(error)), + onSuccess: () => Effect.succeed(undefined), + }) + yield* ui.waitFor((state) => Effect.succeed(state.focused.editor)) + const editor = yield* ui.getElement(1) + yield* ui.focus(editor) + yield* ui.click(editor) + yield* ui.submit("script-text") + yield* llm.send(Llm.text("script response", { delay: 0, chunkSize: 3 })) + const matches = yield* ui.matches("script-text") + yield* ui.waitFor("script-text") + yield* ui.screenshot("script-shot") + const state = yield* ui.state() + const frame = yield* ui.capture() + yield* Effect.tryPromise(() => + Bun.write( + join(artifacts, "script-result.json"), + `${JSON.stringify({ focused: state.focused, frame: { cols: frame.cols, rows: frame.rows }, gitWriteError, matches }, undefined, 2)}\n`, + ), + ) + }), +}) diff --git a/packages/drive/test/fixtures/serve-script.ts b/packages/drive/test/fixtures/serve-script.ts new file mode 100644 index 00000000000..bba8e6e3200 --- /dev/null +++ b/packages/drive/test/fixtures/serve-script.ts @@ -0,0 +1,20 @@ +import { defineScript, Llm } from "opencode-drive" +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import * as Stream from "effect/Stream" + +export default defineScript({ + run: ({ llm }) => + Effect.gen(function* () { + const completed = yield* Deferred.make() + yield* llm.serve(() => + Stream.make( + Llm.reasoning("thinking", { delay: 0, chunkSize: 2 }), + Llm.pause(1), + Llm.text("served response"), + Llm.finish("length"), + ).pipe(Stream.onEnd(Deferred.succeed(completed, undefined))), + ) + yield* Deferred.await(completed) + }), +}) diff --git a/packages/drive/test/fixtures/source-script.ts b/packages/drive/test/fixtures/source-script.ts new file mode 100644 index 00000000000..24331bd2887 --- /dev/null +++ b/packages/drive/test/fixtures/source-script.ts @@ -0,0 +1,6 @@ +import { defineScript } from "../../src/index.js" +import * as Effect from "effect/Effect" + +export default defineScript({ + run: () => Effect.void, +}) diff --git a/packages/drive/test/fixtures/title-script.ts b/packages/drive/test/fixtures/title-script.ts new file mode 100644 index 00000000000..17d33749f88 --- /dev/null +++ b/packages/drive/test/fixtures/title-script.ts @@ -0,0 +1,12 @@ +import { defineScript, Llm } from "opencode-drive" +import * as Effect from "effect/Effect" + +export default defineScript({ + launch: "manual", + run: ({ server, llm }) => + Effect.gen(function* () { + yield* llm.title(() => Effect.succeed("Custom title")) + yield* server.launch() + yield* llm.send(Llm.text("Normal response")) + }), +}) diff --git a/packages/drive/test/fixtures/tool-control-script.ts b/packages/drive/test/fixtures/tool-control-script.ts new file mode 100644 index 00000000000..6265f8e6201 --- /dev/null +++ b/packages/drive/test/fixtures/tool-control-script.ts @@ -0,0 +1,51 @@ +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" +import * as Fiber from "effect/Fiber" + +export default defineScript({ + tools: ["shell"], + run: ({ tools, artifacts }) => + Effect.gen(function* () { + const shells = yield* tools.control("shell") + const options = yield* Effect.tryPromise(async () => { + const config: unknown = await Bun.file(`${artifacts}/files/.opencode/opencode.jsonc`).json() + if (typeof config !== "object" || config === null || !("plugins" in config)) + throw new Error("script config has no plugins") + const plugins = config.plugins + if (!Array.isArray(plugins)) throw new Error("script plugins are not an array") + const plugin = plugins.find((value) => typeof value === "object" && value !== null && "options" in value) + if (typeof plugin !== "object" || plugin === null || !("options" in plugin)) + throw new Error("Drive tool plugin is missing") + const value = plugin.options + if ( + typeof value !== "object" || + value === null || + !("endpoint" in value) || + typeof value.endpoint !== "string" || + !("token" in value) || + typeof value.token !== "string" + ) + throw new Error("Drive tool plugin options are invalid") + return { endpoint: value.endpoint, token: value.token } + }) + const response = yield* Effect.tryPromise((signal) => + fetch(`${options.endpoint}/execute/shell`, { + method: "POST", + headers: { + authorization: `Bearer ${options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input: { command: "controlled from script" }, + context: { callID: "call_script_control" }, + }), + signal, + }).then((value) => value.text()), + ).pipe(Effect.forkScoped) + const shell = yield* shells.take("call_script_control") + yield* shell.progress("script progress\n") + yield* shell.succeed({ output: "script success\n", exit: 0 }) + const events = yield* Fiber.join(response) + yield* Effect.promise(() => Bun.write(`${artifacts}/tool-control-events.jsonl`, events)) + }), +}) diff --git a/packages/drive/test/fixtures/tui-options-script.ts b/packages/drive/test/fixtures/tui-options-script.ts new file mode 100644 index 00000000000..a2f44e0fb30 --- /dev/null +++ b/packages/drive/test/fixtures/tui-options-script.ts @@ -0,0 +1,19 @@ +import { defineScript } from "opencode-drive" +import * as Effect from "effect/Effect" + +export default defineScript({ + tui: { recording: true, viewport: { cols: 90, rows: 30 } }, + run: ({ artifacts, tui, tuis }) => + Effect.gen(function* () { + const secondary = yield* tuis.launch() + yield* Effect.tryPromise(() => + Bun.write( + `${artifacts}/tui-options.json`, + `${JSON.stringify({ + primaryRecording: tui.recording !== undefined, + secondaryRecording: secondary.recording !== undefined, + })}\n`, + ), + ) + }), +}) diff --git a/packages/drive/test/frame.test.ts b/packages/drive/test/frame.test.ts new file mode 100644 index 00000000000..1df0263fdad --- /dev/null +++ b/packages/drive/test/frame.test.ts @@ -0,0 +1,73 @@ +import { describe, expect, it } from "vitest" +import { BlockGlyphs, CellHeight, CellWidth, TextStyle, drawBlockGlyph } from "../src/frame/index.js" + +describe("frame geometry", () => { + it("draws exactly the geometric block and bar primitives", () => { + expect(Object.keys(BlockGlyphs).sort()).toEqual(["█", "▀", "▄", "┃", "╹"].sort()) + }) + + it("keeps every glyph rectangle inside one cell", () => { + for (const glyph of Object.values(BlockGlyphs)) { + expect(glyph.x).toBeGreaterThanOrEqual(0) + expect(glyph.x + glyph.width).toBeLessThanOrEqual(CellWidth) + expect(glyph.y + glyph.height).toBeLessThanOrEqual(CellHeight) + } + }) + + it("stretches solid blocks across cells but keeps bars centered", () => { + const rects: Array = [] + const context = { + fillRect: (x: number, y: number, width: number, height: number) => void rects.push([x, y, width, height]), + } + expect(drawBlockGlyph(context, "█", 0, 0, 2)).toBe(true) + expect(drawBlockGlyph(context, "┃", 0, 0, 2)).toBe(true) + expect(drawBlockGlyph(context, "a", 0, 0)).toBe(false) + expect(rects).toEqual([ + [0, 0, 2 * CellWidth, CellHeight], + [CellWidth / 2 - 1, 0, 2, CellHeight], + ]) + }) + + it("draws light box borders as connected pixel geometry", () => { + const rects: Array = [] + const context = { + fillRect: (x: number, y: number, width: number, height: number) => void rects.push([x, y, width, height]), + } + expect(drawBlockGlyph(context, "│", 0, 0)).toBe(true) + expect(drawBlockGlyph(context, "─", CellWidth, 0)).toBe(true) + expect(drawBlockGlyph(context, "╭", CellWidth * 2, 0)).toBe(true) + expect(drawBlockGlyph(context, "┼", CellWidth * 3, 0)).toBe(true) + expect(rects.length).toBe(7) + expect( + rects.every( + ([x, y, width, height]) => + Number.isInteger(x) && Number.isInteger(y) && Number.isInteger(width) && Number.isInteger(height), + ), + ).toBe(true) + const pixels = rects.flatMap(([x, y, width, height]) => + Array.from({ length: width * height }, (_, index) => `${x + (index % width)},${y + Math.floor(index / width)}`), + ) + expect(new Set(pixels).size).toBe(pixels.length) + }) + + it("draws diagonal quadrant blocks edge-to-edge", () => { + const rects: Array = [] + const context = { + fillRect: (x: number, y: number, width: number, height: number) => void rects.push([x, y, width, height]), + } + expect(drawBlockGlyph(context, "▚", 0, 0)).toBe(true) + expect(drawBlockGlyph(context, "▞", CellWidth, 0)).toBe(true) + expect(rects).toEqual([ + [0, 0, CellWidth / 2, CellHeight / 2], + [CellWidth / 2, CellHeight / 2, CellWidth / 2, CellHeight / 2], + [CellWidth + CellWidth / 2, 0, CellWidth / 2, CellHeight / 2], + [CellWidth, CellHeight / 2, CellWidth / 2, CellHeight / 2], + ]) + }) + + it("uses distinct attribute bits", () => { + const bits = Object.values(TextStyle) + expect(new Set(bits).size).toBe(bits.length) + for (const bit of bits) expect(bit & (bit - 1)).toBe(0) + }) +}) diff --git a/packages/drive/test/instance/config.test.ts b/packages/drive/test/instance/config.test.ts new file mode 100644 index 00000000000..d1263b485e2 --- /dev/null +++ b/packages/drive/test/instance/config.test.ts @@ -0,0 +1,162 @@ +import { afterEach, describe, expect, test } from "vitest" +import { rm } from "node:fs/promises" +import { join } from "node:path" +import * as Effect from "effect/Effect" +import { initializeInstance, prepareInstanceProject } from "../../src/instance/instance.js" + +const artifacts: string[] = [] + +afterEach(async () => { + await Promise.all(artifacts.splice(0).map((path) => rm(path, { recursive: true, force: true }))) +}) + +describe("instance configuration", () => { + test("initializes the simulation provider with the current OpenCode provider shape", async () => { + const root = await initializeInstance() + artifacts.push(root) + + expect(await Bun.file(join(root, "files", ".opencode", "opencode.jsonc")).json()).toMatchObject({ + model: "simulation/gpt-sim-model", + providers: { + simulation: { + package: "@opencode-ai/ai/providers/openai/chat", + settings: { apiKey: "sim-key" }, + }, + }, + }) + }) + + test("merges JSONC fixtures, replaces arrays, applies setup last, and commits normalized files", async () => { + const root = await initializeInstance() + artifacts.push(root) + await Effect.runPromise( + prepareInstanceProject({ + artifacts: root, + project: { + git: true, + files: { + ".opencode/opencode.jsonc": `{ + // fixture values are the merge base + "nested": { "fixture": true, "winner": "fixture" }, + "items": ["fixture"], + }`, + ".opencode/tui.jsonc": `{ + "theme": { "fixture": true }, + "items": ["fixture"], + }`, + }, + }, + config: { + nested: { declared: true, winner: "declared" }, + items: ["declared"], + }, + tui: { + theme: { declared: true }, + items: ["declared"], + }, + setup({ config, tuiConfig }) { + return Effect.sync(() => { + config.nested = { + ...(config.nested as Record), + winner: "setup", + } + tuiConfig.items = ["setup"] + }) + }, + }), + ) + + const files = join(root, "files") + const configText = await Bun.file(join(files, ".opencode", "opencode.jsonc")).text() + const tuiText = await Bun.file(join(files, ".opencode", "tui.jsonc")).text() + expect(JSON.parse(configText)).toEqual({ + nested: { fixture: true, declared: true, winner: "setup" }, + items: ["declared"], + }) + expect(JSON.parse(tuiText)).toEqual({ + theme: { fixture: true, declared: true }, + items: ["setup"], + }) + expect(configText).not.toContain("//") + expect(await git(files, ["status", "--porcelain"])).toBe("") + expect(await git(files, ["show", "HEAD:.opencode/tui.jsonc"])).toBe(tuiText) + }) + + test("rejects invalid JSONC configuration", async () => { + const root = await initializeInstance() + artifacts.push(root) + await expect( + Effect.runPromise( + prepareInstanceProject({ + artifacts: root, + project: { + files: { ".opencode/tui.jsonc": "{ invalid" }, + }, + }), + ), + ).rejects.toThrow("invalid .opencode/tui.jsonc") + }) + + test("does not let setup mutate declarative configuration inputs", async () => { + const root = await initializeInstance() + artifacts.push(root) + const config = { nested: { value: "declared" }, items: ["declared"] } + const tui = { keybinds: { app_exit: "ctrl+q" } } + + await Effect.runPromise( + prepareInstanceProject({ + artifacts: root, + config, + tui, + setup({ config, tuiConfig }) { + return Effect.sync(() => { + const nested = config.nested as Record + const items = config.items as Array + const keybinds = tuiConfig.keybinds as Record + nested.value = "setup" + items.push("setup") + keybinds.app_exit = "ctrl+x" + }) + }, + }), + ) + + expect(config).toEqual({ + nested: { value: "declared" }, + items: ["declared"], + }) + expect(tui).toEqual({ keybinds: { app_exit: "ctrl+q" } }) + }) + + test("interrupts setup with project preparation", async () => { + const root = await initializeInstance() + artifacts.push(root) + const started = Promise.withResolvers() + let finalized = false + const controller = new AbortController() + const prepared = Effect.runPromise( + prepareInstanceProject({ + artifacts: root, + setup: () => + Effect.sync(() => started.resolve()).pipe( + Effect.andThen(Effect.never), + Effect.ensuring( + Effect.sync(() => { + finalized = true + }), + ), + ), + }), + { signal: controller.signal }, + ) + + await started.promise + controller.abort() + await expect(prepared).rejects.toThrow() + expect(finalized).toBe(true) + }) +}) + +async function git(cwd: string, args: ReadonlyArray) { + return Bun.$`git ${args}`.cwd(cwd).text() +} diff --git a/packages/drive/test/instance/dev.test.ts b/packages/drive/test/instance/dev.test.ts new file mode 100644 index 00000000000..31672c0e052 --- /dev/null +++ b/packages/drive/test/instance/dev.test.ts @@ -0,0 +1,34 @@ +import { afterEach, expect, test } from "vitest" +import { mkdir, mkdtemp, rm } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join } from "node:path" +import * as Effect from "effect/Effect" +import { prepareDev } from "../../src/instance/dev.js" + +const directories: string[] = [] + +afterEach(async () => { + await Promise.all(directories.splice(0).map((path) => rm(path, { recursive: true, force: true }))) +}) + +test("uses standalone mode and inheritable preloads for V2 development checkouts", async () => { + const root = await mkdtemp(join(tmpdir(), "opencode-drive-dev-")) + const artifacts = await mkdtemp(join(tmpdir(), "opencode-drive-artifacts-")) + directories.push(root, artifacts) + await mkdir(join(root, "packages", "cli", "src", "services"), { recursive: true }) + await mkdir(join(root, "packages", "tui", "node_modules", "@opentui", "solid"), { recursive: true }) + await Promise.all([ + Bun.write(join(root, "packages", "cli", "src", "index.ts"), ""), + Bun.write(join(root, "packages", "cli", "src", "services", "standalone.ts"), ""), + Bun.write(join(root, "packages", "tui", "node_modules", "@opentui", "solid", "package.json"), "{}"), + ]) + + const result = await Effect.runPromise(prepareDev(artifacts, root)) + + expect(result.command.at(-1)).toBe("--standalone") + expect(result.scriptedCommand.at(-1)).toBe(join(root, "packages", "cli", "src", "index.ts")) + expect(result.preloads).toContain("--conditions=browser") + expect(result.preloads).toContain( + `--preload=${join(root, "packages", "tui", "node_modules", "@opentui", "solid", "scripts", "preload.js")}`, + ) +}) diff --git a/packages/drive/test/instance/process.test.ts b/packages/drive/test/instance/process.test.ts new file mode 100644 index 00000000000..a9ace32b1c0 --- /dev/null +++ b/packages/drive/test/instance/process.test.ts @@ -0,0 +1,50 @@ +import { NodeServices } from "@effect/platform-node" +import { expect, it } from "@effect/vitest" +import { Effect, Exit, Option, Scope } from "effect" +import * as Process from "../../src/instance/process.js" + +it.live("does not let an interrupted waiter poison process completion", () => + Effect.scoped( + Effect.gen(function* () { + const process = yield* Process.spawn([ + globalThis.process.execPath, + "-e", + "setTimeout(() => process.exit(0), 100)", + ]) + + const early = yield* process.exitCode.pipe(Effect.timeoutOption(5)) + expect(Option.isNone(early)).toBe(true) + expect(yield* process.exitCode).toBe(0) + }), + ).pipe(Effect.provide(NodeServices.layer)), +) + +it.live("collects finite command output and status", () => + Process.run([globalThis.process.execPath, "-e", 'console.log("stdout"); console.error("stderr")']).pipe( + Effect.provide(NodeServices.layer), + Effect.tap((output) => + Effect.sync(() => { + expect(output).toEqual({ + status: 0, + stdout: "stdout\n", + stderr: "stderr\n", + }) + }), + ), + ), +) + +it.live("keeps exit observation alive after detachment", () => + Effect.gen(function* () { + const scope = yield* Scope.make() + const process = yield* Process.spawn([ + globalThis.process.execPath, + "-e", + "setTimeout(() => process.exit(7), 100)", + ]).pipe(Scope.provide(scope)) + + yield* process.detach + yield* Scope.close(scope, Exit.void) + expect(yield* process.exitCode).toBe(7) + }).pipe(Effect.provide(NodeServices.layer)), +) diff --git a/packages/drive/test/instance/runtime.test.ts b/packages/drive/test/instance/runtime.test.ts new file mode 100644 index 00000000000..1a61e4e2107 --- /dev/null +++ b/packages/drive/test/instance/runtime.test.ts @@ -0,0 +1,55 @@ +import { rm } from "node:fs/promises" +import { resolve } from "node:path" +import { NodeServices } from "@effect/platform-node" +import { expect, it } from "@effect/vitest" +import { ConfigProvider, Effect, Exit, Fiber } from "effect" +import { initializeInstance } from "../../src/instance/instance.js" +import * as OpenCodeInstance from "../../src/instance/runtime.js" + +const fakeOpenCode = [process.execPath, resolve("test", "fixtures", "fake-opencode.ts")] + +it.live("stops a TUI while its readiness check is pending", () => + Effect.scoped( + Effect.gen(function* () { + const artifacts = yield* Effect.promise(() => initializeInstance()) + yield* Effect.addFinalizer(() => Effect.promise(() => rm(artifacts, { recursive: true, force: true }))) + const instance = yield* OpenCodeInstance.make({ + artifacts, + name: "pending-client-test", + scripted: true, + command: [...fakeOpenCode, "no-ui"], + }) + + yield* instance.launchServer + const launch = yield* instance.launchTui("pending").pipe(Effect.exit, Effect.forkChild) + yield* Effect.sleep(100) + + const started = Date.now() + yield* instance.stop + expect(Date.now() - started).toBeLessThan(5_000) + expect(Exit.isFailure(yield* Fiber.join(launch))).toBe(true) + }), + ).pipe(Effect.provide(NodeServices.layer)), +) + +it.live("reads the database target from Effect config", () => + Effect.scoped( + Effect.gen(function* () { + const artifacts = yield* Effect.promise(() => initializeInstance()) + yield* Effect.addFinalizer(() => Effect.promise(() => rm(artifacts, { recursive: true, force: true }))) + const instance = yield* OpenCodeInstance.make({ + artifacts, + name: "database-config-test", + scripted: true, + command: fakeOpenCode, + }) + yield* Effect.addFinalizer(() => instance.stop) + + yield* instance.launchServer + expect(yield* Effect.promise(() => Bun.file(`${artifacts}/service-db.txt`).text())).toBe("restart.sqlite") + }), + ).pipe( + Effect.provide(ConfigProvider.layer(ConfigProvider.fromUnknown({ OPENCODE_DRIVE_DB: "restart.sqlite" }))), + Effect.provide(NodeServices.layer), + ), +) diff --git a/packages/drive/test/llm.test.ts b/packages/drive/test/llm.test.ts new file mode 100644 index 00000000000..1f82fd77f4a --- /dev/null +++ b/packages/drive/test/llm.test.ts @@ -0,0 +1,122 @@ +import { describe, expect, test } from "vitest" +import { Schema } from "effect" +import { Llm } from "../src/index.js" + +describe("Llm", () => { + test("constructs serializable output values", () => { + expect(Llm.text("hello", { delay: 0, chunkSize: 3 })).toEqual({ + type: "text", + text: "hello", + options: { delay: 0, chunkSize: 3 }, + }) + expect(Llm.reasoning("thinking")).toEqual({ + type: "reasoning", + text: "thinking", + }) + expect(Llm.pause(20)).toEqual({ type: "pause", milliseconds: 20 }) + expect( + Llm.toolCall({ + index: 0, + id: "call_1", + name: "read", + input: { path: "src/example.ts" }, + }), + ).toEqual({ + type: "toolCall", + index: 0, + id: "call_1", + name: "read", + input: { path: "src/example.ts" }, + }) + expect( + Llm.toolCall( + { + index: 1, + id: "call_2", + name: "patch", + input: { patchText: "*** Begin Patch\n*** End Patch" }, + }, + { delay: 20, chunkSize: 10 }, + ), + ).toEqual({ + type: "toolCall", + index: 1, + id: "call_2", + name: "patch", + input: { patchText: "*** Begin Patch\n*** End Patch" }, + options: { delay: 20, chunkSize: 10 }, + }) + expect(Llm.raw({ usage: { inputTokens: 10 } })).toEqual({ + type: "raw", + chunk: { usage: { inputTokens: 10 } }, + }) + expect(Llm.finish("tool-calls")).toEqual({ + type: "finish", + reason: "tool-calls", + }) + expect(Llm.disconnect()).toEqual({ type: "disconnect" }) + }) + + test("decodes raw schema-compatible outputs", () => { + const decode = Schema.decodeUnknownSync(Llm.Output) + + expect(decode({ type: "text", text: "raw" })).toEqual({ + type: "text", + text: "raw", + }) + expect( + decode({ + type: "toolCall", + index: 0, + id: "call_2", + name: "write", + input: { path: "notes.txt", contents: "hello" }, + }), + ).toEqual({ + type: "toolCall", + index: 0, + id: "call_2", + name: "write", + input: { path: "notes.txt", contents: "hello" }, + }) + }) + + test("rejects invalid output values", () => { + const decode = Schema.decodeUnknownSync(Llm.Output) + + expect(() => Llm.pause(-1)).toThrow() + expect(() => Llm.pause(Number.POSITIVE_INFINITY)).toThrow() + expect(() => Llm.text("hello", { delay: -1 })).toThrow() + expect(() => Llm.text("hello", { chunkSize: 0 })).toThrow() + expect(() => Llm.text("hello", { chunkSize: 1.5 })).toThrow() + expect(() => Llm.toolCall({ index: -1, id: "call_3", name: "read", input: {} })).toThrow() + expect(() => Llm.toolCall({ index: 1.5, id: "call_3", name: "read", input: {} })).toThrow() + expect(() => Llm.toolCall({ index: 0, id: "call_3", name: "read", input: {} }, { chunkSize: 0 })).toThrow() + expect(() => + Llm.toolCall({ + index: Number.NaN, + id: "call_3", + name: "read", + input: {}, + }), + ).toThrow() + expect(() => + Llm.toolCall({ + index: Number.POSITIVE_INFINITY, + id: "call_3", + name: "read", + input: {}, + }), + ).toThrow() + expect(() => decode({ type: "finish", reason: "unknown" })).toThrow() + expect(() => + decode({ + type: "toolCall", + index: "0", + id: "call_3", + name: "read", + input: {}, + }), + ).toThrow() + }) +}) diff --git a/packages/drive/test/manual/tui-regressions/README.md b/packages/drive/test/manual/tui-regressions/README.md new file mode 100644 index 00000000000..20fecd330de --- /dev/null +++ b/packages/drive/test/manual/tui-regressions/README.md @@ -0,0 +1,104 @@ +# TUI regression probes + +These scripts exercise real OpenCode TUI behavior against a compatible local checkout. They are deliberately excluded from the normal package test command: some are diagnostic probes for timing-sensitive bugs, and some encode desired behavior for known-open V2 issues and currently fail. + +From the repository root, set `OPENCODE_DEV` to the checkout under test: + +```sh +bun run --cwd packages/drive drive check test/manual/tui-regressions/interaction-lifecycle.ts +bun run --cwd packages/drive drive start --name tui-interaction-lifecycle \ + --script test/manual/tui-regressions/interaction-lifecycle.ts \ + --dev "$OPENCODE_DEV" +``` + +The interaction probe asserts that: + +- A submitted message is visible before a delayed model response begins. +- An active streaming response reaches the interrupted state after Escape. + +## Initial message hydration + +[`anomalyco/opencode#35988`](https://github.com/anomalyco/opencode/issues/35988) reports that a new Session can permanently lose its first user row during pending/history hydration while retaining the assistant response. The black-box probe creates fresh TUIs and checks both transcript rows after the response: + +```sh +OPENCODE_DRIVE_ATTEMPTS=20 bun run --cwd packages/drive drive start \ + --name tui-initial-message \ + --script test/manual/tui-regressions/initial-message-hydration.ts \ + --dev "$OPENCODE_DEV" +``` + +The natural race is uncommon. During diagnosis, a valid empty history snapshot was gated across input promotion; that deterministic Drive run failed against the pre-fix parent and passed against the fix in OpenCode PR #36433. The checked-in probe does not require test-only OpenCode instrumentation, so use more attempts when trying to reproduce naturally. + +The restart probe opts into a file-backed database so the replacement service can recover the same durable Session: + +```sh +bun run --cwd packages/drive drive check test/manual/tui-regressions/server-restart.ts +OPENCODE_DRIVE_DB=restart.sqlite \ + bun run --cwd packages/drive drive start --name tui-server-restart \ + --script test/manual/tui-regressions/server-restart.ts \ + --dev "$OPENCODE_DEV" +``` + +Relative database paths resolve under the isolated run's OpenCode data directory. The probe requires `OPENCODE_DRIVE_DB`, restarts the service while retaining the TUI, and asserts that the previous transcript rehydrates and accepts another prompt. Without the override Drive intentionally uses `:memory:`, so session loss across process replacement is expected. + +## Pending form restart + +[`anomalyco/opencode#36585`](https://github.com/anomalyco/opencode/issues/36585) reports that a form retained by the TUI becomes unanswerable after the replacement server loses its process-local form cache: + +```sh +bun run --cwd packages/drive drive check test/manual/tui-regressions/pending-form-restart.ts +bun run --cwd packages/drive drive start --name tui-pending-form-restart \ + --script test/manual/tui-regressions/pending-form-restart.ts \ + --dev "$OPENCODE_DEV" +``` + +The desired invariant is that the form either remains answerable or is dismissed as stale. If a retained form accepts local input but submission returns `Form not found`, the probe fails and preserves `stale-form.frame.json`. Current V2 dismisses the stale form and passes this probe. + +## Reconnect outage + +[`anomalyco/opencode#36688`](https://github.com/anomalyco/opencode/issues/36688) reports that a TUI exhausts its reconnect budget and crashes during a realistic post-update service outage: + +```sh +OPENCODE_DRIVE_OUTAGE_MS=20000 bun run --cwd packages/drive drive start \ + --name tui-reconnect-outage \ + --script test/manual/tui-regressions/reconnect-outage.ts \ + --dev "$OPENCODE_DEV" +``` + +The desired invariant is that the TUI remains alive and returns to an actionable composer after the service relaunches. Current V2 passes with both 20-second and 60-second isolated outages. Increase the outage to model slower update election and cold location startup. + +## Seeded lifecycle simulation + +`lifecycle-properties.ts` uses the live OpenCode event stream and a queue-backed simulated response to select deterministic mid-flight actions. Submit, queued submit, text emission, reasoning emission, tool-input streaming, tool execution, completion, interruption, and provider disconnect are separate model transitions. A failure preserves its seed, action trace, model state, recent session events, and terminal frame in `state-machine-failure.json`: + +```sh +OPENCODE_DRIVE_SEED=42 OPENCODE_DRIVE_STEPS=20 \ + bun run --cwd packages/drive drive start --name tui-lifecycle-properties \ + --script test/manual/tui-regressions/lifecycle-properties.ts \ + --dev "$OPENCODE_DEV" +``` + +Re-run a failure with the same seed and step count. Transition preconditions constrain actions to valid idle, pending, streaming, tool-input, and running-tool states. Tool input is chunked so interruption can occur before parsing completes; advancing the tool response dispatches a blocking question tool so interruption can also occur during execution. Interrupted tool parts must settle with an aborted error in the server projection. A queued prompt must have exactly one owner across pending input and projected history. Completion can promote it into the next model step, interruption can leave it awaiting resume, and provider failure can promote it into a replacement execution. Shared invariants also require the latest prompt and settled output to remain visible, the server projection to retain the active prompt, the composer to become actionable after terminal execution, and internal transport defects to stay out of the UI. + +Interruption uses the existing `llm.pending` simulation capability. If OpenCode rejects a response write after terminating the invocation, Drive confirms that the invocation is no longer pending and settles the response as externally terminated. If the invocation remains pending or the query fails, Drive preserves the original write failure. + +## Multi-tool interleavings + +`multi-tool-interleavings.ts` launches shell, question, read, and glob calls in +one assistant step. Drive controls the declared shell by call ID from `run`, +holding it open while three permissions coexist, +approves the question so its form is hidden behind the remaining read and glob +permissions, and lets glob complete while read permission stays visible. It +then rejects read, answers the form, and releases shell last. Permission +rejection interrupts the whole assistant step after sibling tools settle, so +the probe submits a recovery prompt. It verifies mixed backend states, +settlement order, final projected tool states, post-interruption reuse, and +preserves terminal frames for both prompt-priority states: + +```sh +bun run --cwd packages/drive drive check \ + test/manual/tui-regressions/multi-tool-interleavings.ts +bun run --cwd packages/drive drive start --name tui-multi-tool-interleavings \ + --script test/manual/tui-regressions/multi-tool-interleavings.ts \ + --dev "$OPENCODE_DEV" +``` diff --git a/packages/drive/test/manual/tui-regressions/initial-message-hydration.ts b/packages/drive/test/manual/tui-regressions/initial-message-hydration.ts new file mode 100644 index 00000000000..6965b1eb409 --- /dev/null +++ b/packages/drive/test/manual/tui-regressions/initial-message-hydration.ts @@ -0,0 +1,30 @@ +import { defineScript, Llm } from "../../../src/index.js" +import { Effect } from "effect" + +const attempts = Number(process.env.OPENCODE_DRIVE_ATTEMPTS ?? 20) + +export default defineScript({ + launch: "manual", + run: ({ server, tuis, llm, artifacts }) => + Effect.gen(function* () { + yield* server.launch() + for (let index = 0; index < attempts; index++) { + const prompt = `initial-user-message-${index}` + const response = `assistant-response-${index}` + yield* llm.queue(Llm.text(response, { delay: 0, chunkSize: 100 })) + const tui = yield* tuis.launch(`initial-message-${index}`) + yield* tui.ui.submit(prompt) + yield* tui.ui.waitFor(response, { timeout: 10_000 }) + if (!(yield* tui.ui.matches(prompt))) { + const frame = yield* tui.ui.capture() + yield* Effect.tryPromise(() => + Bun.write(`${artifacts}/missing-initial-message.frame.json`, JSON.stringify(frame, null, 2)), + ) + return yield* Effect.fail(new Error(`initial message disappeared on attempt ${index + 1}`)) + } + yield* tui.close() + } + yield* server.kill() + console.log(JSON.stringify({ attempts })) + }), +}) diff --git a/packages/drive/test/manual/tui-regressions/interaction-lifecycle.ts b/packages/drive/test/manual/tui-regressions/interaction-lifecycle.ts new file mode 100644 index 00000000000..4755119c832 --- /dev/null +++ b/packages/drive/test/manual/tui-regressions/interaction-lifecycle.ts @@ -0,0 +1,30 @@ +import { defineScript, Llm } from "../../../src/index.js" +import { Effect } from "effect" + +const prompt = "submitted-message-must-render-before-the-model-responds" +const response = "delayed-model-response-arrived" + +export default defineScript({ + run: ({ ui, llm }) => + Effect.gen(function* () { + yield* llm.queue(Llm.pause(1_000), Llm.text(response)) + const started = performance.now() + yield* ui.submit(prompt) + const submittedIn = performance.now() - started + + if (!(yield* ui.matches(prompt))) return yield* Effect.fail(new Error("submitted message was not visible")) + if (yield* ui.matches(response)) + return yield* Effect.fail(new Error("model response arrived before the submit assertion")) + + yield* ui.waitFor(response, { timeout: 5_000 }) + + yield* llm.queue(Llm.text("interrupt-me-now"), Llm.pause(30_000)) + yield* ui.submit("start-a-response-that-will-be-interrupted") + yield* ui.waitFor("interrupt-me-now", { timeout: 5_000 }) + yield* ui.press("escape") + yield* ui.press("escape") + yield* ui.waitFor("interrupted", { timeout: 5_000 }) + + console.log(JSON.stringify({ submittedIn })) + }), +}) diff --git a/packages/drive/test/manual/tui-regressions/lifecycle-properties.ts b/packages/drive/test/manual/tui-regressions/lifecycle-properties.ts new file mode 100644 index 00000000000..4b1acda5157 --- /dev/null +++ b/packages/drive/test/manual/tui-regressions/lifecycle-properties.ts @@ -0,0 +1,616 @@ +import { defineScript, Llm } from "../../../src/index.js" +import type { OpenCode } from "../../../src/index.js" +import { Deferred, Effect, Queue, Stream } from "effect" +import { run } from "./state-machine.js" + +const seed = readInteger("OPENCODE_DRIVE_SEED", 1, Number.MAX_SAFE_INTEGER) +const steps = readInteger("OPENCODE_DRIVE_STEPS", 12, 1_000) + +interface RecordedEvent { + readonly index: number + readonly type: string + readonly sessionID?: unknown + readonly data: unknown +} + +type Model = + | { + readonly phase: "idle" + readonly sessionID?: SessionID + readonly prompt?: string + readonly output?: string + } + | { + readonly phase: "pending" + readonly sessionID: SessionID + readonly prompt: string + readonly output?: string + readonly pendingPrompt: string + } + | { + readonly phase: "streaming" + readonly sessionID: SessionID + readonly prompt: string + readonly output?: string + readonly reasoning?: string + readonly queuedPrompt?: string + readonly tool?: { + readonly callID: string + readonly question: string + readonly phase: "input" | "running" + readonly startedAfter: number + } + } + +type SessionID = Effect.Success>["data"][number]["id"] + +interface ResponseControl { + readonly id: string + readonly output: Queue.Queue + readonly ended: Deferred.Deferred +} + +export default defineScript({ + run: ({ ui, llm, opencode, artifacts }) => + Effect.scoped( + Effect.gen(function* () { + const responses = yield* Queue.unbounded() + const eventQueue = yield* Queue.unbounded() + const events: Array = [] + let activeResponse: ResponseControl | undefined + let eventSequence = 0 + + yield* llm.serve((request) => + Stream.unwrap( + Effect.gen(function* () { + const output = yield* Queue.unbounded() + const ended = yield* Deferred.make() + yield* Queue.offer(responses, { id: request.id, output, ended }) + return Stream.fromQueue(output).pipe( + Stream.takeUntil((item) => item.type === "finish" || item.type === "disconnect"), + Stream.ensuring(Deferred.succeed(ended, undefined).pipe(Effect.asVoid)), + ) + }), + ), + ) + yield* opencode.event.subscribe().pipe( + Stream.runForEach((event) => { + const recorded: RecordedEvent = { + index: eventSequence++, + type: event.type, + ...(event.data !== null && typeof event.data === "object" && "sessionID" in event.data + ? { sessionID: event.data.sessionID } + : {}), + data: event.data, + } + events.push(recorded) + if (events.length > 100) events.shift() + return Queue.offer(eventQueue, recorded).pipe(Effect.asVoid) + }), + Effect.forkScoped, + ) + + const currentSession = Effect.fn("LifecycleProperties.currentSession")(function* () { + const sessions = yield* opencode.session.list({ limit: 1, order: "desc" }) + const sessionID = sessions.data[0]?.id + if (sessionID === undefined) return yield* Effect.fail(new Error("no current session")) + return sessionID + }) + + const waitForEvent = Effect.fn("LifecycleProperties.waitForEvent")( + function* (type: string, sessionID: SessionID | undefined, after: number) { + while (true) { + const event = yield* Queue.take(eventQueue) + if ( + event.index > after && + event.type === type && + (sessionID === undefined || event.sessionID === sessionID) + ) + return event + } + }, + (effect, type) => + effect.pipe( + Effect.timeoutOrElse({ + duration: 10_000, + orElse: () => Effect.fail(new Error(`timed out waiting for ${type}`)), + }), + ), + ) + + const waitForResponse = Effect.fn("LifecycleProperties.waitForResponse")( + function* () { + if (activeResponse !== undefined) + return yield* Effect.fail(new Error(`LLM response ${activeResponse.id} is already active`)) + while (true) { + const response = yield* Queue.take(responses) + if (yield* Deferred.isDone(response.ended)) continue + activeResponse = response + return + } + }, + (effect) => + effect.pipe( + Effect.timeoutOrElse({ + duration: 10_000, + orElse: () => Effect.fail(new Error("timed out waiting for an LLM response")), + }), + ), + ) + + const sendOutput = Effect.fn("LifecycleProperties.sendOutput")(function* (item: Llm.Output) { + const response = activeResponse + if (response === undefined) return yield* Effect.fail(new Error("no active LLM response")) + yield* Queue.offer(response.output, item) + }) + + const endResponse = Effect.fn("LifecycleProperties.endResponse")( + function* (item: Llm.Output) { + const response = activeResponse + if (response === undefined) return yield* Effect.fail(new Error("no active LLM response")) + yield* Queue.offer(response.output, item) + yield* Deferred.await(response.ended) + activeResponse = undefined + }, + (effect) => + effect.pipe( + Effect.timeoutOrElse({ + duration: 10_000, + orElse: () => Effect.fail(new Error("timed out waiting for the LLM response to end")), + }), + ), + ) + + const promptOwners = Effect.fn("LifecycleProperties.promptOwners")(function* ( + sessionID: SessionID, + prompt: string, + ) { + const [messages, pending] = yield* Effect.all( + [ + opencode.message.list({ sessionID, limit: 20, order: "desc" }), + opencode.session.pending.list({ sessionID }), + ], + { concurrency: "unbounded" }, + ) + return { + projected: messages.data.filter((message) => message.type === "user" && message.text === prompt).length, + pending: pending.filter((input) => input.type === "user" && input.data.text === prompt).length, + } + }) + + const assertAssistantContent = Effect.fn("LifecycleProperties.assertAssistantContent")(function* ( + state: Extract, + ) { + if (state.output === undefined && state.reasoning === undefined && state.tool === undefined) return + const messages = yield* opencode.message.list({ + sessionID: state.sessionID, + limit: 20, + order: "desc", + }) + const assistant = messages.data.find((message) => message.type === "assistant") + if ( + assistant?.type === "assistant" && + (state.output === undefined || + assistant.content.some((part) => part.type === "text" && part.text === state.output)) && + (state.reasoning === undefined || + assistant.content.some((part) => part.type === "reasoning" && part.text === state.reasoning)) && + (state.tool === undefined || + assistant.content.some( + (part) => + part.type === "tool" && + part.id === state.tool?.callID && + part.state.status === "error" && + part.state.error.type === "aborted", + )) + ) + return + return yield* Effect.fail(new Error("server projection lost settled assistant content")) + }) + + const idleAfter = (state: Extract): Model => ({ + phase: "idle", + sessionID: state.sessionID, + prompt: state.prompt, + output: state.output, + }) + + const afterInterrupted = Effect.fn("LifecycleProperties.afterInterrupted")(function* ( + state: Extract, + ) { + if (state.queuedPrompt === undefined) return idleAfter(state) + const owners = yield* promptOwners(state.sessionID, state.queuedPrompt) + if (owners.pending === 1 && owners.projected === 0) + return { + phase: "pending", + sessionID: state.sessionID, + prompt: state.prompt, + output: state.output, + pendingPrompt: state.queuedPrompt, + } satisfies Model + return yield* Effect.fail( + new Error(`interrupted prompt has ${owners.projected} projected and ${owners.pending} pending owners`), + ) + }) + + const afterProviderFailure = Effect.fn("LifecycleProperties.afterProviderFailure")(function* ( + state: Extract, + after: number, + ) { + if (state.queuedPrompt === undefined) return idleAfter(state) + const started = yield* waitForEvent("session.execution.started", state.sessionID, after) + yield* waitForEvent("session.input.promoted", state.sessionID, started.index) + const owners = yield* promptOwners(state.sessionID, state.queuedPrompt) + if (owners.pending !== 0 || owners.projected !== 1) + return yield* Effect.fail( + new Error(`recovered prompt has ${owners.projected} projected and ${owners.pending} pending owners`), + ) + yield* waitForResponse() + return { + phase: "streaming", + sessionID: state.sessionID, + prompt: state.queuedPrompt, + } satisfies Model + }) + + const final = yield* run({ + context: { + ui, + artifacts, + evidence: () => Effect.succeed({ events }), + }, + initial: { phase: "idle" }, + seed, + steps, + transitions: [ + { + name: "submit", + enabled: (state) => state.phase !== "streaming", + run: (state, step) => + Effect.gen(function* () { + if (state.phase === "streaming") return state + const prompt = `lifecycle-prompt-${step}` + const after = eventSequence - 1 + yield* ui.submit(prompt) + const admitted = + state.phase === "pending" + ? yield* waitForEvent("session.input.admitted", state.sessionID, after) + : undefined + const started = yield* waitForEvent( + "session.execution.started", + state.phase === "pending" ? state.sessionID : undefined, + admitted?.index ?? after, + ) + const sessionID = state.phase === "pending" ? state.sessionID : yield* currentSession() + if (started.sessionID !== sessionID) + return yield* Effect.fail(new Error("execution started for an unexpected session")) + if (state.phase === "pending") { + const first = yield* waitForEvent("session.input.promoted", sessionID, started.index) + yield* waitForEvent("session.input.promoted", sessionID, first.index) + const [previous, current] = yield* Effect.all( + [promptOwners(sessionID, state.pendingPrompt), promptOwners(sessionID, prompt)], + { concurrency: "unbounded" }, + ) + if ( + previous.projected !== 1 || + previous.pending !== 0 || + current.projected !== 1 || + current.pending !== 0 + ) + return yield* Effect.fail( + new Error( + `resumed prompts have previous ${previous.projected}/${previous.pending} and current ${current.projected}/${current.pending} projected/pending owners`, + ), + ) + yield* waitForResponse() + return { phase: "streaming", sessionID, prompt } + } + yield* waitForResponse() + return { phase: "streaming", sessionID, prompt } + }), + }, + { + name: "emit-text", + enabled: (state) => state.phase === "streaming" && state.output === undefined && state.tool === undefined, + run: (state, step) => + Effect.gen(function* () { + if (state.phase !== "streaming") return state + const text = `lifecycle-output-${step}` + const after = eventSequence - 1 + yield* sendOutput(Llm.text(text, { delay: 0, chunkSize: 100 })) + yield* waitForEvent("session.text.started", state.sessionID, after) + return { ...state, output: text } + }), + }, + { + name: "emit-reasoning", + enabled: (state) => + state.phase === "streaming" && state.reasoning === undefined && state.tool === undefined, + run: (state, step) => + Effect.gen(function* () { + if (state.phase !== "streaming") return state + const reasoning = `lifecycle-reasoning-${step}` + const after = eventSequence - 1 + yield* sendOutput(Llm.reasoning(reasoning, { delay: 0, chunkSize: 100 })) + yield* waitForEvent("session.reasoning.started", state.sessionID, after) + return { ...state, reasoning } + }), + }, + { + name: "start-tool-input", + enabled: (state) => state.phase === "streaming" && state.tool === undefined, + run: (state, step) => + Effect.gen(function* () { + if (state.phase !== "streaming") return state + const callID = `call_lifecycle_${step}` + const question = `lifecycle-tool-question-${step}` + const after = eventSequence - 1 + yield* sendOutput( + Llm.toolCall( + { + index: 0, + id: callID, + name: "question", + input: { + questions: [ + { + question, + header: "Lifecycle", + options: [ + { + label: "Continue", + description: "Continue the lifecycle simulation.", + }, + ], + multiple: false, + }, + ], + }, + }, + { delay: 20, chunkSize: 100 }, + ), + ) + const started = yield* waitForEvent("session.tool.input.started", state.sessionID, after) + return { + ...state, + tool: { + callID, + question, + phase: "input" as const, + startedAfter: started.index, + }, + } + }), + }, + { + name: "await-tool-execution", + enabled: (state) => state.phase === "streaming" && state.tool?.phase === "input", + run: (state) => + Effect.gen(function* () { + if (state.phase !== "streaming" || state.tool?.phase !== "input") return state + yield* endResponse(Llm.finish("tool-calls")) + yield* waitForEvent("session.tool.called", state.sessionID, state.tool.startedAfter) + yield* ui.waitFor(state.tool.question, { timeout: 10_000 }) + return { ...state, tool: { ...state.tool, phase: "running" as const } } + }), + }, + { + name: "queue-prompt", + enabled: (state) => + state.phase === "streaming" && state.queuedPrompt === undefined && state.tool === undefined, + run: (state, step) => + Effect.gen(function* () { + if (state.phase !== "streaming") return state + const queuedPrompt = `queued-prompt-${step}` + const after = eventSequence - 1 + yield* ui.submit(queuedPrompt) + yield* waitForEvent("session.input.admitted", state.sessionID, after) + return { ...state, queuedPrompt } + }), + }, + { + name: "finish", + enabled: (state) => + state.phase === "streaming" && + state.tool === undefined && + (state.output !== undefined || state.reasoning !== undefined), + run: (state) => + Effect.gen(function* () { + if (state.phase !== "streaming") return state + const after = eventSequence - 1 + yield* endResponse(Llm.finish()) + if (state.queuedPrompt !== undefined) { + yield* waitForEvent("session.input.promoted", state.sessionID, after) + yield* assertAssistantContent(state) + const owners = yield* promptOwners(state.sessionID, state.queuedPrompt) + if (owners.projected !== 1 || owners.pending !== 0) + return yield* Effect.fail( + new Error( + `promoted prompt has ${owners.projected} projected and ${owners.pending} pending owners`, + ), + ) + yield* waitForResponse() + return { + phase: "streaming", + sessionID: state.sessionID, + prompt: state.queuedPrompt, + } + } + yield* waitForEvent("session.execution.succeeded", state.sessionID, after) + yield* assertAssistantContent(state) + return idleAfter(state) + }), + }, + { + name: "interrupt", + enabled: (state) => state.phase === "streaming", + run: (state) => + Effect.gen(function* () { + if (state.phase !== "streaming") return state + const after = eventSequence - 1 + yield* opencode.session.interrupt({ sessionID: state.sessionID }) + yield* waitForEvent("session.execution.interrupted", state.sessionID, after) + if (state.tool?.phase !== "running") + yield* endResponse(Llm.text("discarded-after-interrupt", { delay: 0, chunkSize: 100 })) + yield* assertAssistantContent(state) + return yield* afterInterrupted(state) + }), + }, + { + name: "provider-disconnect", + enabled: (state) => state.phase === "streaming" && state.tool === undefined, + run: (state) => + Effect.gen(function* () { + if (state.phase !== "streaming") return state + const after = eventSequence - 1 + yield* endResponse(Llm.disconnect()) + const failed = yield* waitForEvent("session.execution.failed", state.sessionID, after) + yield* assertAssistantContent(state) + return yield* afterProviderFailure(state, failed.index) + }), + }, + ], + invariants: [ + { + name: "latest prompt remains visible", + check: (state) => + state.phase === "streaming" && state.queuedPrompt !== undefined + ? ui.waitFor(state.queuedPrompt, { timeout: 10_000 }).pipe(Effect.asVoid) + : state.phase === "pending" + ? ui.waitFor(state.pendingPrompt, { timeout: 10_000 }).pipe(Effect.asVoid) + : state.prompt === undefined + ? Effect.void + : ui.waitFor(state.prompt, { timeout: 10_000 }).pipe(Effect.asVoid), + }, + { + name: "settled output remains visible", + check: (state) => + state.phase === "streaming" || state.output === undefined + ? Effect.void + : ui.waitFor(state.output, { timeout: 10_000 }).pipe(Effect.asVoid), + }, + { + name: "active output remains visible", + check: (state) => + state.phase !== "streaming" || state.output === undefined + ? Effect.void + : ui.waitFor(state.output, { timeout: 10_000 }).pipe(Effect.asVoid), + }, + { + name: "running tool remains visible", + check: (state) => + state.phase === "streaming" && state.tool?.phase === "running" + ? ui.waitFor(state.tool.question, { timeout: 10_000 }).pipe(Effect.asVoid) + : Effect.void, + }, + { + name: "settled composer is actionable", + check: (state) => + state.phase !== "streaming" + ? ui.waitFor((current) => current.focused.editor, { timeout: 10_000 }).pipe(Effect.asVoid) + : Effect.void, + }, + { + name: "server projection retains the latest prompt", + check: (state) => + state.sessionID === undefined || state.prompt === undefined + ? Effect.void + : Effect.gen(function* () { + const sessionID = state.sessionID + const prompt = state.prompt + if (sessionID === undefined || prompt === undefined) return + const messages = yield* opencode.message.list({ + sessionID, + limit: 20, + order: "desc", + }) + if (messages.data.some((message) => message.type === "user" && message.text === prompt)) return + return yield* Effect.fail(new Error(`server projection lost prompt: ${prompt}`)) + }), + }, + { + name: "queued prompt has exactly one owner", + check: (state) => + (state.phase === "streaming" + ? state.queuedPrompt + : state.phase === "pending" + ? state.pendingPrompt + : undefined) === undefined || state.sessionID === undefined + ? Effect.void + : Effect.gen(function* () { + const ownedPrompt = + state.phase === "streaming" + ? state.queuedPrompt + : state.phase === "pending" + ? state.pendingPrompt + : undefined + const sessionID = state.sessionID + if (ownedPrompt === undefined || sessionID === undefined) return + const owners = yield* promptOwners(sessionID, ownedPrompt) + if (owners.projected + owners.pending === 1) return + return yield* Effect.fail( + new Error( + `queued prompt has ${owners.projected} projected and ${owners.pending} pending owners: ${ownedPrompt}`, + ), + ) + }), + }, + { + name: "settled session has no pending input", + check: (state) => + state.phase !== "idle" || state.sessionID === undefined + ? Effect.void + : Effect.gen(function* () { + const sessionID = state.sessionID + if (sessionID === undefined) return + const pending = yield* opencode.session.pending.list({ sessionID }) + if (pending.length === 0) return + return yield* Effect.fail( + new Error(`settled session retained ${pending.length} pending input(s)`), + ) + }), + }, + { + name: "transport defects are not rendered", + check: () => + Effect.forEach(["UnknownError", "RpcClientDefect"], (text) => + ui.matches(text).pipe( + Effect.filterOrFail( + (visible) => !visible, + () => new Error(`rendered internal error: ${text}`), + ), + ), + ).pipe(Effect.asVoid), + }, + ], + }) + + if (final.phase === "streaming") { + const after = eventSequence - 1 + if (final.tool !== undefined) { + yield* opencode.session.interrupt({ sessionID: final.sessionID }) + yield* waitForEvent("session.execution.interrupted", final.sessionID, after) + if (final.tool.phase === "input") + yield* endResponse(Llm.text("discarded-after-interrupt", { delay: 0, chunkSize: 100 })) + yield* assertAssistantContent(final) + } else { + yield* endResponse(Llm.finish()) + if (final.queuedPrompt !== undefined) { + const promoted = yield* waitForEvent("session.input.promoted", final.sessionID, after) + yield* waitForResponse() + yield* endResponse(Llm.finish()) + yield* waitForEvent("session.execution.succeeded", final.sessionID, promoted.index) + } else { + yield* waitForEvent("session.execution.succeeded", final.sessionID, after) + } + } + } + }), + ), +}) + +function readInteger(name: string, fallback: number, maximum: number) { + const value = Number(process.env[name] ?? fallback) + if (!Number.isSafeInteger(value) || value < 0 || value > maximum) + throw new Error(`${name} must be an integer between 0 and ${maximum}`) + return value +} diff --git a/packages/drive/test/manual/tui-regressions/multi-tool-interleavings.ts b/packages/drive/test/manual/tui-regressions/multi-tool-interleavings.ts new file mode 100644 index 00000000000..72473cd0520 --- /dev/null +++ b/packages/drive/test/manual/tui-regressions/multi-tool-interleavings.ts @@ -0,0 +1,215 @@ +import { defineScript, Llm } from "../../../src/index.js" +import { Deferred, Effect, Schedule, Stream } from "effect" + +const shellCallID = "call_multi_shell" +const questionCallID = "call_multi_question" +const readCallID = "call_multi_read" +const globCallID = "call_multi_glob" +const question = "Which runtime should the multi-tool probe use?" + +export default defineScript({ + project: { + files: { + "fixture.txt": "multi-tool fixture\n", + }, + }, + config: { + autoupdate: false, + permissions: [ + { action: "*", resource: "*", effect: "ask" }, + { action: "shell", resource: "*", effect: "allow" }, + ], + }, + tools: ["shell"], + run: ({ ui, llm, opencode, artifacts, tools }) => + Effect.scoped( + Effect.gen(function* () { + const shells = yield* tools.control("shell") + const executionInterrupted = yield* Deferred.make() + const toolSettlements: Array = [] + + yield* opencode.event.subscribe().pipe( + Stream.runForEach((event) => { + if (event.type === "session.tool.success" || event.type === "session.tool.failed") + toolSettlements.push(`${event.type}:${event.data.id}`) + if (event.type === "session.execution.interrupted") + return Deferred.succeed(executionInterrupted, undefined).pipe(Effect.asVoid) + return Effect.void + }), + Effect.forkScoped, + ) + + yield* llm.queue( + Llm.toolCall({ + index: 0, + id: shellCallID, + name: "shell", + input: { command: "hold multi-tool shell" }, + }), + Llm.toolCall({ + index: 1, + id: questionCallID, + name: "question", + input: { + questions: [ + { + question, + header: "Runtime", + options: [ + { label: "Bun", description: "Use Bun for the probe." }, + { label: "Node", description: "Use Node for the probe." }, + ], + multiple: false, + }, + ], + }, + }), + Llm.toolCall({ + index: 2, + id: readCallID, + name: "read", + input: { path: "fixture.txt" }, + }), + Llm.toolCall({ + index: 3, + id: globCallID, + name: "glob", + input: { pattern: "**/*.txt", path: ".", limit: 100 }, + }), + Llm.finish("tool-calls"), + ) + yield* llm.queue(Llm.text("multi-tool-interleaving-complete")) + + yield* ui.submit("Run a shell, ask a question, and read the fixture concurrently.") + const shell = yield* shells.take(shellCallID) + yield* shell.progress("multi-tool shell remains active\n") + const sessionID = yield* poll( + opencode.session.list({ limit: 1, order: "desc" }).pipe(Effect.map((sessions) => sessions.data[0]?.id)), + "current session", + ) + const permissions = yield* poll( + opencode.permission.list({ sessionID }).pipe( + Effect.map((items) => { + const questionPermission = items.find( + (item) => item.source?.type === "tool" && item.source.id === questionCallID, + ) + const readPermission = items.find((item) => item.source?.type === "tool" && item.source.id === readCallID) + const globPermission = items.find((item) => item.source?.type === "tool" && item.source.id === globCallID) + return questionPermission && readPermission && globPermission + ? { question: questionPermission, read: readPermission, glob: globPermission } + : undefined + }), + ), + "question, read, and glob permissions", + ) + + yield* opencode.permission.reply({ + sessionID, + requestID: permissions.question.id, + reply: "once", + }) + const form = yield* poll( + Effect.all({ + forms: opencode.form.list({ sessionID }), + permissions: opencode.permission.list({ sessionID }), + }).pipe( + Effect.map(({ forms, permissions: current }) => + forms[0] && + current.some((item) => item.id === permissions.read.id) && + current.some((item) => item.id === permissions.glob.id) + ? forms[0] + : undefined, + ), + ), + "question form behind the read and glob permissions", + ) + yield* saveFrame(artifacts, "permission-over-form", yield* ui.capture()) + yield* ui.screenshot("permission-over-form") + yield* ui.waitFor("Permission required", { timeout: 10_000 }) + + yield* opencode.permission.reply({ + sessionID, + requestID: permissions.glob.id, + reply: "once", + }) + yield* poll( + opencode.message.list({ sessionID, limit: 20, order: "desc" }).pipe( + Effect.map((messages) => { + const glob = messages.data + .flatMap((message) => (message.type === "assistant" ? message.content : [])) + .find((part) => part.type === "tool" && part.id === globCallID) + return glob?.type === "tool" && glob.state.status === "completed" ? glob : undefined + }), + ), + "glob completion while read permission remains", + ) + const remaining = yield* opencode.permission.list({ sessionID }) + if (!remaining.some((item) => item.id === permissions.read.id)) + return yield* Effect.fail(new Error("read permission disappeared before rejection")) + + yield* opencode.permission.reply({ + sessionID, + requestID: permissions.read.id, + reply: "reject", + }) + yield* ui.waitFor(question, { timeout: 10_000 }) + yield* saveFrame(artifacts, "form-with-running-shell", yield* ui.capture()) + yield* ui.screenshot("form-with-running-shell") + + yield* ui.enter() + yield* poll( + opencode.form + .state({ sessionID, formID: form.id }) + .pipe(Effect.map((state) => (state.status === "answered" ? state : undefined))), + "answered question form", + ) + + yield* shell.succeed({ output: "multi-tool shell completed\n", exit: 0 }) + yield* Deferred.await(executionInterrupted) + yield* ui.submit("Recover after the rejected concurrent tool.") + yield* ui.waitFor("multi-tool-interleaving-complete", { timeout: 15_000 }) + const messages = yield* opencode.message.list({ sessionID, limit: 20, order: "desc" }) + const toolParts = messages.data.flatMap((message) => + message.type === "assistant" ? message.content.filter((part) => part.type === "tool") : [], + ) + const statuses = new Map(toolParts.map((tool) => [tool.id, tool.state.status])) + if ( + statuses.get(shellCallID) !== "completed" || + statuses.get(questionCallID) !== "completed" || + statuses.get(globCallID) !== "completed" || + statuses.get(readCallID) !== "error" + ) + return yield* Effect.fail( + new Error(`unexpected final tool states: ${JSON.stringify(Object.fromEntries(statuses))}`), + ) + const expected = [ + `session.tool.success:${globCallID}`, + `session.tool.success:${questionCallID}`, + `session.tool.success:${shellCallID}`, + `session.tool.failed:${readCallID}`, + ] + const relevant = toolSettlements.filter((item) => expected.includes(item)) + if (relevant.join("\n") !== expected.join("\n")) + return yield* Effect.fail(new Error(`unexpected tool settlement order: ${JSON.stringify(relevant)}`)) + return undefined + }), + ), +}) + +function poll(effect: Effect.Effect, description: string) { + return Effect.repeat(effect, { + until: (value): value is A => value !== undefined, + schedule: Schedule.spaced(50), + }).pipe( + Effect.timeoutOrElse({ + duration: 10_000, + orElse: () => Effect.fail(new Error(`timed out waiting for ${description}`)), + }), + ) +} + +function saveFrame(artifacts: string, name: string, frame: unknown) { + return Effect.tryPromise(() => Bun.write(`${artifacts}/${name}.frame.json`, JSON.stringify(frame, null, 2))).pipe( + Effect.asVoid, + ) +} diff --git a/packages/drive/test/manual/tui-regressions/pending-form-restart.ts b/packages/drive/test/manual/tui-regressions/pending-form-restart.ts new file mode 100644 index 00000000000..faf66c78605 --- /dev/null +++ b/packages/drive/test/manual/tui-regressions/pending-form-restart.ts @@ -0,0 +1,50 @@ +import { defineScript, Llm } from "../../../src/index.js" +import { Effect } from "effect" + +const question = { + question: "Which runtime should the restart regression use?", + header: "Runtime", + options: [ + { label: "Bun", description: "Use Bun for the regression." }, + { label: "Node", description: "Use Node for the regression." }, + ], + multiple: false, +} + +export default defineScript({ + launch: "manual", + run: ({ server, tuis, llm, artifacts }) => + Effect.gen(function* () { + yield* server.launch() + const tui = yield* tuis.launch("pending-form-restart") + yield* llm.queue( + Llm.toolCall({ + index: 0, + id: "call_pending_form_restart", + name: "question", + input: { questions: [question] }, + }), + Llm.finish("tool-calls"), + ) + yield* tui.ui.submit("Ask one runtime question and wait for my answer.") + yield* tui.ui.waitFor(question.question, { timeout: 15_000 }) + + yield* server.kill() + yield* server.launch() + yield* Effect.sleep(3_000) + if (!(yield* tui.ui.matches(question.question))) return + yield* llm.queue(Llm.text("restart-form-answer-accepted")) + yield* tui.ui.enter() + yield* tui.ui.enter() + yield* tui.ui.waitFor("Review", { timeout: 5_000 }) + yield* tui.ui.enter() + yield* Effect.sleep(1_000) + + if (yield* tui.ui.matches("Form not found")) { + const frame = yield* tui.ui.capture() + yield* Effect.tryPromise(() => Bun.write(`${artifacts}/stale-form.frame.json`, JSON.stringify(frame, null, 2))) + return yield* Effect.fail(new Error("pending form became stale after server restart")) + } + yield* tui.ui.waitFor("restart-form-answer-accepted", { timeout: 15_000 }) + }), +}) diff --git a/packages/drive/test/manual/tui-regressions/reconnect-outage.ts b/packages/drive/test/manual/tui-regressions/reconnect-outage.ts new file mode 100644 index 00000000000..894d0d77d35 --- /dev/null +++ b/packages/drive/test/manual/tui-regressions/reconnect-outage.ts @@ -0,0 +1,20 @@ +import { defineScript } from "../../../src/index.js" +import { Effect } from "effect" + +const outage = Number(process.env.OPENCODE_DRIVE_OUTAGE_MS ?? 20_000) + +export default defineScript({ + launch: "manual", + run: ({ server, tuis }) => + Effect.gen(function* () { + yield* server.launch() + const tui = yield* tuis.launch("reconnect-outage") + yield* tui.ui.waitFor("Ask anything", { timeout: 15_000 }) + + yield* server.kill() + yield* Effect.sleep(outage) + yield* server.launch() + + yield* tui.ui.waitFor("Ask anything", { timeout: 60_000 }) + }), +}) diff --git a/packages/drive/test/manual/tui-regressions/server-restart.ts b/packages/drive/test/manual/tui-regressions/server-restart.ts new file mode 100644 index 00000000000..1fcad9e8a02 --- /dev/null +++ b/packages/drive/test/manual/tui-regressions/server-restart.ts @@ -0,0 +1,28 @@ +import { defineScript, Llm } from "../../../src/index.js" +import { Config, Effect } from "effect" + +export default defineScript({ + launch: "manual", + run: ({ server, tuis, llm, artifacts }) => + Effect.gen(function* () { + yield* Config.string("OPENCODE_DRIVE_DB") + yield* server.launch() + const tui = yield* tuis.launch("restart-regression") + + yield* llm.queue(Llm.text("before-restart-response")) + yield* tui.ui.submit("before-restart-prompt") + yield* tui.ui.waitFor("before-restart-response", { timeout: 5_000 }) + + yield* server.kill() + yield* server.launch() + + yield* Effect.sleep(3_000) + const frame = yield* tui.ui.capture() + yield* Effect.tryPromise(() => Bun.write(`${artifacts}/after-restart.frame.json`, JSON.stringify(frame, null, 2))) + + yield* tui.ui.waitFor("before-restart-prompt", { timeout: 5_000 }) + yield* llm.queue(Llm.text("after-restart-response")) + yield* tui.ui.submit("after-restart-prompt") + yield* tui.ui.waitFor("after-restart-response", { timeout: 5_000 }) + }), +}) diff --git a/packages/drive/test/manual/tui-regressions/state-machine.ts b/packages/drive/test/manual/tui-regressions/state-machine.ts new file mode 100644 index 00000000000..7b1fa05cba9 --- /dev/null +++ b/packages/drive/test/manual/tui-regressions/state-machine.ts @@ -0,0 +1,90 @@ +import type { Ui } from "../../../src/index.js" +import { Effect, Exit, Random } from "effect" + +export interface Context { + readonly ui: Ui + readonly artifacts: string + readonly evidence?: () => Effect.Effect +} + +export interface Transition { + readonly name: string + readonly enabled: (state: State) => boolean + readonly run: (state: State, step: number) => Effect.Effect +} + +export interface Invariant { + readonly name: string + readonly check: (state: State) => Effect.Effect +} + +export function run(options: { + readonly context: Context + readonly initial: State + readonly seed: number + readonly steps: number + readonly transitions: ReadonlyArray> + readonly invariants: ReadonlyArray> +}) { + return Effect.gen(function* () { + const trace: Array<{ step: number; transition: string }> = [] + let state = options.initial + + for (let step = 0; step < options.steps; step++) { + const enabled = options.transitions.filter((transition) => transition.enabled(state)) + if (enabled.length === 0) return yield* Effect.fail(new Error(`state machine has no transition at step ${step}`)) + const transition = yield* Random.choice(enabled) + trace.push({ step, transition: transition.name }) + let invariant: string | undefined + let next = state + const result = yield* Effect.exit( + Effect.gen(function* () { + next = yield* transition.run(state, step) + for (const current of options.invariants) { + invariant = current.name + yield* current.check(next) + } + }), + ) + if (Exit.isSuccess(result)) { + state = next + continue + } + + const path = `${options.context.artifacts}/state-machine-failure.json` + yield* Effect.gen(function* () { + const [frame, evidence] = yield* Effect.all([ + options.context.ui.capture().pipe(Effect.option), + options.context.evidence?.().pipe(Effect.option) ?? Effect.succeed(undefined), + ]) + yield* Effect.tryPromise(() => + Bun.write( + path, + JSON.stringify( + { + seed: options.seed, + steps: options.steps, + failedAt: step, + transition: transition.name, + invariant, + trace, + state: next, + evidence: evidence?._tag === "Some" ? evidence.value : undefined, + frame: frame._tag === "Some" ? frame.value : undefined, + }, + null, + 2, + ), + ), + ) + }).pipe(Effect.ignore) + console.error( + JSON.stringify({ seed: options.seed, step, transition: transition.name, invariant, artifact: path }), + ) + return yield* Effect.failCause(result.cause) + } + + console.log(JSON.stringify({ seed: options.seed, steps: options.steps, trace })) + return state + }).pipe(Random.withSeed(options.seed)) +} diff --git a/packages/drive/test/recording/decode.test.ts b/packages/drive/test/recording/decode.test.ts new file mode 100644 index 00000000000..d2f5d1a2d3f --- /dev/null +++ b/packages/drive/test/recording/decode.test.ts @@ -0,0 +1,70 @@ +import { afterEach, describe, expect, test } from "vitest" +import { mkdtemp, rm, writeFile } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join } from "node:path" +import { decodeTimeline } from "../../src/recording/index.js" + +const directories: string[] = [] + +afterEach(async () => { + await Promise.all(directories.splice(0).map((path) => rm(path, { recursive: true, force: true }))) +}) + +async function timeline(contents: string) { + const directory = await mkdtemp(join(tmpdir(), "drive-decode-test-")) + directories.push(directory) + const path = join(directory, "timeline.jsonl") + await writeFile(path, contents) + return path +} + +async function read(path: string) { + const records = [] + for await (const record of decodeTimeline(path)) records.push(record) + return records +} + +describe("decodeTimeline", () => { + test("streams a canonical timeline with or without a final newline", async () => { + const path = await timeline( + '{"type":"header","version":1,"cols":80,"rows":24,"encoding":"base64"}\n' + + '{"type":"output","at_ms":3,"data":"aGk="}\n' + + '{"type":"resize","at_ms":4,"cols":100,"rows":30}', + ) + expect(await read(path)).toEqual([ + { type: "header", version: 1, cols: 80, rows: 24, encoding: "base64" }, + { type: "output", at_ms: 3, data: "aGk=" }, + { type: "resize", at_ms: 4, cols: 100, rows: 30 }, + ]) + }) + + test.each([ + ["empty file", ""], + ["output before header", '{"type":"output","at_ms":0,"data":""}\n'], + ["extra header field", '{"type":"header","version":1,"cols":2,"rows":1,"encoding":"base64","extra":true}\n'], + [ + "noncanonical base64", + '{"type":"header","version":1,"cols":2,"rows":1,"encoding":"base64"}\n' + + '{"type":"output","at_ms":0,"data":"YQ"}\n', + ], + [ + "fractional timestamp", + '{"type":"header","version":1,"cols":2,"rows":1,"encoding":"base64"}\n' + + '{"type":"output","at_ms":0.5,"data":""}\n', + ], + [ + "decreasing timestamps", + '{"type":"header","version":1,"cols":2,"rows":1,"encoding":"base64"}\n' + + '{"type":"output","at_ms":2,"data":""}\n' + + '{"type":"resize","at_ms":1,"cols":2,"rows":1}\n', + ], + [ + "invalid resize size", + '{"type":"header","version":1,"cols":2,"rows":1,"encoding":"base64"}\n' + + '{"type":"resize","at_ms":1,"cols":0,"rows":1}\n', + ], + ["blank line", '{"type":"header","version":1,"cols":2,"rows":1,"encoding":"base64"}\n\n'], + ])("rejects %s", async (_name, contents) => { + await expect(read(await timeline(contents))).rejects.toThrow("Invalid recording timeline") + }) +}) diff --git a/packages/drive/test/recording/export-dedupe.test.ts b/packages/drive/test/recording/export-dedupe.test.ts new file mode 100644 index 00000000000..23bafa88a9a --- /dev/null +++ b/packages/drive/test/recording/export-dedupe.test.ts @@ -0,0 +1,46 @@ +import { afterEach, expect, test, vi } from "vitest" +import { mkdtemp, rm, writeFile } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join } from "node:path" +import type { ImageFrame } from "../../src/recording/encode.js" + +const encoded = vi.hoisted(() => ({ frames: [] as ReadonlyArray })) + +vi.mock("../../src/recording/encode.js", () => ({ + encodeFrames: vi.fn(async (frames: ReadonlyArray) => { + encoded.frames = frames + }), +})) + +import { exportRecording } from "../../src/recording/export.js" + +const directories: string[] = [] + +afterEach(async () => { + encoded.frames = [] + await Promise.all(directories.splice(0).map((path) => rm(path, { recursive: true, force: true }))) +}) + +test("deduplicates equal snapshots with distinct identities", async () => { + const directory = await mkdtemp(join(tmpdir(), "drive-export-dedupe-test-")) + directories.push(directory) + const timeline = join(directory, "timeline.jsonl") + await writeFile( + timeline, + [ + JSON.stringify({ type: "header", version: 1, cols: 8, rows: 2, encoding: "base64" }), + JSON.stringify({ + type: "output", + at_ms: 0, + data: Buffer.from("ready").toString("base64"), + }), + JSON.stringify({ type: "output", at_ms: 500, data: "" }), + "", + ].join("\n"), + ) + + await exportRecording(timeline, join(directory, "video.mp4")) + + expect(encoded.frames).toHaveLength(31) + expect(new Set(encoded.frames.map((frame) => frame.key))).toHaveLength(1) +}) diff --git a/packages/drive/test/recording/export.test.ts b/packages/drive/test/recording/export.test.ts new file mode 100644 index 00000000000..e13b06a52a2 --- /dev/null +++ b/packages/drive/test/recording/export.test.ts @@ -0,0 +1,364 @@ +import { afterEach, expect, test } from "vitest" +import { mkdtemp, readFile, rm, stat, writeFile } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join } from "node:path" +import { fileURLToPath } from "node:url" +import { createCanvas, loadImage } from "@napi-rs/canvas" +import { encodeFrames, exportRecording, joinFrames, renderFrame } from "../../src/recording/index.js" + +const directories: string[] = [] + +afterEach(async () => { + await Promise.all(directories.splice(0).map((path) => rm(path, { recursive: true, force: true }))) +}) + +test("exports the final frame as a PNG and creates its parent", async () => { + const directory = await mkdtemp(join(tmpdir(), "drive-export-test-")) + directories.push(directory) + const timeline = join(directory, "timeline.jsonl") + await writeFile( + timeline, + `${JSON.stringify({ type: "header", version: 1, cols: 4, rows: 2, encoding: "base64" })}\n` + + `${JSON.stringify({ type: "output", at_ms: 0, data: Buffer.from("hi").toString("base64") })}\n`, + ) + const output = join(directory, "nested", "frame.png") + const result = await exportRecording(timeline, output) + expect(result).toEqual({ frames: 1, durationMs: 0, width: 40, height: 40 }) + expect((await readFile(output)).subarray(0, 8)).toEqual(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])) + expect((await stat(output)).size).toBeGreaterThan(100) +}) + +test("rejects invalid encoding frame rates", async () => { + await expect( + encodeFrames([{ atMs: 0, key: "frame", render: () => Buffer.alloc(0) }], join(tmpdir(), "invalid-frame-rate.mp4"), { + fps: 0, + }), + ).rejects.toThrow("fps must be a positive finite number") +}) + +test("renders an optional recording header", async () => { + const directory = await mkdtemp(join(tmpdir(), "drive-export-header-test-")) + directories.push(directory) + const timeline = join(directory, "timeline.jsonl") + await writeFile( + timeline, + `${JSON.stringify({ type: "header", version: 1, cols: 4, rows: 2, encoding: "base64" })}\n` + + `${JSON.stringify({ type: "output", at_ms: 0, data: Buffer.from("hi").toString("base64") })}\n`, + ) + const output = join(directory, "frame.png") + const result = await exportRecording(timeline, output, { header: "Before · Submit prompt" }) + const data = await readFile(output) + + expect(result.height).toBe(80) + expect(data.readUInt32BE(20)).toBe(80) +}) + +test("exports resized recordings on a stable maximum-size canvas", async () => { + const directory = await mkdtemp(join(tmpdir(), "drive-export-resize-test-")) + directories.push(directory) + const timeline = join(directory, "timeline.jsonl") + await writeFile( + timeline, + [ + JSON.stringify({ + type: "header", + version: 1, + cols: 8, + rows: 4, + encoding: "base64", + }), + JSON.stringify({ + type: "output", + at_ms: 0, + data: Buffer.from("wide").toString("base64"), + }), + JSON.stringify({ type: "resize", at_ms: 100, cols: 4, rows: 2 }), + JSON.stringify({ + type: "output", + at_ms: 100, + data: Buffer.from("small").toString("base64"), + }), + "", + ].join("\n"), + ) + const output = join(directory, "frame.png") + const result = await exportRecording(timeline, output) + const data = await readFile(output) + + expect(result).toEqual({ frames: 7, durationMs: 100, width: 80, height: 80 }) + expect(data.readUInt32BE(16)).toBe(80) + expect(data.readUInt32BE(20)).toBe(80) +}) + +test("centers capture glyphs vertically in their cells", async () => { + const image = await loadImage( + renderFrame({ + cols: 2, + rows: 1, + cursor: { row: 0, col: 0, visible: false }, + lines: [ + { + spans: [{ text: "Mg", width: 2, fg: 0xffffff, bg: 0x080808, attributes: 0 }], + }, + ], + }), + ) + const canvas = createCanvas(20, 20) + const context = canvas.getContext("2d") + context.drawImage(image, 0, 0) + const pixels = context.getImageData(0, 0, 20, 20).data + const inkRows = Array.from({ length: 20 }, (_, row) => row).filter((row) => + Array.from({ length: 20 }, (_, column) => (row * 20 + column) * 4).some( + (offset) => pixels[offset] !== 8 || pixels[offset + 1] !== 8 || pixels[offset + 2] !== 8, + ), + ) + + expect((inkRows[0]! + inkRows.at(-1)!) / 2).toBe(10.5) +}) + +test("renders block elements edge-to-edge", async () => { + const image = await loadImage( + renderFrame({ + cols: 3, + rows: 1, + cursor: { row: 0, col: 0, visible: false }, + lines: [ + { + spans: [ + { + text: "█▀▄", + width: 3, + fg: 0xffffff, + bg: 0x080808, + attributes: 0, + }, + ], + }, + ], + }), + ) + const canvas = createCanvas(30, 20) + const context = canvas.getContext("2d") + context.drawImage(image, 0, 0) + const pixels = context.getImageData(0, 0, 30, 20).data + const pixel = (column: number, row: number) => + Array.from(pixels.subarray((row * 30 + column) * 4, (row * 30 + column) * 4 + 4)) + + expect(pixel(0, 0)).toEqual([255, 255, 255, 255]) + expect(pixel(9, 19)).toEqual([255, 255, 255, 255]) + expect(pixel(10, 0)).toEqual([255, 255, 255, 255]) + expect(pixel(19, 9)).toEqual([255, 255, 255, 255]) + expect(pixel(10, 10)).toEqual([8, 8, 8, 255]) + expect(pixel(20, 9)).toEqual([8, 8, 8, 255]) + expect(pixel(20, 10)).toEqual([255, 255, 255, 255]) + expect(pixel(29, 19)).toEqual([255, 255, 255, 255]) +}) + +test("joins rendered frames horizontally", async () => { + const frame = { + cols: 2, + rows: 1, + cursor: { row: 0, col: 0, visible: false }, + lines: [{ spans: [{ text: "hi", width: 2, fg: 0xffffff, bg: 0x080808, attributes: 0 }] }], + } + const joined = await joinFrames(renderFrame(frame), renderFrame(frame)) + + expect(joined.readUInt32BE(16)).toBe(40) + expect(joined.readUInt32BE(20)).toBe(20) +}) + +test("renders the canonical OpenCode symbol set with the fallback font", async () => { + const symbols = [..."△⇆⊙⚙✱↳◌◈⟳▸▾■⬝⬥⬩⬪"] + const image = await loadImage( + renderFrame({ + cols: symbols.length, + rows: 1, + cursor: { row: 0, col: 0, visible: false }, + lines: [ + { + spans: [ + { + text: symbols.join(""), + width: symbols.length, + fg: 0xffffff, + bg: 0x080808, + attributes: 0, + }, + ], + }, + ], + }), + ) + const canvas = createCanvas(symbols.length * 10, 20) + const context = canvas.getContext("2d") + context.drawImage(image, 0, 0) + const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data + const masks = symbols.map((_, cell) => { + const mask = new Uint8Array(10 * 20) + const columns: number[] = [] + for (let row = 0; row < 20; row++) { + for (let column = 0; column < 10; column++) { + const source = (row * canvas.width + cell * 10 + column) * 4 + const ink = pixels[source] !== 8 || pixels[source + 1] !== 8 || pixels[source + 2] !== 8 + mask[row * 10 + column] = ink ? 1 : 0 + if (ink) columns.push(column) + } + } + const center = (Math.min(...columns) + Math.max(...columns)) / 2 + expect(Math.abs(center - 4.5)).toBeLessThanOrEqual(0.5) + return Bun.hash(mask) + }) + + expect(new Set(masks).size).toBe(symbols.length) +}) + +test("accepts valid capture font overrides", async () => { + const font = new URL("../../assets/fonts/commit-mono/CommitMono-400-Regular.otf", import.meta.url) + const child = renderImport({ OPENCODE_DRIVE_FONT: fileURLToPath(font) }) + expect(await child.exited).toBe(0) +}) + +test("rejects invalid capture font overrides", async () => { + const child = renderImport({ + OPENCODE_DRIVE_FONT: "/missing/capture-font.woff2", + }) + const stderr = new Response(child.stderr).text() + expect(await child.exited).toBe(1) + expect(await stderr).toContain("Failed to register capture font: /missing/capture-font.woff2") +}) + +if (Bun.which("ffmpeg") && Bun.which("ffprobe")) { + test("preserves irregular frame timing at the requested frame rate", async () => { + const directory = await mkdtemp(join(tmpdir(), "drive-encode-ffmpeg-test-")) + directories.push(directory) + const image = (background: number) => + renderFrame({ + cols: 1, + rows: 1, + cursor: { row: 0, col: 0, visible: false }, + lines: [{ spans: [{ text: " ", width: 1, fg: 0xffffff, bg: background, attributes: 0 }] }], + }) + const output = join(directory, "video.mp4") + await encodeFrames( + [ + { atMs: 0, key: "red", render: () => image(0xff0000) }, + { atMs: 1_000, key: "green", render: () => image(0x00ff00) }, + { atMs: 1_200, key: "blue", render: () => image(0x0000ff) }, + ], + output, + { fps: 5 }, + ) + + expect(probeVideo(output)).toEqual(["5/1", "1.400000", "7"]) + + const finalFrame = join(directory, "final.png") + const decoded = Bun.spawnSync([ + "ffmpeg", + "-v", + "error", + "-i", + output, + "-vf", + "reverse", + "-frames:v", + "1", + finalFrame, + ]) + expect(decoded.exitCode).toBe(0) + const final = await loadImage(finalFrame) + const canvas = createCanvas(final.width, final.height) + const context = canvas.getContext("2d") + context.drawImage(final, 0, 0) + const pixel = context.getImageData(5, 10, 1, 1).data + expect(pixel[2]).toBeGreaterThan(200) + expect(pixel[0]).toBeLessThan(80) + }) + + test("exports a 60 FPS H.264 MP4 with the off-grid final frame", async () => { + const directory = await mkdtemp(join(tmpdir(), "drive-export-ffmpeg-test-")) + directories.push(directory) + const timeline = join(directory, "timeline.jsonl") + await writeFile( + timeline, + [ + JSON.stringify({ + type: "header", + version: 1, + cols: 4, + rows: 2, + encoding: "base64", + }), + JSON.stringify({ + type: "output", + at_ms: 0, + data: Buffer.from("\x1b[48;2;255;0;0mAAAA").toString("base64"), + }), + JSON.stringify({ + type: "output", + at_ms: 455, + data: Buffer.from("\r\x1b[48;2;0;0;255mBBBB").toString("base64"), + }), + "", + ].join("\n"), + ) + const output = join(directory, "video.mp4") + const progress: number[] = [] + const result = await exportRecording(timeline, output, { onProgress: (percent) => progress.push(percent) }) + const data = await readFile(output) + expect(result.frames).toBe(29) + expect(result.durationMs).toBe(455) + expect(data.subarray(4, 8).toString()).toBe("ftyp") + expect(data.length).toBeGreaterThan(500) + expect(progress).toEqual([10, 20, 30, 40, 50, 60, 70, 80, 90, 100]) + + expect(probeVideo(output)).toEqual(["60/1", "0.483333", "29"]) + + const finalFrame = join(directory, "final.png") + const decoded = Bun.spawnSync([ + "ffmpeg", + "-v", + "error", + "-i", + output, + "-vf", + "reverse", + "-frames:v", + "1", + finalFrame, + ]) + expect(decoded.exitCode).toBe(0) + const image = await loadImage(finalFrame) + const canvas = createCanvas(image.width, image.height) + const context = canvas.getContext("2d") + context.drawImage(image, 0, 0) + const pixel = context.getImageData(9, 19, 1, 1).data + expect(pixel[2]).toBeGreaterThan(200) + expect(pixel[0]).toBeLessThan(80) + }) +} + +function probeVideo(path: string) { + const probe = Bun.spawnSync([ + "ffprobe", + "-v", + "error", + "-select_streams", + "v:0", + "-show_entries", + "stream=avg_frame_rate,duration,nb_frames", + "-of", + "default=noprint_wrappers=1:nokey=1", + path, + ]) + expect(probe.exitCode).toBe(0) + return probe.stdout.toString().trim().split("\n") +} + +function renderImport(env: Record) { + return Bun.spawn([process.execPath, "-e", 'await import("./src/recording/render.ts")'], { + cwd: join(import.meta.dirname, "../.."), + env: { ...Bun.env, ...env }, + stdout: "ignore", + stderr: "pipe", + }) +} diff --git a/packages/drive/test/recording/replay.test.ts b/packages/drive/test/recording/replay.test.ts new file mode 100644 index 00000000000..fad12fa9def --- /dev/null +++ b/packages/drive/test/recording/replay.test.ts @@ -0,0 +1,231 @@ +import { afterEach, describe, expect, test } from "vitest" +import { mkdtemp, rm, writeFile } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join } from "node:path" +import { replayRecording } from "../../src/recording/index.js" +import { replay } from "../../src/recording/replay.js" + +const directories: string[] = [] + +afterEach(async () => { + await Promise.all(directories.splice(0).map((path) => rm(path, { recursive: true, force: true }))) +}) + +async function recording(events: Array<[number, string]>, cols = 12, rows = 3) { + const directory = await mkdtemp(join(tmpdir(), "drive-replay-test-")) + directories.push(directory) + const path = join(directory, "timeline.jsonl") + const lines = [ + JSON.stringify({ + type: "header", + version: 1, + cols, + rows, + encoding: "base64", + }), + ...events.map(([at_ms, data]) => + JSON.stringify({ + type: "output", + at_ms, + data: Buffer.from(data).toString("base64"), + }), + ), + ] + await writeFile(path, `${lines.join("\n")}\n`) + return path +} + +async function timeline(records: Array>, cols = 12, rows = 3) { + const directory = await mkdtemp(join(tmpdir(), "drive-replay-test-")) + directories.push(directory) + const path = join(directory, "timeline.jsonl") + const lines = [ + JSON.stringify({ + type: "header", + version: 1, + cols, + rows, + encoding: "base64", + }), + ...records.map((record) => JSON.stringify(record)), + ] + await writeFile(path, `${lines.join("\n")}\n`) + return path +} + +function lineText(frame: Awaited>[number]["frame"], row = 0) { + return frame.lines[row]!.spans.map((span) => span.text) + .join("") + .trimEnd() +} + +describe("replayRecording", () => { + test("samples at the requested FPS and retains the off-grid final state", async () => { + const frames = await replayRecording( + await recording([ + [0, "A"], + [150, "B"], + [450, "C"], + ]), + { fps: 5 }, + ) + expect(frames.map((frame) => frame.atMs)).toEqual([0, 200, 400, 450]) + expect(frames.map((frame) => lineText(frame.frame))).toEqual(["A", "AB", "AB", "ABC"]) + }) + + test("applies all same-time events before taking that sample", async () => { + const frames = await replayRecording( + await recording([ + [0, "A"], + [0, "B"], + ]), + ) + expect(frames).toHaveLength(1) + expect(lineText(frames[0]!.frame)).toBe("AB") + }) + + test("preserves quiet time through the final empty output event", async () => { + const frames = await replayRecording( + await recording([ + [0, "ready"], + [1_000, ""], + ]), + ) + expect(frames).toHaveLength(61) + expect(frames[1]!.atMs).toBeCloseTo(1_000 / 60) + expect(frames.at(-1)!.atMs).toBe(1_000) + expect(frames.every((frame) => lineText(frame.frame) === "ready")).toBe(true) + expect(new Set(frames.map((frame) => frame.frame)).size).toBe(1) + }) + + test("captures terminal state at sample boundaries instead of every event", async () => { + let snapshots = 0 + let dirty = false + const frames = await replay(await recording(Array.from({ length: 101 }, (_, atMs) => [atMs, "x"])), { + fps: 10, + terminalFactory: async (cols, rows) => ({ + write: () => { + dirty = true + }, + resize: () => { + dirty = true + }, + finish: () => false, + snapshot: () => { + snapshots++ + return { + cols, + rows, + cursor: { row: 0, col: 0, visible: false }, + lines: Array.from({ length: rows }, (_, row) => ({ + spans: row === 0 && dirty ? [{ text: "ready", width: 5, fg: 0xffffff, bg: 0x080808, attributes: 0 }] : [], + })), + } + }, + }), + }) + + expect(frames.map((frame) => frame.atMs)).toEqual([0, 100]) + expect(snapshots).toBe(2) + }) + + test("trims blank startup time and rebases the first visible frame", async () => { + const frames = await replayRecording( + await recording([ + [500, " "], + [1_000, "\rready"], + [1_500, ""], + ]), + { fps: 10 }, + ) + + expect(frames.map((frame) => frame.atMs)).toEqual([0, 100, 200, 300, 400, 500]) + expect(frames.every((frame) => lineText(frame.frame) === "ready")).toBe(true) + }) + + test("trims to an explicit origin and holds the final frame to a shared duration", async () => { + const frames = await replayRecording( + await recording([ + [0, "A"], + [500, "B"], + [1_000, "C"], + ]), + { fps: 10, startAtMs: 500, durationMs: 1_000 }, + ) + + expect(frames[0]!.atMs).toBe(0) + expect(lineText(frames[0]!.frame)).toBe("AB") + expect(frames.at(-1)!.atMs).toBe(1_000) + expect(lineText(frames.at(-1)!.frame)).toBe("ABC") + }) + + test("resizes the terminal during replay", async () => { + const frames = await replayRecording( + await timeline( + [ + { + type: "output", + at_ms: 0, + data: Buffer.from("A").toString("base64"), + }, + { type: "resize", at_ms: 100, cols: 8, rows: 4 }, + { + type: "output", + at_ms: 100, + data: Buffer.from("B").toString("base64"), + }, + ], + 4, + 2, + ), + { fps: 10 }, + ) + expect(frames.map((frame) => [frame.atMs, frame.frame.cols, frame.frame.rows])).toEqual([ + [0, 4, 2], + [100, 8, 4], + ]) + expect(lineText(frames.at(-1)!.frame)).toBe("AB") + }) + + test("does not expose a synchronized update before its closing wrapper", async () => { + const frames = await replayRecording( + await recording([ + [0, "old"], + [100, "\x1b[?2026h\rnew"], + [400, "\x1b[?2026l"], + ]), + { fps: 5 }, + ) + expect(frames.map((frame) => frame.atMs)).toEqual([0, 200, 400]) + expect(frames.map((frame) => lineText(frame.frame))).toEqual(["old", "old", "new"]) + }) + + test("tracks output around multiple synchronized updates in one chunk", async () => { + const frames = await replayRecording( + await recording([ + [0, "old"], + [100, "\r\x1b[2Kpre\x1b[?2026h\r\x1b[2Khidden"], + [300, "\x1b[?2026l\r\x1b[2Kshown\x1b[?2026h\r\x1b[2Khidden2"], + [500, "\x1b[?2026l"], + ]), + { fps: 5 }, + ) + expect(frames.map((frame) => frame.atMs)).toEqual([0, 200, 400, 500]) + expect(frames.map((frame) => lineText(frame.frame))).toEqual(["old", "pre", "shown", "hidden2"]) + }) + + test("captures truecolor, styles, cursor, and wide Unicode", async () => { + const styled = "\x1b[1;2;3;4;5;7;8;9;38;2;1;2;3;48;2;4;5;6m界\x1b[0m\x1b[2;4H" + const [sample] = await replayRecording(await recording([[0, styled]], 8, 3)) + const span = sample!.frame.lines[0]!.spans[0]! + expect(span).toMatchObject({ + text: "界", + width: 2, + fg: 0x010203, + bg: 0x040506, + attributes: 255, + }) + expect(sample!.frame.cursor).toEqual({ row: 1, col: 3, visible: true }) + expect(sample!.frame.lines[0]!.spans.reduce((width, value) => width + value.width, 0)).toBe(8) + }) +}) diff --git a/packages/drive/test/script-filesystem.test.ts b/packages/drive/test/script-filesystem.test.ts new file mode 100644 index 00000000000..12fc3035324 --- /dev/null +++ b/packages/drive/test/script-filesystem.test.ts @@ -0,0 +1,55 @@ +import { afterEach, describe, expect, test } from "vitest" +import { mkdtemp, rm, symlink } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join } from "node:path" +import * as Effect from "effect/Effect" +import { Errors } from "../src/index.js" +import { createScriptFileSystem } from "../src/script/filesystem.js" + +const roots: string[] = [] + +afterEach(async () => { + await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true }))) +}) + +describe("script filesystem", () => { + test("writes relative files and creates their parents", async () => { + const root = await temporary() + const fs = createScriptFileSystem(root) + await Effect.runPromise(fs.writeFile("src/nested/example.ts", "export const value = 1\n")) + expect(await Bun.file(join(root, "src/nested/example.ts")).text()).toBe("export const value = 1\n") + }) + + test("rejects paths outside the project and symbolic links", async () => { + const root = await temporary() + const outside = await temporary() + const fs = createScriptFileSystem(root) + await symlink(outside, join(root, "linked")) + + const outsideError = await Effect.runPromise(fs.writeFile("../outside.ts", "no").pipe(Effect.flip)) + expect(outsideError).toBeInstanceOf(Errors.FileSystemError) + expect(outsideError).toMatchObject({ + _tag: "FileSystemError", + path: "../outside.ts", + message: expect.stringContaining("stay inside"), + }) + await expect(Effect.runPromise(fs.writeFile(join(outside, "absolute.ts"), "no"))).rejects.toThrow( + "must be relative", + ) + await expect(Effect.runPromise(fs.writeFile("linked/outside.ts", "no"))).rejects.toThrow( + "must not contain symbolic links", + ) + }) + + test("reserves Git metadata for declared Git projects", async () => { + const root = await temporary() + const fs = createScriptFileSystem(root, { git: true }) + await expect(Effect.runPromise(fs.writeFile(".GIT/config", "no"))).rejects.toThrow("must not modify Git metadata") + }) +}) + +async function temporary() { + const root = await mkdtemp(join(tmpdir(), "opencode-drive-fs-test-")) + roots.push(root) + return root +} diff --git a/packages/drive/test/script-project.test.ts b/packages/drive/test/script-project.test.ts new file mode 100644 index 00000000000..76fd2bfad24 --- /dev/null +++ b/packages/drive/test/script-project.test.ts @@ -0,0 +1,128 @@ +import { afterEach, describe, expect, test } from "vitest" +import { mkdir, mkdtemp, rm } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join } from "node:path" +import { + commitScriptProject, + hasGitMetadata, + initializeScriptProject, + stripGitEnvironment, +} from "../src/script/project.js" + +const roots: string[] = [] + +afterEach(async () => { + await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true }))) +}) + +describe("script project", () => { + test("creates a clean Git baseline containing the declared files", async () => { + const root = await temporary() + await mkdir(join(root, ".git")) + await initializeScriptProject(root, { + git: true, + files: { "src/example.ts": "export const value = 1\n" }, + }) + await commitScriptProject(root) + + expect(await Bun.file(join(root, "src/example.ts")).text()).toBe("export const value = 1\n") + expect(await git(root, ["status", "--porcelain"])).toBe("") + expect((await git(root, ["log", "-1", "--format=%s"])).trim()).toBe("Initial commit") + }) + + test("writes project files without requiring Git", async () => { + const root = await temporary() + await initializeScriptProject(root, { files: { "notes.txt": "hello\n" } }) + expect(await Bun.file(join(root, "notes.txt")).text()).toBe("hello\n") + expect(await Bun.file(join(root, ".git")).exists()).toBe(false) + }) + + test("rejects files outside the project and Git metadata", async () => { + const root = await temporary() + await Bun.write(join(root, "existing.txt"), "before\n") + await expect( + initializeScriptProject(root, { + files: { "../outside.ts": "no", "existing.txt": "after\n" }, + }), + ).rejects.toThrow("stay inside") + expect(await Bun.file(join(root, "existing.txt")).text()).toBe("before\n") + await expect(initializeScriptProject(root, { files: { ".GIT/config": "no" } })).rejects.toThrow( + "must not modify Git metadata", + ) + }) + + test("rejects fixture paths that resolve to the same file", async () => { + const root = await temporary() + await expect( + initializeScriptProject(root, { + files: { "same.txt": "one", "./same.txt": "two" }, + }), + ).rejects.toThrow("must resolve to unique files") + expect(await Bun.file(join(root, "same.txt")).exists()).toBe(false) + }) + + test("rejects path-tree conflicts before writing any files", async () => { + const root = await temporary() + await expect( + initializeScriptProject(root, { + files: { + "good.txt": "must not be written", + parent: "file", + "parent/child": "child", + }, + }), + ).rejects.toThrow("file and directory conflicts") + expect(await Bun.file(join(root, "good.txt")).exists()).toBe(false) + await expect(initializeScriptProject(root, { files: { "": "no" } })).rejects.toThrow("must name a file") + await mkdir(join(root, "directory")) + await expect( + initializeScriptProject(root, { + files: { directory: "no", "still-good.txt": "no" }, + }), + ).rejects.toThrow("must not be a directory") + expect(await Bun.file(join(root, "still-good.txt")).exists()).toBe(false) + }) + + test("refuses to replace prepared Git metadata", async () => { + const root = await temporary() + await mkdir(join(root, ".git")) + await Bun.write(join(root, ".git", "config"), "[core]\n") + await expect( + initializeScriptProject(root, { + git: true, + files: { "must-not-be-written.txt": "no\n" }, + }), + ).rejects.toThrow("cannot replace existing Git metadata") + expect(await Bun.file(join(root, "must-not-be-written.txt")).exists()).toBe(false) + }) + + test("removes inherited Git environment variables", () => { + expect( + stripGitEnvironment({ + PATH: "/bin", + GIT_DIR: "/outside", + EMPTY: undefined, + }), + ).toEqual({ + PATH: "/bin", + }) + }) + + test("detects prepared repositories but ignores the empty Drive placeholder", async () => { + const root = await temporary() + await mkdir(join(root, ".git")) + expect(await hasGitMetadata(root)).toBe(false) + await Bun.write(join(root, ".git", "HEAD"), "ref: refs/heads/main\n") + expect(await hasGitMetadata(root)).toBe(true) + }) +}) + +async function temporary() { + const root = await mkdtemp(join(tmpdir(), "opencode-drive-project-test-")) + roots.push(root) + return root +} + +async function git(cwd: string, args: ReadonlyArray) { + return Bun.$`git ${args}`.cwd(cwd).text() +} diff --git a/packages/drive/test/simulation/backend.test.ts b/packages/drive/test/simulation/backend.test.ts new file mode 100644 index 00000000000..5e24a0caffc --- /dev/null +++ b/packages/drive/test/simulation/backend.test.ts @@ -0,0 +1,289 @@ +import { describe, expect, it } from "@effect/vitest" +import { Effect, Fiber, Option, Stream } from "effect" +import { Backend } from "../../src/client/index.js" +import * as SimulationConnector from "../../src/simulation/connector.js" +import { sendResult, startTransportPeer } from "./transport-peer.js" + +const exchanges = { + early: { + id: "exchange-early", + url: "https://api.openai.com/v1/responses", + body: { model: "test-model", input: "early" }, + }, + first: { + id: "exchange-first", + url: "https://api.openai.com/v1/responses", + body: { model: "test-model", input: "first" }, + }, + second: { + id: "exchange-second", + url: "https://api.openai.com/v1/responses", + body: { model: "test-model", input: "second" }, + }, +} as const + +function sendNotification(socket: Bun.ServerWebSocket, method: string, params: unknown) { + socket.send(JSON.stringify({ jsonrpc: "2.0", method, params })) +} + +describe("OpenCode backend simulation transport", () => { + it.live("preserves exact frames, sequential IDs, results, and finish defaults", () => + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => { + sendResult(socket, request, request.method === "llm.attach" ? { attached: true } : { ok: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + + const results = [ + yield* connection.attach(), + yield* connection.rpc["llm.chunk"]({ + id: "exchange-1", + items: [ + { type: "textDelta", text: "answer" }, + { type: "reasoningDelta", text: "thinking" }, + { + type: "toolCall", + index: 0, + id: "call-1", + name: "read", + input: { path: "README.md" }, + }, + { type: "raw", chunk: { usage: { outputTokens: 2 } } }, + ], + }), + yield* connection.rpc["llm.finish"]({ id: "exchange-1" }), + yield* connection.rpc["llm.finish"]({ id: "exchange-2", reason: "stop" }), + yield* connection.rpc["llm.finish"]({ id: "exchange-3", reason: "tool-calls" }), + yield* connection.rpc["llm.finish"]({ id: "exchange-4", reason: "length" }), + yield* connection.rpc["llm.finish"]({ id: "exchange-5", reason: "content-filter" }), + yield* connection.rpc["llm.disconnect"]({ id: "exchange-6" }), + ] + + expect(results).toEqual([ + { attached: true }, + { ok: true }, + { ok: true }, + { ok: true }, + { ok: true }, + { ok: true }, + { ok: true }, + { ok: true }, + ]) + + const frames = [ + { jsonrpc: "2.0", id: 1, method: "llm.attach" }, + { + jsonrpc: "2.0", + id: 2, + method: "llm.chunk", + params: { + id: "exchange-1", + items: [ + { type: "textDelta", text: "answer" }, + { type: "reasoningDelta", text: "thinking" }, + { + type: "toolCall", + index: 0, + id: "call-1", + name: "read", + input: { path: "README.md" }, + }, + { type: "raw", chunk: { usage: { outputTokens: 2 } } }, + ], + }, + }, + { + jsonrpc: "2.0", + id: 3, + method: "llm.finish", + params: { id: "exchange-1" }, + }, + { + jsonrpc: "2.0", + id: 4, + method: "llm.finish", + params: { id: "exchange-2", reason: "stop" }, + }, + { + jsonrpc: "2.0", + id: 5, + method: "llm.finish", + params: { id: "exchange-3", reason: "tool-calls" }, + }, + { + jsonrpc: "2.0", + id: 6, + method: "llm.finish", + params: { id: "exchange-4", reason: "length" }, + }, + { + jsonrpc: "2.0", + id: 7, + method: "llm.finish", + params: { id: "exchange-5", reason: "content-filter" }, + }, + { + jsonrpc: "2.0", + id: 8, + method: "llm.disconnect", + params: { id: "exchange-6" }, + }, + ] + + expect(peer.received.map(({ raw }) => raw)).toEqual(frames.map((frame) => JSON.stringify(frame))) + expect(peer.received.map(({ request }) => request)).toEqual(frames) + + expect(Backend.decodeRequest(peer.received[2]!.request)).toEqual({ + jsonrpc: "2.0", + id: 3, + method: "llm.finish", + params: { id: "exchange-1", reason: "stop" }, + }) + expect(peer.received[2]!.raw).toBe( + JSON.stringify({ + jsonrpc: "2.0", + id: 3, + method: "llm.finish", + params: { id: "exchange-1" }, + }), + ) + }), + ) + + it.live("delivers an llm.request sent before the attach response", () => + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => { + sendNotification(socket, "llm.request", exchanges.early) + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + + const connection = yield* SimulationConnector.backend(peer.url) + const request = yield* Stream.runHead(connection.requests) + expect(request).toEqual(Option.some(exchanges.early)) + }), + ) + + it.live("preserves notification order and ignores unknown notifications without consuming response waiters", () => + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "llm.attach") { + sendResult(socket, request, { attached: true }) + return + } + sendNotification(socket, "llm.request", exchanges.first) + sendNotification(socket, "server.status", { ready: true }) + sendNotification(socket, "llm.request", exchanges.second) + sendResult(socket, request, { ok: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + + const connection = yield* SimulationConnector.backend(peer.url) + expect( + yield* connection.rpc["llm.chunk"]({ + id: "exchange-1", + items: [{ type: "textDelta", text: "response" }], + }), + ).toEqual({ ok: true }) + const received = yield* connection.requests.pipe(Stream.take(2), Stream.runCollect) + expect([...received]).toEqual([exchanges.first, exchanges.second]) + }), + ) + + it.live("mirrors tool lifecycle RPCs and preserves invocation-cancellation order", () => + Effect.gen(function* () { + const invocation = { + id: "tool_1", + name: "lookup", + input: { query: "meaning" }, + context: { + sessionID: "ses_tools", + agent: "build", + messageID: "msg_tools", + id: "call_lookup", + }, + } + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach") { + sendNotification(socket, "tool.invocation", invocation) + sendNotification(socket, "tool.cancel", { + id: "tool_1", + reason: "interrupted", + }) + sendResult(socket, request, { attached: true }) + return + } + sendResult(socket, request, { ok: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const events = yield* connection.toolEvents.pipe(Stream.take(2), Stream.runCollect, Effect.forkScoped) + const tools = [ + { + name: "lookup", + description: "Look up a value", + inputSchema: { type: "object" }, + options: { codemode: false }, + }, + ] + + yield* connection.attachTools(tools) + yield* connection.updateTool({ + id: "tool_1", + sequence: 0, + update: { structured: { phase: "searching" } }, + }) + yield* connection.finishTool({ + id: "tool_1", + output: { structured: { answer: 42 }, content: [] }, + }) + yield* connection.failTool({ id: "tool_2", message: "failed" }) + + expect([...(yield* Fiber.join(events))]).toEqual([ + { type: "invocation", invocation }, + { + type: "cancellation", + cancellation: { id: "tool_1", reason: "interrupted" }, + }, + ]) + expect(peer.received.map(({ request }) => request)).toEqual([ + { + jsonrpc: "2.0", + id: 1, + method: "tool.attach", + params: { tools }, + }, + { + jsonrpc: "2.0", + id: 2, + method: "tool.update", + params: { + id: "tool_1", + sequence: 0, + update: { structured: { phase: "searching" } }, + }, + }, + { + jsonrpc: "2.0", + id: 3, + method: "tool.finish", + params: { + id: "tool_1", + output: { structured: { answer: 42 }, content: [] }, + }, + }, + { + jsonrpc: "2.0", + id: 4, + method: "tool.fail", + params: { id: "tool_2", message: "failed" }, + }, + ]) + }), + ) +}) diff --git a/packages/drive/test/simulation/connector.test.ts b/packages/drive/test/simulation/connector.test.ts new file mode 100644 index 00000000000..413b6f9680f --- /dev/null +++ b/packages/drive/test/simulation/connector.test.ts @@ -0,0 +1,139 @@ +import { describe, expect, it } from "@effect/vitest" +import { Effect, Option, Schema, Stream } from "effect" +import { SimulationConnector } from "../../src/simulation/connector.js" +import { sendError, sendResult, startTransportPeer } from "./transport-peer.js" + +const state = { + focused: { renderable: 1, editor: true }, + elements: [], +} + +describe("SimulationConnector", () => { + it.live("acquires a generated UI client through the service seam", () => + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, state)) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + + const connector = yield* SimulationConnector.Service + const connection = yield* connector.ui(peer.url) + + expect(connection.endpoint).toBe(peer.url) + expect(connection.compatibility).toMatchObject({ + _tag: "Negotiated", + role: "ui", + protocolVersion: 1, + server: { name: "opencode", version: "test" }, + }) + expect(yield* connection.rpc["ui.state"]()).toEqual(state) + expect(peer.received.map(({ request }) => request)).toEqual([{ jsonrpc: "2.0", id: 1, method: "ui.state" }]) + }).pipe(Effect.provide(SimulationConnector.layer)), + ) + + it.live("reports legacy fallback and rejects it when negotiation is required", () => + Effect.gen(function* () { + const peer = startTransportPeer( + ({ request, socket }) => + request.method === "simulation.handshake" + ? sendError(socket, request, "method not found", -32601) + : sendResult(socket, request, state), + { handshake: false }, + ) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + + const connector = yield* SimulationConnector.Service + const legacy = yield* connector.ui(peer.url) + expect(legacy.compatibility).toMatchObject({ + _tag: "Legacy", + role: "ui", + profile: "opencode-simulation-jsonrpc-v0", + }) + + const error = yield* connector + .ui(peer.url, { + compatibility: "required", + }) + .pipe(Effect.flip) + expect(error).toMatchObject({ + _tag: "SimulationCompatibilityError", + endpoint: peer.url, + role: "ui", + }) + }).pipe(Effect.provide(SimulationConnector.layer)), + ) + + it.live("attaches after installing a validated backend request stream", () => + Effect.gen(function* () { + const exchange = { + id: "exchange-1", + url: "https://api.openai.com/v1/responses", + body: { model: "test-model" }, + } + const peer = startTransportPeer(({ request, socket }) => { + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: exchange, + }), + ) + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + + const connector = yield* SimulationConnector.Service + const connection = yield* connector.backend(peer.url) + const request = yield* Stream.runHead(connection.requests) + const output = { endpoint: connection.endpoint, request } + + expect(output.endpoint).toBe(peer.url) + expect(output.request).toEqual(Option.some(exchange)) + expect(peer.received.map(({ request }) => request)).toEqual([{ jsonrpc: "2.0", id: 1, method: "llm.attach" }]) + }).pipe(Effect.provide(SimulationConnector.layer)), + ) + + it.live("fails the backend request stream for invalid llm.request payloads", () => + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => { + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "llm.request", + params: { id: 1 }, + }), + ) + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + + const connector = yield* SimulationConnector.Service + const connection = yield* connector.backend(peer.url) + const error = yield* Stream.runHead(connection.requests).pipe(Effect.flip) + expect(Schema.isSchemaError(error)).toBe(true) + }).pipe(Effect.provide(SimulationConnector.layer)), + ) + + it.live("keeps tool capabilities optional until dynamic tools are attached", () => + Effect.gen(function* () { + const peer = startTransportPeer( + ({ request, socket }) => + sendResult(socket, request, request.method === "llm.attach" ? { attached: true } : { ok: true }), + { + capabilities: (offered) => offered.filter((capability) => !capability.startsWith("tool.")), + }, + ) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + + const connection = yield* SimulationConnector.backend(peer.url) + expect(connection.compatibility).toMatchObject({ + _tag: "Negotiated", + role: "backend", + }) + expect(yield* connection.attachTools([]).pipe(Effect.flip)).toMatchObject({ + _tag: "SimulationCompatibilityError", + role: "backend", + message: expect.stringContaining("tool.attach"), + }) + expect(peer.received.map(({ request }) => request.method)).toEqual(["llm.attach"]) + }).pipe(Effect.provide(SimulationConnector.layer)), + ) +}) diff --git a/packages/drive/test/simulation/direct-cli.test.ts b/packages/drive/test/simulation/direct-cli.test.ts new file mode 100644 index 00000000000..1e463da8685 --- /dev/null +++ b/packages/drive/test/simulation/direct-cli.test.ts @@ -0,0 +1,129 @@ +import { expect, test } from "vitest" +import { mkdtemp, rm } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join, resolve } from "node:path" + +const state = { + focused: { renderable: 1, editor: true }, + elements: [], +} + +test.sequential("CLI drives an externally owned OpenCode endpoint on the default port", async () => { + const root = await mkdtemp(join(tmpdir(), "opencode-drive-direct-test-")) + const requests: unknown[] = [] + const server = Bun.serve({ + hostname: "127.0.0.1", + port: 40900, + fetch(request, server) { + if (server.upgrade(request)) return + return new Response("external OpenCode simulation endpoint", { + status: 426, + }) + }, + websocket: { + message(socket, message) { + const request = JSON.parse(String(message)) as { + readonly id: number + readonly method: string + } + if (request.method === "simulation.handshake") { + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + id: request.id, + error: { code: -32601, message: "method not found" }, + }), + ) + return + } + requests.push(request) + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + id: request.id, + result: request.method === "ui.screenshot" ? "/tmp/home.png" : state, + }), + ) + }, + }, + }) + + try { + const first = await sendState(root) + expect(first.status).toBe(0) + expect(JSON.parse(first.stdout)).toEqual(state) + + const second = await sendState(root) + expect(second.status).toBe(0) + expect(JSON.parse(second.stdout)).toEqual(state) + + const screenshot = await send(root, ["--command.ui.screenshot", '{"name":"home"}']) + expect(screenshot.status).toBe(0) + expect(screenshot.stdout.trim()).toBe("/tmp/home.png") + + const ctrlTab = await send(root, ["--command.ui.press", '{"key":"tab","modifiers":{"ctrl":true}}']) + expect(ctrlTab.status).toBe(0) + + const right = await send(root, ["--command.ui.press", '{"key":"right"}']) + expect(right.status).toBe(0) + + const altDown = await send(root, ["--command.ui.press", '{"key":"down","modifiers":{"meta":true}}']) + expect(altDown.status).toBe(0) + + const invalidAlt = await send(root, ["--command.ui.press", '{"key":"down","modifiers":{"alt":true}}']) + expect(invalidAlt.status).toBe(1) + expect(invalidAlt.stderr).toContain("alt") + expect(invalidAlt.stderr).toContain("Unexpected key with value true") + + expect(requests).toEqual([ + { jsonrpc: "2.0", id: 1, method: "ui.state" }, + { jsonrpc: "2.0", id: 1, method: "ui.state" }, + { jsonrpc: "2.0", id: 1, method: "ui.screenshot", params: { name: "home" } }, + { + jsonrpc: "2.0", + id: 1, + method: "ui.press", + params: { key: "\u001b[9;5u" }, + }, + { + jsonrpc: "2.0", + id: 1, + method: "ui.press", + params: { key: "\u001b[C" }, + }, + { + jsonrpc: "2.0", + id: 1, + method: "ui.press", + params: { key: "\u001b[1;3B" }, + }, + ]) + } finally { + await server.stop(true) + await rm(root, { recursive: true, force: true }) + } +}) + +async function sendState(root: string) { + return send(root, ["--command.ui.state"]) +} + +async function send(root: string, args: string[]) { + const child = Bun.spawn([process.execPath, resolve("src/cli/index.ts"), "send", ...args], { + cwd: resolve("."), + env: { + ...process.env, + DRIVE_REGISTRY_DIR: join(root, "registry"), + TMPDIR: root, + }, + stdin: "ignore", + stdout: "pipe", + stderr: "pipe", + }) + const [status, stdout, stderr] = await Promise.all([ + child.exited, + new Response(child.stdout).text(), + new Response(child.stderr).text(), + ]) + return { status, stdout, stderr } +} diff --git a/packages/drive/test/simulation/lifecycle.test.ts b/packages/drive/test/simulation/lifecycle.test.ts new file mode 100644 index 00000000000..d5a2ad7be89 --- /dev/null +++ b/packages/drive/test/simulation/lifecycle.test.ts @@ -0,0 +1,124 @@ +import { describe, expect, it, test } from "@effect/vitest" +import { Effect, Exit, Fiber, Scope } from "effect" +import { SimulationProtocol, defaultBackendPort, defaultPort } from "../../src/client/index.js" +import * as SimulationConnector from "../../src/simulation/connector.js" +import { type ReceivedRequest, sendError, sendResult, startTransportPeer } from "./transport-peer.js" + +function captureRequests() { + const queued: ReceivedRequest[] = [] + const waiters: Array<(request: ReceivedRequest) => void> = [] + + return { + onRequest(request: ReceivedRequest) { + const waiter = waiters.shift() + if (waiter === undefined) queued.push(request) + else waiter(request) + }, + next(): Promise { + const request = queued.shift() + if (request !== undefined) return Promise.resolve(request) + return new Promise((resolve) => waiters.push(resolve)) + }, + } +} + +describe("OpenCode simulation transport lifecycle", () => { + test("exports default ports and the protocol namespaces", () => { + expect(defaultPort).toBe(40900) + expect(defaultBackendPort).toBe(40950) + expect(Object.keys(SimulationProtocol).sort()).toEqual(["Backend", "Frontend", "Handshake", "JsonRpc"]) + }) + + it.live("correlates concurrent UI responses by ID and ignores unknown IDs", () => + Effect.gen(function* () { + const capture = captureRequests() + const peer = startTransportPeer(capture.onRequest) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const { rpc } = yield* SimulationConnector.ui(peer.url) + const state = { focused: { renderable: 7, editor: true }, elements: [] } + + const stateResult = yield* Effect.forkChild(rpc["ui.state"]()) + const stateRequest = yield* Effect.promise(capture.next) + const matchesResult = yield* Effect.forkChild(rpc["ui.matches"]({ text: "ready" })) + const matchesRequest = yield* Effect.promise(capture.next) + + expect(stateRequest.request.method).toBe("ui.state") + expect(matchesRequest.request.method).toBe("ui.matches") + + stateRequest.socket.send(JSON.stringify({ jsonrpc: "2.0", id: 999, result: "unknown" })) + sendResult(matchesRequest.socket, matchesRequest.request, true) + sendResult(stateRequest.socket, stateRequest.request, state) + + expect(yield* Fiber.join(matchesResult)).toBe(true) + expect(yield* Fiber.join(stateResult)).toEqual(state) + }), + ) + + it.live("maps JSON-RPC errors to SimulationRequestError with the originating method", () => + Effect.gen(function* () { + const capture = captureRequests() + const peer = startTransportPeer(capture.onRequest) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const { rpc } = yield* SimulationConnector.ui(peer.url) + + const result = yield* Effect.forkChild(rpc["ui.matches"]({ text: "missing" }).pipe(Effect.flip)) + const received = yield* Effect.promise(capture.next) + sendError(received.socket, received.request, "renderer unavailable") + + expect(yield* Fiber.join(result)).toMatchObject({ + _tag: "SimulationRequestError", + message: "renderer unavailable", + method: "ui.matches", + }) + }), + ) + + it.live("peer close rejects every pending UI request", () => + Effect.gen(function* () { + const capture = captureRequests() + const peer = startTransportPeer(capture.onRequest) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const { rpc } = yield* SimulationConnector.ui(peer.url) + + const stateResult = yield* Effect.forkChild(Effect.exit(rpc["ui.state"]())) + yield* Effect.promise(capture.next) + const matchesResult = yield* Effect.forkChild(Effect.exit(rpc["ui.matches"]({ text: "ready" }))) + yield* Effect.promise(capture.next) + + yield* Effect.promise(() => peer.stop()) + + for (const exit of [yield* Fiber.join(stateResult), yield* Fiber.join(matchesResult)]) { + expect(Exit.isFailure(exit)).toBe(true) + expect(String(exit)).toContain("connection closed") + } + }), + ) + + it.live("backend closed resolves when its peer closes", () => + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, { attached: true })) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const connection = yield* SimulationConnector.backend(peer.url) + + yield* Effect.promise(() => peer.stop()) + yield* connection.closed + }), + ) + + it.live("closing the connection scope rejects pending calls", () => + Effect.gen(function* () { + const capture = captureRequests() + const peer = startTransportPeer(capture.onRequest) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const scope = yield* Scope.make() + const { rpc } = yield* SimulationConnector.ui(peer.url).pipe(Scope.provide(scope)) + + const pending = yield* Effect.forkChild(Effect.exit(rpc["ui.state"]())) + yield* Effect.promise(capture.next) + yield* Scope.close(scope, Exit.void) + + const exit = yield* Fiber.join(pending) + expect(Exit.isFailure(exit)).toBe(true) + }), + ) +}) diff --git a/packages/drive/test/simulation/opencode-protocol.test.ts b/packages/drive/test/simulation/opencode-protocol.test.ts new file mode 100644 index 00000000000..48392a30e96 --- /dev/null +++ b/packages/drive/test/simulation/opencode-protocol.test.ts @@ -0,0 +1,157 @@ +import { describe, expect, it } from "@effect/vitest" +import { Effect } from "effect" +import { RpcClient, RpcClientError, RpcMessage } from "effect/unstable/rpc" +import * as OpenCodeRpcProtocol from "../../src/simulation/opencode-protocol.js" +import { SimulationRequestError, UiRpcs } from "@opencode-ai/protocol/simulation" +import { sendError, sendResult, startTransportPeer } from "./transport-peer.js" + +const state = { + focused: { renderable: 1, editor: true }, + elements: [], +} + +describe("OpenCode Effect RPC compatibility protocol", () => { + it.live("drives generated UI clients over exact OpenCode JSON-RPC", () => { + const notifications: unknown[] = [] + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "ui.matches") { + sendError(socket, request, "match failed") + return + } + if (request.method === "ui.screenshot") { + const params = request.params as { readonly name?: string } | undefined + sendResult(socket, request, `/tmp/${params?.name ?? "screen"}.png`) + return + } + if (request.method === "ui.state") + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + method: "server.status", + params: { ready: true }, + }), + ) + sendResult(socket, request, state) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const protocol = yield* OpenCodeRpcProtocol.make(peer.url, { + onNotification: (notification) => Effect.sync(() => notifications.push(notification)), + }) + const client = yield* RpcClient.make(UiRpcs).pipe(Effect.provideService(RpcClient.Protocol, protocol)) + + expect(yield* client["ui.state"]()).toEqual(state) + expect(yield* client["ui.screenshot"](undefined)).toBe("/tmp/screen.png") + expect(yield* client["ui.screenshot"]({ name: "home" })).toBe("/tmp/home.png") + expect(yield* client["ui.press"]({ key: "right" })).toEqual(state) + expect(yield* client["ui.press"]({ key: "down", modifiers: { meta: true } })).toEqual(state) + expect(yield* client["ui.press"]({ key: "tab", modifiers: { ctrl: true } })).toEqual(state) + + const error = yield* client["ui.matches"]({ text: "fail" }).pipe(Effect.flip) + expect(error).toBeInstanceOf(SimulationRequestError) + expect(error).toMatchObject({ + method: "ui.matches", + code: -32000, + message: "match failed", + }) + + const firstId = peer.received[0]!.request.id + expect(typeof firstId).toBe("number") + expect(notifications).toEqual([{ method: "server.status", params: { ready: true } }]) + expect(peer.received.map(({ request }) => request)).toEqual([ + { jsonrpc: "2.0", id: firstId, method: "ui.state" }, + { + jsonrpc: "2.0", + id: firstId + 1, + method: "ui.screenshot", + }, + { + jsonrpc: "2.0", + id: firstId + 2, + method: "ui.screenshot", + params: { name: "home" }, + }, + { + jsonrpc: "2.0", + id: firstId + 3, + method: "ui.press", + params: { key: "\u001b[C" }, + }, + { + jsonrpc: "2.0", + id: firstId + 4, + method: "ui.press", + params: { key: "\u001b[1;3B" }, + }, + { + jsonrpc: "2.0", + id: firstId + 5, + method: "ui.press", + params: { key: "\u001b[9;5u" }, + }, + { + jsonrpc: "2.0", + id: firstId + 6, + method: "ui.matches", + params: { text: "fail" }, + }, + ]) + }) + }) + + it.live("correlates multiple generated clients through local wire IDs", () => { + const secondState = { + focused: { renderable: 2, editor: false }, + elements: [], + } + const received: Array< + Parameters[1] & { + readonly socket: Bun.ServerWebSocket + } + > = [] + const peer = startTransportPeer(({ request, socket }) => { + received.push({ ...request, socket }) + if (received.length !== 2) return + sendResult(received[1]!.socket, received[1]!, secondState) + sendResult(received[0]!.socket, received[0]!, state) + }) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const protocol = yield* OpenCodeRpcProtocol.make(peer.url) + const options = { + generateRequestId: () => RpcMessage.RequestId(7), + } + const first = yield* RpcClient.make(UiRpcs, options).pipe(Effect.provideService(RpcClient.Protocol, protocol)) + const second = yield* RpcClient.make(UiRpcs, options).pipe(Effect.provideService(RpcClient.Protocol, protocol)) + const results = yield* Effect.all([first["ui.state"](), second["ui.state"]()], { concurrency: "unbounded" }) + + expect(results).toEqual([state, secondState]) + expect(peer.received.map(({ request }) => request)).toEqual([ + { jsonrpc: "2.0", id: 1, method: "ui.state" }, + { jsonrpc: "2.0", id: 2, method: "ui.state" }, + ]) + }) + }) + + it.live("persists fatal protocol failures for later requests", () => { + const peer = startTransportPeer(({ request, socket }) => + socket.send(JSON.stringify({ jsonrpc: "2.0", id: request.id })), + ) + + return Effect.gen(function* () { + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const protocol = yield* OpenCodeRpcProtocol.make(peer.url) + const client = yield* RpcClient.make(UiRpcs).pipe(Effect.provideService(RpcClient.Protocol, protocol)) + + const first = yield* client["ui.state"]().pipe(Effect.flip) + expect(first).toBeInstanceOf(RpcClientError.RpcClientError) + expect(first.message).toContain("JSON-RPC response must contain result or error") + + const second = yield* client["ui.state"]().pipe(Effect.flip) + expect(second).toBe(first) + expect(peer.received).toHaveLength(1) + }) + }) +}) diff --git a/packages/drive/test/simulation/protocol.test.ts b/packages/drive/test/simulation/protocol.test.ts new file mode 100644 index 00000000000..dc8939fe154 --- /dev/null +++ b/packages/drive/test/simulation/protocol.test.ts @@ -0,0 +1,98 @@ +import { expect, it } from "@effect/vitest" +import { Backend } from "@opencode-ai/protocol/simulation" + +it("decodes the canonical dynamic tool lifecycle", () => { + expect( + Backend.decodeRequest({ + jsonrpc: "2.0", + id: 1, + method: "tool.attach", + params: { + tools: [ + { + name: "search", + description: "Search GitHub", + inputSchema: { type: "object" }, + outputSchema: { type: "object" }, + permission: "search", + options: { namespace: "github.api", codemode: false }, + }, + ], + }, + }), + ).toMatchObject({ method: "tool.attach" }) + expect( + Backend.decodeRequest({ + jsonrpc: "2.0", + id: 2, + method: "tool.update", + params: { + id: "tool_1", + sequence: 0, + update: { + structured: { phase: "searching" }, + content: [{ type: "text", text: "Searching" }], + }, + }, + }), + ).toMatchObject({ method: "tool.update" }) +}) + +it("rejects unsafe, colliding, and reserved exposed names", () => { + const attach = (tools: ReadonlyArray) => + Backend.decodeRequest({ + jsonrpc: "2.0", + id: 1, + method: "tool.attach", + params: { tools }, + }) + const tool = { + name: "search", + description: "Search", + inputSchema: { type: "object" }, + } + + expect(() => attach([{ ...tool, name: "unsafe.name" }])).toThrow() + expect(() => + attach([ + { ...tool, options: { namespace: "a.b" } }, + { ...tool, options: { namespace: "a_b" } }, + ]), + ).toThrow() + expect(() => + attach([ + { + ...tool, + name: "execute", + options: { codemode: false }, + }, + ]), + ).toThrow() +}) + +it("decodes provider-neutral partial tool input chunks", () => { + expect( + Backend.Item.make({ + type: "toolInputStart", + index: 0, + id: "call_lookup", + name: "lookup", + }), + ).toEqual({ + type: "toolInputStart", + index: 0, + id: "call_lookup", + name: "lookup", + }) + expect( + Backend.Item.make({ + type: "toolInputDelta", + index: 0, + text: '{"query":"meaning"}', + }), + ).toEqual({ + type: "toolInputDelta", + index: 0, + text: '{"query":"meaning"}', + }) +}) diff --git a/packages/drive/test/simulation/rpc.test.ts b/packages/drive/test/simulation/rpc.test.ts new file mode 100644 index 00000000000..43e95f8b3b2 --- /dev/null +++ b/packages/drive/test/simulation/rpc.test.ts @@ -0,0 +1,146 @@ +import { describe, expect, it } from "@effect/vitest" +import { Effect } from "effect" +import { RpcTest } from "effect/unstable/rpc" +import { BackendRpcs, SimulationRequestError, UiRpcs } from "@opencode-ai/protocol/simulation" + +const state = { + focused: { renderable: 1, editor: true }, + elements: [], +} + +describe("OpenCode simulation RPC contracts", () => { + it.effect("generates typed UI clients over the canonical schemas", () => { + const calls: Array<{ readonly method: string; readonly payload: unknown }> = [] + return Effect.gen(function* () { + const client = yield* RpcTest.makeClient(UiRpcs).pipe( + Effect.provide( + UiRpcs.toLayer({ + "ui.state": (payload) => { + calls.push({ method: "ui.state", payload }) + return Effect.succeed(state) + }, + "ui.matches": (payload) => { + calls.push({ method: "ui.matches", payload }) + if (payload.text === "fail") + return Effect.fail( + new SimulationRequestError({ + method: "ui.matches", + code: -32000, + message: "match failed", + }), + ) + return Effect.succeed(true) + }, + "ui.screenshot": (payload) => { + calls.push({ method: "ui.screenshot", payload }) + return Effect.succeed(`/tmp/${payload?.name ?? "screen"}.png`) + }, + "ui.recording.finish": (payload) => { + calls.push({ method: "ui.recording.finish", payload }) + return Effect.succeed("/tmp/recording.jsonl") + }, + "ui.type": (payload) => { + calls.push({ method: "ui.type", payload }) + return Effect.succeed(state) + }, + "ui.press": () => Effect.succeed(state), + "ui.enter": () => Effect.succeed(state), + "ui.arrow": () => Effect.succeed(state), + "ui.focus": () => Effect.succeed(state), + "ui.click": () => Effect.succeed(state), + "ui.resize": () => Effect.succeed(state), + }), + ), + ) + + expect(yield* client["ui.state"]()).toEqual(state) + expect(yield* client["ui.matches"]({ text: "ready" })).toBe(true) + const error = yield* client["ui.matches"]({ text: "fail" }).pipe(Effect.flip) + expect(error).toBeInstanceOf(SimulationRequestError) + expect(error).toMatchObject({ + method: "ui.matches", + code: -32000, + message: "match failed", + }) + expect(yield* client["ui.screenshot"](undefined)).toBe("/tmp/screen.png") + expect(yield* client["ui.screenshot"]({ name: "home" })).toBe("/tmp/home.png") + expect(yield* client["ui.recording.finish"]()).toBe("/tmp/recording.jsonl") + expect(yield* client["ui.type"]({ text: "hello" })).toEqual(state) + + expect(calls).toEqual([ + { method: "ui.state", payload: undefined }, + { method: "ui.matches", payload: { text: "ready" } }, + { method: "ui.matches", payload: { text: "fail" } }, + { method: "ui.screenshot", payload: undefined }, + { method: "ui.screenshot", payload: { name: "home" } }, + { method: "ui.recording.finish", payload: undefined }, + { method: "ui.type", payload: { text: "hello" } }, + ]) + }) + }) + + it.effect("generates backend clients with optional finish reasons", () => { + const calls: Array<{ readonly method: string; readonly payload: unknown }> = [] + return Effect.gen(function* () { + const client = yield* RpcTest.makeClient(BackendRpcs).pipe( + Effect.provide( + BackendRpcs.toLayer({ + "llm.attach": (payload) => { + calls.push({ method: "llm.attach", payload }) + return Effect.succeed({ attached: true as const }) + }, + "llm.chunk": (payload) => { + calls.push({ method: "llm.chunk", payload }) + return Effect.succeed({ ok: true as const }) + }, + "llm.finish": (payload) => { + calls.push({ method: "llm.finish", payload }) + return Effect.succeed({ ok: true as const }) + }, + "llm.disconnect": (payload) => { + calls.push({ method: "llm.disconnect", payload }) + return Effect.succeed({ ok: true as const }) + }, + }), + ), + ) + + expect(yield* client["llm.attach"]()).toEqual({ attached: true }) + expect( + yield* client["llm.chunk"]({ + id: "exchange-1", + items: [{ type: "textDelta", text: "hello" }], + }), + ).toEqual({ ok: true }) + expect(yield* client["llm.finish"]({ id: "exchange-1" })).toEqual({ + ok: true, + }) + expect( + yield* client["llm.finish"]({ + id: "exchange-2", + reason: "length", + }), + ).toEqual({ ok: true }) + expect(yield* client["llm.disconnect"]({ id: "exchange-3" })).toEqual({ + ok: true, + }) + + expect(calls).toEqual([ + { method: "llm.attach", payload: undefined }, + { + method: "llm.chunk", + payload: { + id: "exchange-1", + items: [{ type: "textDelta", text: "hello" }], + }, + }, + { method: "llm.finish", payload: { id: "exchange-1" } }, + { + method: "llm.finish", + payload: { id: "exchange-2", reason: "length" }, + }, + { method: "llm.disconnect", payload: { id: "exchange-3" } }, + ]) + }) + }) +}) diff --git a/packages/drive/test/simulation/transport-peer.ts b/packages/drive/test/simulation/transport-peer.ts new file mode 100644 index 00000000000..1f230388930 --- /dev/null +++ b/packages/drive/test/simulation/transport-peer.ts @@ -0,0 +1,80 @@ +export interface WireRequest { + readonly jsonrpc: "2.0" + readonly id: number + readonly method: string + readonly params?: unknown +} + +export interface ReceivedRequest { + readonly raw: string + readonly request: WireRequest + readonly socket: Bun.ServerWebSocket +} + +export function startTransportPeer( + onRequest: (received: ReceivedRequest) => void, + options?: { + readonly handshake?: boolean + readonly capabilities?: (offered: ReadonlyArray) => ReadonlyArray + }, +) { + const received: ReceivedRequest[] = [] + const server = Bun.serve({ + hostname: "127.0.0.1", + port: 0, + fetch(request, server) { + if (server.upgrade(request, { data: undefined })) return + return new Response("simulation transport test peer", { status: 426 }) + }, + websocket: { + message(socket, message) { + const raw = String(message) + const value = { raw, request: JSON.parse(raw) as WireRequest, socket } + if (value.request.method === "simulation.handshake" && options?.handshake !== false) { + const params = value.request.params as { + readonly expectedRole: "ui" | "backend" + readonly requiredCapabilities: ReadonlyArray + readonly optionalCapabilities: ReadonlyArray + } + sendResult(socket, value.request, { + protocolVersion: 1, + role: params.expectedRole, + server: { name: "opencode", version: "test" }, + capabilities: options?.capabilities?.([...params.requiredCapabilities, ...params.optionalCapabilities]) ?? [ + ...params.requiredCapabilities, + ...params.optionalCapabilities, + ], + }) + return + } + received.push(value) + onRequest(value) + }, + }, + }) + + return { + url: `ws://127.0.0.1:${server.port}`, + received, + stop: () => server.stop(true), + } +} + +export function sendResult(socket: Bun.ServerWebSocket, request: WireRequest, result: unknown) { + socket.send(JSON.stringify({ jsonrpc: "2.0", id: request.id, result })) +} + +export function sendError( + socket: Bun.ServerWebSocket, + request: WireRequest, + message: string, + code = -32000, +) { + socket.send( + JSON.stringify({ + jsonrpc: "2.0", + id: request.id, + error: { code, message }, + }), + ) +} diff --git a/packages/drive/test/simulation/ui.test.ts b/packages/drive/test/simulation/ui.test.ts new file mode 100644 index 00000000000..e5e300ab14e --- /dev/null +++ b/packages/drive/test/simulation/ui.test.ts @@ -0,0 +1,165 @@ +import { describe, expect, it, test } from "@effect/vitest" +import { Effect } from "effect" +import { Frontend } from "../../src/client/index.js" +import * as SimulationConnector from "../../src/simulation/connector.js" +import { sendError, sendResult, startTransportPeer } from "./transport-peer.js" + +const state: Frontend.State = { + focused: { renderable: 1, editor: true }, + elements: [], +} + +const snapshot: Frontend.SemanticSnapshot = { + format: "opencode-ui-snapshot-v1", + nodes: [{ id: "prompt", role: "textbox", element: 1, focused: true }], +} + +describe("OpenCode UI simulation transport", () => { + it.live("preserves every UI call's exact JSON-RPC frame", () => + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "ui.snapshot") { + sendResult(socket, request, snapshot) + return + } + if (request.method === "ui.matches") { + sendResult(socket, request, true) + return + } + if (request.method === "ui.screenshot") { + const params = request.params as { readonly name?: string } | undefined + if (params?.name === "fail") { + sendError(socket, request, "screenshot failed") + return + } + sendResult(socket, request, `/tmp/${params?.name ?? "screenshot"}.png`) + return + } + if (request.method === "ui.recording.finish") { + sendResult(socket, request, "/tmp/recording.jsonl") + return + } + sendResult(socket, request, state) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const { rpc } = yield* SimulationConnector.ui(peer.url) + + expect(yield* rpc["ui.state"]()).toEqual(state) + expect(yield* rpc["ui.snapshot"]()).toEqual(snapshot) + expect(yield* rpc["ui.matches"]({ text: "needle" })).toBe(true) + expect(yield* rpc["ui.screenshot"](undefined)).toBe("/tmp/screenshot.png") + expect(yield* rpc["ui.screenshot"]({ name: "home" })).toBe("/tmp/home.png") + expect(yield* rpc["ui.recording.finish"]()).toBe("/tmp/recording.jsonl") + expect(yield* rpc["ui.type"]({ text: "hello" })).toEqual(state) + expect(yield* rpc["ui.press"]({ key: "x" })).toEqual(state) + expect(yield* rpc["ui.press"]({ key: "x", modifiers: { ctrl: true, shift: false } })).toEqual(state) + expect(yield* rpc["ui.press"]({ key: "escape" })).toEqual(state) + expect(yield* rpc["ui.enter"]()).toEqual(state) + expect(yield* rpc["ui.arrow"]({ direction: "left" })).toEqual(state) + expect(yield* rpc["ui.focus"]({ target: 7 })).toEqual(state) + expect(yield* rpc["ui.click"]({ target: 7, x: 3, y: 2 })).toEqual(state) + expect(yield* rpc["ui.resize"]({ cols: 120, rows: 40 })).toEqual(state) + + const error = yield* rpc["ui.screenshot"]({ name: "fail" }).pipe(Effect.flip) + expect(error).toMatchObject({ + _tag: "SimulationRequestError", + message: "screenshot failed", + method: "ui.screenshot", + }) + + expect(peer.received.map(({ request }) => request)).toEqual([ + { jsonrpc: "2.0", id: 1, method: "ui.state" }, + { jsonrpc: "2.0", id: 2, method: "ui.snapshot" }, + { + jsonrpc: "2.0", + id: 3, + method: "ui.matches", + params: { text: "needle" }, + }, + { jsonrpc: "2.0", id: 4, method: "ui.screenshot" }, + { + jsonrpc: "2.0", + id: 5, + method: "ui.screenshot", + params: { name: "home" }, + }, + { jsonrpc: "2.0", id: 6, method: "ui.recording.finish" }, + { + jsonrpc: "2.0", + id: 7, + method: "ui.type", + params: { text: "hello" }, + }, + { + jsonrpc: "2.0", + id: 8, + method: "ui.press", + params: { key: "x" }, + }, + { + jsonrpc: "2.0", + id: 9, + method: "ui.press", + params: { key: "x", modifiers: { ctrl: true, shift: false } }, + }, + { + jsonrpc: "2.0", + id: 10, + method: "ui.press", + params: { key: "escape" }, + }, + { jsonrpc: "2.0", id: 11, method: "ui.enter" }, + { + jsonrpc: "2.0", + id: 12, + method: "ui.arrow", + params: { direction: "left" }, + }, + { + jsonrpc: "2.0", + id: 13, + method: "ui.focus", + params: { target: 7 }, + }, + { + jsonrpc: "2.0", + id: 14, + method: "ui.click", + params: { target: 7, x: 3, y: 2 }, + }, + { + jsonrpc: "2.0", + id: 15, + method: "ui.resize", + params: { cols: 120, rows: 40 }, + }, + { + jsonrpc: "2.0", + id: 16, + method: "ui.screenshot", + params: { name: "fail" }, + }, + ]) + + for (const { request } of peer.received) expect(Frontend.decodeRequest(request)).toEqual(request) + }), + ) + + test("rejects schema-invalid UI requests", () => { + expect(() => Frontend.decodeRequest({ jsonrpc: "2.0", method: "ui.type", params: {} })).toThrow() + expect(() => + Frontend.decodeRequest({ + jsonrpc: "2.0", + method: "ui.arrow", + params: { direction: "diagonal" }, + }), + ).toThrow() + expect(() => + Frontend.decodeRequest({ + jsonrpc: "2.0", + method: "ui.press", + params: { key: "x", modifiers: { ctrl: "true" } }, + }), + ).toThrow() + }) +}) diff --git a/packages/drive/test/tool/controller.test.ts b/packages/drive/test/tool/controller.test.ts new file mode 100644 index 00000000000..e5a7ee618e7 --- /dev/null +++ b/packages/drive/test/tool/controller.test.ts @@ -0,0 +1,952 @@ +import { expect, it } from "@effect/vitest" +import { Deferred, Effect } from "effect" +import * as Exit from "effect/Exit" +import * as Fiber from "effect/Fiber" +import * as Scope from "effect/Scope" +import * as ToolController from "../../src/tool/controller.js" +import { Failure } from "../../src/tool/index.js" +import plugin from "../../src/tool/plugin.js" +import type { OpenCodeConfig } from "../../src/script/types.js" + +interface RegisteredTool { + readonly name: string + readonly execute: ( + input: unknown, + context: { readonly sessionID: string; readonly id: string }, + ) => Effect.Effect< + { + readonly structured: unknown + readonly content: ReadonlyArray<{ readonly type: string; readonly text: string }> + }, + unknown + > +} + +it.effect("streams progress before shell success and failure", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", ({ id, input, index, progress }) => + Effect.gen(function* () { + yield* progress(`running ${id}/${index}: ${input.command}\n`) + if (input.command === "fail") return yield* new Failure({ message: "controlled failure" }) + return { output: "controlled success\n", exit: 7 } + }), + ) + }) + const config: OpenCodeConfig = { plugins: ["existing-plugin"] } + controller.configure(config) + const plugins = config.plugins as Array + expect(plugins[0]).toBe("existing-plugin") + const injected = plugins[1] as { + package: string + options: { endpoint: string; token: string; tools: string[] } + } + expect(injected.package.startsWith("/")).toBe(true) + expect(injected.options.tools).toEqual(["shell"]) + + const invoke = (command: string) => + Effect.promise(async () => { + const response = await fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input: { command }, + context: { callID: `call_${command}` }, + }), + }) + return (await response.text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + }) + + expect(yield* invoke("succeed")).toEqual([ + { type: "progress", result: { output: "running call_succeed/0: succeed\n" } }, + { type: "success", result: { output: "controlled success\n", exit: 7 } }, + ]) + expect(yield* invoke("fail")).toEqual([ + { type: "progress", result: { output: "running call_fail/1: fail\n" } }, + { type: "failure", message: "controlled failure" }, + ]) + }), + ), +) + +it.effect("does not inject a plugin without handlers", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make() + const config: OpenCodeConfig = {} + controller.configure(config) + expect(ToolController.composeSetup(controller, undefined)).toBeUndefined() + expect(config).toEqual({}) + }), + ), +) + +it.effect("controls parallel calls independently by tool call ID", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make(["shell"]) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const shells = yield* controller.controls.control("shell") + const invoke = (id: string, command: string) => + Effect.promise(async () => { + const response = await fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ input: { command }, context: { callID: id } }), + }) + return (await response.text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + }) + + const buildResponse = yield* invoke("call_build", "bun run build").pipe(Effect.forkScoped) + const testResponse = yield* invoke("call_test", "bun run test").pipe(Effect.forkScoped) + const test = yield* shells.take("call_test") + const build = yield* shells.take("call_build") + + expect(test).toMatchObject({ id: "call_test", input: { command: "bun run test" } }) + expect(build).toMatchObject({ id: "call_build", input: { command: "bun run build" } }) + expect([build.index, test.index].sort((left, right) => left - right)).toEqual([0, 1]) + expect(yield* shells.take("call_test").pipe(Effect.flip)).toMatchObject({ + _tag: "OpenCodeDrive.ToolControlError", + message: "shell tool call already claimed: call_test", + }) + + yield* test.progress("testing\n") + yield* build.progress("building\n") + yield* test.succeed({ output: "tests passed\n", exit: 0 }) + yield* build.fail("build failed") + + expect(yield* Fiber.join(testResponse)).toEqual([ + { type: "progress", result: { output: "testing\n" } }, + { type: "success", result: { output: "tests passed\n", exit: 0 } }, + ]) + expect(yield* Fiber.join(buildResponse)).toEqual([ + { type: "progress", result: { output: "building\n" } }, + { type: "failure", message: "build failed" }, + ]) + expect(yield* test.fail("late failure").pipe(Effect.flip)).toMatchObject({ + _tag: "OpenCodeDrive.ToolControlError", + operation: "fail", + reason: "already-settled", + message: "shell tool call call_test is settled", + }) + expect(yield* test.progress("late progress\n").pipe(Effect.flip)).toMatchObject({ + _tag: "OpenCodeDrive.ToolControlError", + operation: "progress", + reason: "already-settled", + }) + const repeatedResponse = yield* invoke("call_test", "bun run test again").pipe(Effect.forkScoped) + const repeated = yield* shells.take("call_test") + expect(repeated).toMatchObject({ id: "call_test", input: { command: "bun run test again" } }) + yield* repeated.succeed({ output: "tests passed again\n", exit: 0 }) + expect(yield* Fiber.join(repeatedResponse)).toEqual([ + { type: "success", result: { output: "tests passed again\n", exit: 0 } }, + ]) + }), + ), +) + +it.effect("retains call ID ownership while rejecting concurrent duplicates", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make(["shell"]) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const shells = yield* controller.controls.control("shell") + const invoke = (command: string) => + Effect.promise(async () => { + const response = await fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input: { command }, + context: { callID: "call_same" }, + }), + }) + return (await response.text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + }) + + const firstResponse = yield* invoke("first").pipe(Effect.forkScoped) + const first = yield* shells.take("call_same") + expect(yield* invoke("second")).toEqual([{ type: "failure", message: "duplicate shell tool call ID: call_same" }]) + expect(yield* shells.take("call_same").pipe(Effect.flip)).toMatchObject({ + reason: "already-claimed", + callID: "call_same", + }) + expect(yield* invoke("third")).toEqual([{ type: "failure", message: "duplicate shell tool call ID: call_same" }]) + + yield* first.succeed({ output: "first complete\n", exit: 0 }) + yield* Fiber.join(firstResponse) + const reusedResponse = yield* invoke("reused").pipe(Effect.forkScoped) + const reused = yield* shells.take("call_same") + expect(reused.input.command).toBe("reused") + yield* reused.succeed({ output: "reused complete\n", exit: 0 }) + yield* Fiber.join(reusedResponse) + }), + ), +) + +it.effect("gives an exact call ID waiter precedence over a generic waiter", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make(["shell"]) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const shells = yield* controller.controls.control("shell") + const generic = yield* shells.take().pipe(Effect.forkScoped) + const exact = yield* shells.take("call_b").pipe(Effect.forkScoped) + const invoke = (id: string) => + Effect.promise(async () => { + const response = await fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ input: { command: id }, context: { callID: id } }), + }) + return (await response.text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + }) + const responseB = yield* invoke("call_b").pipe(Effect.forkScoped) + const responseA = yield* invoke("call_a").pipe(Effect.forkScoped) + + const callB = yield* Fiber.join(exact) + const callA = yield* Fiber.join(generic) + expect(callB.id).toBe("call_b") + expect(callA.id).toBe("call_a") + yield* callB.succeed({ output: "b\n" }) + yield* callA.succeed({ output: "a\n" }) + yield* Fiber.join(responseB) + yield* Fiber.join(responseA) + }), + ), +) + +it.effect("accepts exactly one concurrent terminal operation", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make(["shell"]) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const shells = yield* controller.controls.control("shell") + const response = yield* Effect.promise(async () => { + const request = fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ input: { command: "race" }, context: { callID: "call_race" } }), + }).then((response) => response.text()) + return { request } + }) + const call = yield* shells.take("call_race") + const start = yield* Deferred.make() + const attempts = yield* Effect.all( + [ + Deferred.await(start).pipe(Effect.andThen(call.succeed({ output: "won\n" })), Effect.exit), + Deferred.await(start).pipe(Effect.andThen(call.fail("lost")), Effect.exit), + ], + { concurrency: "unbounded" }, + ).pipe(Effect.forkChild) + yield* Deferred.succeed(start, undefined) + const exits = yield* Fiber.join(attempts) + expect(exits.filter(Exit.isSuccess)).toHaveLength(1) + expect(exits.filter(Exit.isFailure)).toHaveLength(1) + const events = (yield* Effect.promise(() => response.request)) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + expect(events).toHaveLength(1) + expect(["success", "failure"]).toContain(events[0]?.type) + }), + ), +) + +it.effect("releases an interrupted waiter and reports transport interruption", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make(["shell"]) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const shells = yield* controller.controls.control("shell") + const abandoned = yield* shells.take("call_wait").pipe(Effect.forkScoped) + yield* Fiber.interrupt(abandoned) + + const request = new AbortController() + const response = fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + signal: request.signal, + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input: { command: "wait" }, + context: { callID: "call_wait" }, + }), + }).catch(() => undefined) + const call = yield* shells.take("call_wait") + request.abort() + yield* call.awaitInterrupted() + yield* Effect.promise(() => response) + + expect(yield* call.succeed({ output: "late\n" }).pipe(Effect.flip)).toMatchObject({ + _tag: "OpenCodeDrive.ToolControlError", + message: "shell tool call call_wait is interrupted", + }) + }), + ), +) + +it.effect("rejects runtime control for tools not declared by name", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", () => Effect.succeed({ output: "legacy handler\n" })) + }) + expect(yield* controller.controls.control("shell").pipe(Effect.flip)).toMatchObject({ + _tag: "OpenCodeDrive.ToolControlError", + message: "tool is not configured for runtime control: shell", + }) + }), + ), +) + +it.effect("closes blocked runtime controls with the controller scope", () => + Effect.gen(function* () { + const scope = yield* Scope.make() + const controller = yield* ToolController.make(["shell"]).pipe(Scope.provide(scope)) + const shells = yield* controller.controls.control("shell") + const waiting = yield* shells.take("call_never").pipe(Effect.forkChild) + + yield* Scope.close(scope, Exit.void) + + expect(yield* Fiber.join(waiting).pipe(Effect.flip)).toMatchObject({ + _tag: "OpenCodeDrive.ToolControlError", + operation: "take", + reason: "controller-closed", + name: "shell", + }) + expect(yield* controller.controls.control("shell").pipe(Effect.flip)).toMatchObject({ + _tag: "OpenCodeDrive.ToolControlError", + operation: "control", + reason: "controller-closed", + name: "shell", + }) + }), +) + +it.effect("interrupts claimed calls when the controller scope closes", () => + Effect.gen(function* () { + const scope = yield* Scope.make() + const controller = yield* ToolController.make(["shell"]).pipe(Scope.provide(scope)) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const shells = yield* controller.controls.control("shell") + const response = fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input: { command: "wait" }, + context: { callID: "call_shutdown" }, + }), + }).catch(() => undefined) + const call = yield* shells.take("call_shutdown") + const interrupted = yield* call.awaitInterrupted().pipe(Effect.forkChild) + + yield* Scope.close(scope, Exit.void) + yield* Fiber.join(interrupted) + yield* Effect.promise(() => response) + + expect(yield* call.succeed({ output: "late\n" }).pipe(Effect.flip)).toMatchObject({ + _tag: "OpenCodeDrive.ToolControlError", + operation: "succeed", + reason: "controller-closed", + name: "shell", + callID: "call_shutdown", + }) + }), +) + +it.effect("routes typed webfetch, websearch, and write handlers independently", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make((tools) => { + tools.handle("webfetch", ({ input, index }) => + Effect.succeed({ output: `${index}:${input.format}:${input.url}` }), + ) + tools.handle("websearch", ({ input, index }) => + Effect.succeed({ output: `${index}:${input.query}`, provider: "exa" }), + ) + tools.handle("write", ({ input, index }) => + Effect.succeed({ output: `${index}:${input.path}:${input.content}` }), + ) + }) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string; tools: string[] } + }> + )[0]! + expect(injected.options.tools).toEqual(["webfetch", "websearch", "write"]) + + const invoke = (name: string, input: unknown) => + Effect.promise(async () => { + const response = await fetch(`${injected.options.endpoint}/execute/${name}`, { + method: "POST", + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input, + context: { callID: `call_${name}` }, + }), + }) + return (await response.text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + }) + + expect(yield* invoke("webfetch", { url: "https://example.com" })).toEqual([ + { + type: "success", + result: { output: "0:markdown:https://example.com" }, + }, + ]) + expect(yield* invoke("websearch", { query: "effect typescript" })).toEqual([ + { + type: "success", + result: { output: "0:effect typescript", provider: "exa" }, + }, + ]) + expect(yield* invoke("write", { path: "src/a.ts", content: "export const a = 1\n" })).toEqual([ + { + type: "success", + result: { output: "0:src/a.ts:export const a = 1\n" }, + }, + ]) + }), + ), +) + +it.effect("settles background shells immediately and retains their completion", () => + Effect.scoped( + Effect.gen(function* () { + const release = Promise.withResolvers() + let interrupted = false + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", ({ input, progress }) => + Effect.gen(function* () { + yield* progress("still running\n") + yield* Effect.promise(() => release.promise) + return { output: `${input.command} complete\n`, exit: 0 } + }).pipe(Effect.onInterrupt(() => Effect.sync(() => (interrupted = true)))), + ) + }) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const headers = { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + } + const started = yield* Effect.promise(async () => { + const response = await fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers, + body: JSON.stringify({ + input: { command: "compile", background: true }, + context: { callID: "call_background" }, + }), + }) + return (await response.text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + }) + expect(started).toEqual([ + { + type: "success", + result: { + output: "The command was moved to the background.", + shellID: "call_background", + status: "running", + }, + }, + ]) + expect(interrupted).toBe(false) + + const completion = fetch(`${injected.options.endpoint}/background/call_background`, { headers }).then( + (response) => response.json(), + ) + release.resolve() + expect(yield* Effect.promise(() => completion)).toEqual({ + shellID: "call_background", + command: "compile", + state: "completed", + output: "compile complete\n", + }) + }), + ), +) + +it.effect("controls a background shell after its launch response", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make(["shell"]) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const headers = { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + } + const shells = yield* controller.controls.control("shell") + const started = yield* Effect.promise(async () => { + const response = await fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers, + body: JSON.stringify({ + input: { command: "compile", background: true }, + context: { callID: "call_controlled_background" }, + }), + }) + return (await response.text()) + .trim() + .split("\n") + .map((line) => JSON.parse(line)) + }) + expect(started).toEqual([ + { + type: "success", + result: { + output: "The command was moved to the background.", + shellID: "call_controlled_background", + status: "running", + }, + }, + ]) + + const shell = yield* shells.take("call_controlled_background") + yield* shell.progress("compiling\n") + const completion = fetch(`${injected.options.endpoint}/background/call_controlled_background`, { headers }).then( + (response) => response.json(), + ) + yield* shell.succeed({ output: "compile complete\n", exit: 0 }) + expect(yield* Effect.promise(() => completion)).toEqual({ + shellID: "call_controlled_background", + command: "compile", + state: "completed", + output: "compile complete\n", + }) + }), + ), +) + +it.effect("reports background failures with retained progress output", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", ({ progress }) => + Effect.gen(function* () { + yield* progress("partial output\n") + return yield* new Failure({ message: "controlled background failure" }) + }), + ) + }) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const headers = { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + } + yield* Effect.promise(() => + fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers, + body: JSON.stringify({ + input: { command: "fail", background: true }, + context: { callID: "call_failure" }, + }), + }).then((response) => response.text()), + ) + const completion = yield* Effect.promise(() => + fetch(`${injected.options.endpoint}/background/call_failure`, { headers }).then((response) => response.json()), + ) + expect(completion).toEqual({ + shellID: "call_failure", + command: "fail", + state: "error", + output: "partial output\ncontrolled background failure", + }) + }), + ), +) + +it.effect("bounds retained background output", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", ({ progress }) => + Effect.gen(function* () { + yield* progress("x".repeat(1024 * 1024)) + return { output: "unreachable" } + }), + ) + }) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const headers = { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + } + yield* Effect.promise(() => + fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers, + body: JSON.stringify({ + input: { command: "verbose", background: true }, + context: { callID: "call_verbose" }, + }), + }).then((response) => response.text()), + ) + const completion = yield* Effect.promise(() => + fetch(`${injected.options.endpoint}/background/call_verbose`, { headers }).then((response) => response.json()), + ) + expect(completion).toEqual({ + shellID: "call_verbose", + command: "verbose", + state: "error", + output: "Drive tool event exceeds 1048576 bytes", + }) + }), + ), +) + +it.effect("notifies OpenCode when a registered background shell completes", () => + Effect.scoped( + Effect.gen(function* () { + const release = Promise.withResolvers() + const notified = Promise.withResolvers() + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", () => + Effect.gen(function* () { + yield* Effect.promise(() => release.promise) + return { output: "plugin completion\n", exit: 0 } + }), + ) + }) + const config: OpenCodeConfig = {} + controller.configure(config) + const options = (config.plugins as Array<{ options: unknown }>)[0]!.options + let shell: RegisteredTool | undefined + yield* plugin.effect({ + options, + tool: { + transform: (register: (tools: { add: (tool: RegisteredTool) => void }) => void) => + Effect.sync(() => + register({ + add: (tool) => { + if (tool.name === "shell") shell = tool + }, + }), + ), + }, + session: { + synthetic: (input: unknown) => Effect.sync(() => notified.resolve(input)), + }, + }) + if (shell === undefined) return yield* Effect.die(new Error("shell tool was not registered")) + + const started = yield* shell.execute( + { command: "plugin", background: true }, + { sessionID: "ses_plugin", id: "call_plugin" }, + ) + expect(started).toEqual({ + output: { + output: "The command was moved to the background.", + shellID: "call_plugin", + status: "running", + }, + content: [ + { type: "text", text: "The command was moved to the background." }, + { + type: "text", + text: "You will be notified automatically when the command finishes. DO NOT sleep, poll, or proactively check on its progress.", + }, + ], + }) + + release.resolve() + expect(yield* Effect.promise(() => notified.promise)).toEqual({ + id: "msg_call_plugin_completion", + sessionID: "ses_plugin", + text: '\nplugin completion\n\n', + description: "plugin", + metadata: { source: "shell", state: "completed" }, + }) + }), + ), +) + +it.effect("cancels retained background shells when the controller stops", () => + Effect.gen(function* () { + const started = Promise.withResolvers() + const interrupted = Promise.withResolvers() + const scope = yield* Scope.make() + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", () => + Effect.sync(() => started.resolve()).pipe( + Effect.andThen(Effect.never), + Effect.onInterrupt(() => Effect.sync(() => interrupted.resolve())), + ), + ) + }).pipe(Scope.provide(scope)) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + yield* Effect.promise(() => + fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input: { command: "wait", background: true }, + context: { callID: "call_shutdown" }, + }), + }).then((response) => response.text()), + ) + yield* Effect.promise(() => started.promise) + yield* Scope.close(scope, Exit.void) + yield* Effect.promise(() => interrupted.promise) + }), +) + +it.effect("waits for foreground handler finalizers when the controller stops", () => + Effect.gen(function* () { + const started = Promise.withResolvers() + const finalizing = Promise.withResolvers() + const release = Promise.withResolvers() + let finalized = false + const scope = yield* Scope.make() + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", () => + Effect.sync(() => started.resolve()).pipe( + Effect.andThen(Effect.never), + Effect.onInterrupt(() => + Effect.sync(() => finalizing.resolve()).pipe( + Effect.andThen(Effect.promise(() => release.promise)), + Effect.andThen( + Effect.sync(() => { + finalized = true + }), + ), + ), + ), + ), + ) + }).pipe(Scope.provide(scope)) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const response = fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input: { command: "wait" }, + context: { callID: "call_foreground_shutdown" }, + }), + }) + .then((response) => response.text()) + .catch(() => undefined) + yield* Effect.promise(() => started.promise) + let closed = false + const close = Effect.runPromise(Scope.close(scope, Exit.void)).then(() => { + closed = true + }) + yield* Effect.promise(() => finalizing.promise) + expect(closed).toBe(false) + expect(finalized).toBe(false) + release.resolve() + yield* Effect.promise(() => close) + yield* Effect.promise(() => response) + expect(closed).toBe(true) + expect(finalized).toBe(true) + }), +) + +it.effect("interrupts a handler when its transport disconnects", () => + Effect.scoped( + Effect.gen(function* () { + const started = Promise.withResolvers() + const interrupted = Promise.withResolvers() + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", () => + Effect.sync(() => started.resolve()).pipe( + Effect.andThen(Effect.never), + Effect.onInterrupt(() => Effect.sync(() => interrupted.resolve())), + ), + ) + }) + const config: OpenCodeConfig = {} + controller.configure(config) + const injected = ( + config.plugins as Array<{ + options: { endpoint: string; token: string } + }> + )[0]! + const request = new AbortController() + const response = fetch(`${injected.options.endpoint}/execute/shell`, { + method: "POST", + signal: request.signal, + headers: { + authorization: `Bearer ${injected.options.token}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + input: { command: "wait" }, + context: { callID: "call_disconnect" }, + }), + }).catch(() => undefined) + yield* Effect.promise(() => started.promise) + request.abort() + yield* Effect.promise(() => interrupted.promise) + yield* Effect.promise(() => response) + }), + ), +) + +it.effect("interrupts a handler with its plugin execution", () => + Effect.scoped( + Effect.gen(function* () { + const started = Promise.withResolvers() + const interrupted = Promise.withResolvers() + const controller = yield* ToolController.make((tools) => { + tools.handle("shell", () => + Effect.sync(() => started.resolve()).pipe( + Effect.andThen(Effect.never), + Effect.onInterrupt(() => Effect.sync(() => interrupted.resolve())), + ), + ) + }) + const config: OpenCodeConfig = {} + controller.configure(config) + const options = (config.plugins as Array<{ options: unknown }>)[0]!.options + let shell: RegisteredTool | undefined + yield* plugin.effect({ + options, + tool: { + transform: (register: (tools: { add: (tool: RegisteredTool) => void }) => void) => + Effect.sync(() => + register({ + add: (tool) => { + if (tool.name === "shell") shell = tool + }, + }), + ), + }, + session: { + synthetic: () => Effect.void, + }, + }) + if (shell === undefined) return yield* Effect.die(new Error("shell tool was not registered")) + + const execution = yield* shell + .execute({ command: "wait" }, { sessionID: "ses_interrupt", id: "call_interrupt" }) + .pipe(Effect.forkScoped) + yield* Effect.promise(() => started.promise) + yield* Fiber.interrupt(execution) + yield* Effect.promise(() => interrupted.promise) + }), + ), +) diff --git a/packages/drive/test/tool/producer.test.ts b/packages/drive/test/tool/producer.test.ts new file mode 100644 index 00000000000..e62e41b72e4 --- /dev/null +++ b/packages/drive/test/tool/producer.test.ts @@ -0,0 +1,1393 @@ +import { expect, it } from "@effect/vitest" +import { Deferred, Effect, Exit, Fiber, Scope } from "effect" +import * as SimulationConnector from "../../src/simulation/connector.js" +import * as ToolProducer from "../../src/tool/producer.js" +import type { Progress } from "../../src/tool/types.js" +import { sendError, sendResult, startTransportPeer } from "../simulation/transport-peer.js" + +const registration = { + name: "lookup", + description: "Look up a value", + inputSchema: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + additionalProperties: false, + }, + outputSchema: { + type: "object", + properties: { answer: { type: "number" } }, + required: ["answer"], + }, + options: { codemode: false }, +} as const + +const invocation = { + id: "tool_1", + name: "lookup", + input: { query: "meaning" }, + context: { + sessionID: "ses_tools", + agent: "build", + messageID: "msg_tools", + id: "call_lookup", + }, +} as const + +function notify(socket: Bun.ServerWebSocket, method: "tool.invocation" | "tool.cancel", params: unknown) { + socket.send(JSON.stringify({ jsonrpc: "2.0", method, params })) +} + +it.live("attaches, sequences progress, and settles one dynamic invocation", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => { + sendResult(socket, request, request.method === "tool.attach" ? { attached: true } : { ok: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + + yield* controller.controls.attach({ tools: [registration] }) + const socket = peer.received[0].socket + notify(socket, "tool.invocation", invocation) + const call = yield* controller.controls.take("call_lookup") + + expect(call).toMatchObject({ + id: invocation.id, + name: invocation.name, + input: invocation.input, + context: { + sessionID: invocation.context.sessionID, + agent: invocation.context.agent, + messageID: invocation.context.messageID, + callID: invocation.context.id, + }, + }) + yield* call.progress({ + structured: { phase: "searching" }, + content: [{ type: "text", text: "Searching" }], + }) + yield* call.progress({ structured: { phase: "done" } }) + yield* call.finish({ + structured: { answer: 42 }, + content: [{ type: "text", text: "42" }], + }) + + expect(peer.received.map(({ request }) => request)).toEqual([ + { + jsonrpc: "2.0", + id: 1, + method: "tool.attach", + params: { tools: [registration] }, + }, + { + jsonrpc: "2.0", + id: 2, + method: "tool.update", + params: { + id: "tool_1", + sequence: 0, + update: { + structured: { phase: "searching" }, + content: [{ type: "text", text: "Searching" }], + }, + }, + }, + { + jsonrpc: "2.0", + id: 3, + method: "tool.update", + params: { + id: "tool_1", + sequence: 1, + update: { structured: { phase: "done" } }, + }, + }, + { + jsonrpc: "2.0", + id: 4, + method: "tool.finish", + params: { + id: "tool_1", + output: { + structured: { answer: 42 }, + content: [{ type: "text", text: "42" }], + }, + }, + }, + ]) + expect(yield* call.fail("late").pipe(Effect.flip)).toMatchObject({ + _tag: "OpenCodeDrive.ToolLifecycleError", + operation: "fail", + reason: "already-settled", + callID: "call_lookup", + }) + yield* controller.settle + expect(yield* controller.controls.attach({ tools: [registration] }).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "controller-closed", + }) + }), + ), +) + +it.live("fails settlement after a completed invocation ID is reused", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => + sendResult(socket, request, request.method === "tool.attach" ? { attached: true } : { ok: true }), + ) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + const socket = peer.received[0].socket + notify(socket, "tool.invocation", invocation) + const call = yield* controller.controls.take("call_lookup") + yield* call.finish({ structured: { answer: 42 }, content: [] }) + notify(socket, "tool.invocation", { + ...invocation, + input: { query: "different" }, + }) + const failure = yield* controller.failure.pipe(Effect.flip) + + expect(yield* controller.settle.pipe(Effect.flip)).toEqual(failure) + }), + ), +) + +it.live("observes cancellation and rejects terminal work after it wins", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => + sendResult(socket, request, request.method === "tool.attach" ? { attached: true } : { ok: true }), + ) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + const socket = peer.received[0].socket + notify(socket, "tool.invocation", invocation) + notify(socket, "tool.cancel", { id: "tool_1", reason: "interrupted" }) + yield* Effect.sleep(10) + const call = yield* controller.controls.take("call_lookup") + const cancelled = yield* call.awaitCancelled().pipe(Effect.forkScoped) + + expect(yield* Fiber.join(cancelled)).toEqual({ + id: "tool_1", + reason: "interrupted", + }) + expect(yield* call.finish({ structured: 42, content: [] }).pipe(Effect.flip)).toMatchObject({ + operation: "finish", + reason: "cancelled", + callID: "call_lookup", + }) + yield* controller.settle + }), + ), +) + +it.live("bounds retained unclaimed cancellations", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, { attached: true })) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + const latest = yield* controller.controls.take("call_257").pipe(Effect.forkScoped) + const socket = peer.received[0].socket + + for (let index = 0; index < 258; index++) { + notify(socket, "tool.invocation", { + ...invocation, + id: `tool_${index}`, + context: { ...invocation.context, id: `call_${index}` }, + }) + notify(socket, "tool.cancel", { + id: `tool_${index}`, + reason: "interrupted", + }) + } + + const latestCall = yield* Fiber.join(latest) + yield* latestCall.awaitCancelled() + const retained = yield* controller.controls.take("call_256") + expect(yield* retained.awaitCancelled()).toMatchObject({ id: "tool_256" }) + const evicted = yield* controller.controls.take("call_0").pipe(Effect.forkScoped) + yield* Effect.yieldNow + expect(evicted.pollUnsafe()).toBeUndefined() + yield* Fiber.interrupt(evicted) + yield* controller.settle + }), + ), +) + +it.live("settles concurrent invocations in controlled reverse order", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => + sendResult(socket, request, request.method === "tool.attach" ? { attached: true } : { ok: true }), + ) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + const socket = peer.received[0].socket + notify(socket, "tool.invocation", invocation) + notify(socket, "tool.invocation", { + ...invocation, + id: "tool_2", + input: { query: "second" }, + context: { ...invocation.context, id: "call_second" }, + }) + + const second = yield* controller.controls.take("call_second") + const first = yield* controller.controls.take("call_lookup") + const start = yield* Deferred.make() + const attempts = yield* Effect.all( + [ + Deferred.await(start).pipe(Effect.andThen(second.finish({ structured: 2, content: [] })), Effect.exit), + Deferred.await(start).pipe(Effect.andThen(second.fail("second failed")), Effect.exit), + ], + { concurrency: "unbounded" }, + ).pipe(Effect.forkScoped) + yield* Deferred.succeed(start, undefined) + const exits = yield* Fiber.join(attempts) + expect(exits.filter(Exit.isSuccess)).toHaveLength(1) + expect(exits.filter(Exit.isFailure)).toHaveLength(1) + yield* first.fail("first failed") + + const terminals = peer.received.filter( + ({ request }) => request.method === "tool.finish" || request.method === "tool.fail", + ) + expect(terminals).toHaveLength(2) + expect(terminals[0]?.request.params).toMatchObject({ id: "tool_2" }) + expect(terminals[1]?.request).toMatchObject({ + method: "tool.fail", + params: { id: "tool_1", message: "first failed" }, + }) + yield* controller.settle + }), + ), +) + +it.live("reattaches the desired set and deduplicates replay after reconnect", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach") { + attaches++ + if (attaches === 2) notify(socket, "tool.invocation", invocation) + sendResult(socket, request, { attached: true }) + return + } + sendResult(socket, request, { ok: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + notify(peer.received[0].socket, "tool.invocation", invocation) + const call = yield* controller.controls.take("call_lookup") + + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + const secondScope = yield* Scope.make() + const second = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(secondScope)) + const secondAttachment = yield* controller.connect(second) + + expect(yield* controller.controls.take("call_lookup").pipe(Effect.flip)).toMatchObject({ + reason: "already-claimed", + }) + yield* call.finish({ + structured: { answer: 42 }, + content: [{ type: "text", text: "42" }], + }) + expect(attaches).toBe(2) + expect(peer.received.filter(({ request }) => request.method === "tool.finish")).toHaveLength(1) + yield* controller.settle + yield* secondAttachment.detach() + yield* Scope.close(secondScope, Exit.void) + yield* controller.endGeneration + yield* controller.shutdown + }), + ), +) + +it.live("replays a replacement intent started while disconnected", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, { attached: true })) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + + const replacement = { + ...registration, + name: "search", + description: "Search for a value", + } + const replacing = yield* controller.controls.attach({ tools: [replacement] }).pipe(Effect.forkScoped) + yield* Effect.yieldNow + const secondScope = yield* Scope.make() + const second = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(secondScope)) + const secondAttachment = yield* controller.connect(second) + yield* Fiber.join(replacing) + + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [replacement] }, { tools: [replacement] }]) + yield* secondAttachment.detach() + yield* Scope.close(secondScope, Exit.void) + }), + ), +) + +it.live("preserves a replacement intent when its acknowledgement is lost", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const replacement = { + ...registration, + name: "search", + description: "Search for a value", + } + const replacementInvocation = { + ...invocation, + id: "tool_2", + name: "search", + context: { ...invocation.context, id: "call_search" }, + } + const firstReplacement = yield* Deferred.make() + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach") { + attaches++ + if (attaches === 2) { + notify(socket, "tool.invocation", replacementInvocation) + Deferred.doneUnsafe(firstReplacement, Effect.void) + socket.close() + return + } + if (attaches === 3) notify(socket, "tool.invocation", replacementInvocation) + sendResult(socket, request, { attached: true }) + return + } + sendResult(socket, request, { ok: true }) + }) + yield* Effect.addFinalizer(() => + Effect.sync(() => { + void peer.stop() + }), + ) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + + const replacing = yield* controller.controls.attach({ tools: [replacement] }).pipe(Effect.forkScoped) + yield* Deferred.await(firstReplacement) + yield* first.closed + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + const secondScope = yield* Scope.make() + const second = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(secondScope)) + const secondAttachment = yield* controller.connect(second) + yield* Fiber.join(replacing) + const call = yield* controller.controls.take("call_search") + yield* call.fail("finished") + + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([ + { tools: [registration] }, + { tools: [replacement] }, + { tools: [replacement] }, + { tools: [replacement] }, + ]) + yield* secondAttachment.detach() + yield* Scope.close(secondScope, Exit.void) + yield* controller.endGeneration + yield* controller.shutdown + }), + ), +) + +it.live("restores the acknowledged set after a rejected replacement", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const replacement = { + ...registration, + name: "search", + description: "Search for a value", + } + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach" && ++attaches === 2) { + sendError(socket, request, "replacement rejected") + return + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + expect(yield* controller.controls.attach({ tools: [replacement] }).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "rejected", + }) + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + const secondScope = yield* Scope.make() + const second = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(secondScope)) + const secondAttachment = yield* controller.connect(second) + + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [replacement] }, { tools: [registration] }]) + yield* secondAttachment.detach() + yield* Scope.close(secondScope, Exit.void) + }), + ), +) + +it.live("rejects a disconnected replacement without poisoning relaunch", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const replacement = { + ...registration, + name: "search", + description: "Search for a value", + } + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach" && ++attaches === 2) { + sendError(socket, request, "replacement rejected") + return + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + + const replacing = yield* controller.controls.attach({ tools: [replacement] }).pipe(Effect.forkScoped) + yield* Effect.yieldNow + const rejectedScope = yield* Scope.make() + const rejectedBackend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(rejectedScope)) + expect(yield* controller.connect(rejectedBackend).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "rejected", + }) + expect(yield* Fiber.join(replacing).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "rejected", + }) + yield* Scope.close(rejectedScope, Exit.void) + + const recoveredScope = yield* Scope.make() + const recovered = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(recoveredScope)) + const recoveredAttachment = yield* controller.connect(recovered) + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [replacement] }, { tools: [registration] }]) + yield* recoveredAttachment.detach() + yield* Scope.close(recoveredScope, Exit.void) + }), + ), +) + +it.live("rejects malformed lifecycle acknowledgements without retrying", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, { attached: "invalid" })) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + const attachment = yield* controller.connect(backend) + + expect(yield* controller.controls.attach({ tools: [registration] }).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "rejected", + }) + expect(peer.received.filter(({ request }) => request.method === "tool.attach")).toHaveLength(1) + yield* attachment.detach() + const recovered = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + yield* controller.connect(recovered) + expect(peer.received.filter(({ request }) => request.method === "tool.attach")).toHaveLength(1) + }), + ), +) + +it.live("rejects a malformed disconnected replacement and restores the acknowledged set", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const replacement = { + ...registration, + name: "search", + description: "Search for a value", + } + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach" && ++attaches === 2) { + sendResult(socket, request, { attached: "invalid" }) + return + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + + const replacing = yield* controller.controls.attach({ tools: [replacement] }).pipe(Effect.forkScoped) + const rejectedScope = yield* Scope.make() + const rejected = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(rejectedScope)) + expect(yield* controller.connect(rejected).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "rejected", + }) + expect(yield* Fiber.join(replacing).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "rejected", + }) + yield* Scope.close(rejectedScope, Exit.void) + + const recoveredScope = yield* Scope.make() + const recovered = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(recoveredScope)) + const recoveredAttachment = yield* controller.connect(recovered) + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [replacement] }, { tools: [registration] }]) + yield* recoveredAttachment.detach() + yield* Scope.close(recoveredScope, Exit.void) + }), + ), +) + +it.live("rejects a disconnected replacement after an invalid protocol response", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const replacement = { + ...registration, + name: "search", + description: "Search for a value", + } + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach" && ++attaches === 2) { + socket.send("not-json") + return + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + + const replacing = yield* controller.controls.attach({ tools: [replacement] }).pipe(Effect.forkScoped) + const rejectedScope = yield* Scope.make() + const rejected = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(rejectedScope)) + expect(yield* controller.connect(rejected).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "rejected", + }) + expect(yield* Fiber.join(replacing).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "rejected", + }) + yield* Scope.close(rejectedScope, Exit.void) + }), + ), +) + +it.live("drains queued invocations before reporting settlement", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach") { + attaches++ + if (attaches === 2) notify(socket, "tool.invocation", invocation) + sendResult(socket, request, { attached: true }) + return + } + sendResult(socket, request, { ok: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + + expect(yield* controller.settle.pipe(Effect.flip)).toMatchObject({ + operation: "take", + reason: "rejected", + message: expect.stringContaining("1 dynamic tool invocation"), + }) + const call = yield* controller.controls.take("call_lookup") + yield* call.fail("finished") + yield* controller.settle + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [] }]) + }), + ), +) + +it.live("rolls interrupted replacement history back to the acknowledged set", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const interruptedStarted = yield* Deferred.make() + const interrupted = { + ...registration, + name: "search", + description: "Search for a value", + } + const rejected = { + ...registration, + name: "fetch", + description: "Fetch a value", + } + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach") { + attaches++ + if (attaches === 2) { + Deferred.doneUnsafe(interruptedStarted, Effect.void) + return + } + if (attaches === 3) { + sendError(socket, request, "replacement rejected") + return + } + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + + const replacing = yield* controller.controls.attach({ tools: [interrupted] }).pipe(Effect.forkScoped) + yield* Deferred.await(interruptedStarted) + yield* Fiber.interrupt(replacing) + expect(yield* controller.controls.attach({ tools: [rejected] }).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "rejected", + }) + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + + const recoveredScope = yield* Scope.make() + const recovered = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(recoveredScope)) + const recoveredAttachment = yield* controller.connect(recovered) + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [interrupted] }, { tools: [rejected] }, { tools: [registration] }]) + yield* recoveredAttachment.detach() + yield* Scope.close(recoveredScope, Exit.void) + }), + ), +) + +it.live("fails settlement after the inbound event stream fails", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, { attached: true })) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + notify(peer.received[0].socket, "tool.invocation", { + ...invocation, + id: 1, + }) + const streamFailure = yield* controller.failure.pipe(Effect.flip) + + expect(yield* controller.settle.pipe(Effect.flip)).toEqual(streamFailure) + expect(peer.received.filter(({ request }) => request.method === "tool.attach")).toHaveLength(1) + }), + ), +) + +it.live("settles without a backend after its generation ends", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, { attached: true })) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backendScope = yield* Scope.make() + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(backendScope)) + const controller = yield* ToolProducer.make(new Set()) + const attachment = yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + yield* attachment.detach() + yield* Scope.close(backendScope, Exit.void) + yield* controller.endGeneration + + yield* controller.settle + }), + ), +) + +it.live("settles when the generation ends during its clear request", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const clearStarted = yield* Deferred.make() + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach" && ++attaches === 2) { + Deferred.doneUnsafe(clearStarted, Effect.void) + return + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backendScope = yield* Scope.make() + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(backendScope)) + const controller = yield* ToolProducer.make(new Set()) + const attachment = yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + + const settling = yield* controller.settle.pipe(Effect.forkScoped) + yield* Deferred.await(clearStarted) + yield* attachment.detach() + yield* controller.endGeneration + yield* Scope.close(backendScope, Exit.void) + + yield* Fiber.join(settling) + }), + ), +) + +it.live("reconnects when the backend disconnects during settlement", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const clearInterrupted = yield* Deferred.make() + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach" && ++attaches === 2) { + Deferred.doneUnsafe(clearInterrupted, Effect.void) + socket.close() + return + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => + Effect.sync(() => { + void peer.stop() + }), + ) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + + const settling = yield* controller.settle.pipe(Effect.forkScoped) + yield* Deferred.await(clearInterrupted) + yield* first.closed + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + const recoveredScope = yield* Scope.make() + const recovered = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(recoveredScope)) + const recoveredAttachment = yield* controller.connect(recovered) + + yield* Fiber.join(settling) + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [] }, { tools: [] }, { tools: [] }]) + yield* recoveredAttachment.detach() + yield* Scope.close(recoveredScope, Exit.void) + }), + ), +) + +it.live("retries the final event barrier after a disconnect", () => + Effect.scoped( + Effect.gen(function* () { + let flushes = 0 + const finalBarrierStarted = yield* Deferred.make() + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, { attached: true })) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const blocked = { + ...first, + flushToolEvents: () => { + flushes++ + return flushes === 2 + ? Deferred.succeed(finalBarrierStarted, undefined).pipe(Effect.andThen(Effect.never)) + : first.flushToolEvents() + }, + } + const firstAttachment = yield* controller.connect(blocked) + yield* controller.controls.attach({ tools: [registration] }) + + const settling = yield* controller.settle.pipe(Effect.forkScoped) + yield* Deferred.await(finalBarrierStarted) + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + yield* Effect.yieldNow + expect(settling.pollUnsafe()).toBeUndefined() + + const recoveredScope = yield* Scope.make() + const recovered = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(recoveredScope)) + const recoveredAttachment = yield* controller.connect(recovered) + yield* Fiber.join(settling) + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [] }, { tools: [] }]) + yield* recoveredAttachment.detach() + yield* Scope.close(recoveredScope, Exit.void) + }), + ), +) + +it.live("rejects a backend connection after terminal settlement", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, { attached: true })) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const controller = yield* ToolProducer.make(new Set()) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + yield* controller.endGeneration + yield* controller.settle + + const nextScope = yield* Scope.make() + const next = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(nextScope)) + expect(yield* controller.connect(next).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "controller-closed", + }) + expect(peer.received.filter(({ request }) => request.method === "tool.attach")).toHaveLength(1) + yield* Scope.close(nextScope, Exit.void) + }), + ), +) + +it.effect("closes take waiters and backend creation after settlement", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolProducer.make(new Set()) + const waiting = yield* controller.controls.take().pipe(Effect.forkScoped) + yield* controller.settle + + expect(yield* Fiber.join(waiting).pipe(Effect.flip)).toMatchObject({ + operation: "take", + reason: "controller-closed", + }) + expect(yield* controller.controls.take().pipe(Effect.flip)).toMatchObject({ + operation: "take", + reason: "controller-closed", + }) + let evaluated = false + const backend = Effect.sync(() => { + evaluated = true + throw new Error("backend factory was evaluated") + }) + expect(yield* controller.connectFrom(backend).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "controller-closed", + }) + expect(evaluated).toBe(false) + }), + ), +) + +it.live("settles after a backend connection that was already in progress", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const replayStarted = yield* Deferred.make() + const clearStarted = yield* Deferred.make() + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach") { + attaches++ + if (attaches === 2) { + Deferred.doneUnsafe(replayStarted, Effect.void) + return + } + if (attaches === 3) Deferred.doneUnsafe(clearStarted, Effect.void) + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + yield* firstAttachment.detach() + yield* controller.endGeneration + yield* Scope.close(firstScope, Exit.void) + + const nextScope = yield* Scope.make() + const next = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(nextScope)) + const connecting = yield* controller.connect(next).pipe(Effect.forkScoped) + yield* Deferred.await(replayStarted) + const settling = yield* controller.settle.pipe(Effect.forkScoped) + const replay = peer.received.filter(({ request }) => request.method === "tool.attach")[1] + if (replay === undefined) return yield* Effect.die(new Error("missing replay attachment request")) + sendResult(replay.socket, replay.request, { attached: true }) + yield* Deferred.await(clearStarted) + + const nextAttachment = yield* Fiber.join(connecting) + yield* Fiber.join(settling) + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [registration] }, { tools: [] }]) + yield* nextAttachment.detach() + yield* Scope.close(nextScope, Exit.void) + }), + ), +) + +it.live("drains a reconnect that finishes during settlement commit", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + let flushes = 0 + const firstDrained = yield* Deferred.make() + const releaseDrain = yield* Deferred.make() + const staleInvocation = { + ...invocation, + id: "tool_stale", + context: { ...invocation.context, id: "call_stale" }, + } + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach") { + attaches++ + if (attaches === 3) notify(socket, "tool.invocation", staleInvocation) + } + sendResult(socket, request, request.method === "tool.attach" ? { attached: true } : { ok: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const blocked = { + ...first, + flushToolEvents: () => { + flushes++ + return first + .flushToolEvents() + .pipe( + Effect.andThen( + flushes === 1 + ? Deferred.succeed(firstDrained, undefined).pipe(Effect.andThen(Deferred.await(releaseDrain))) + : Effect.void, + ), + ) + }, + } + const firstAttachment = yield* controller.connect(blocked) + yield* controller.controls.attach({ tools: [registration] }) + + const settling = yield* controller.settle.pipe(Effect.forkScoped) + yield* Deferred.await(firstDrained) + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + const nextScope = yield* Scope.make() + const next = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(nextScope)) + const nextAttachment = yield* controller.connect(next) + yield* Deferred.succeed(releaseDrain, undefined) + + expect(yield* Fiber.join(settling).pipe(Effect.flip)).toMatchObject({ + operation: "take", + reason: "rejected", + message: expect.stringContaining("1 dynamic tool invocation"), + }) + const stale = yield* controller.controls.take("call_stale") + yield* stale.fail("finished") + yield* controller.settle + yield* nextAttachment.detach() + yield* Scope.close(nextScope, Exit.void) + }), + ), +) + +it.live("serializes settlement after interrupting an in-flight replacement", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const replacementStarted = yield* Deferred.make() + const clearStarted = yield* Deferred.make() + const replacement = { + ...registration, + name: "search", + description: "Search for a value", + } + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach") { + attaches++ + if (attaches === 2) { + Deferred.doneUnsafe(replacementStarted, Effect.void) + return + } + if (attaches === 3) Deferred.doneUnsafe(clearStarted, Effect.void) + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + + const replacing = yield* controller.controls.attach({ tools: [replacement] }).pipe(Effect.forkScoped) + yield* Deferred.await(replacementStarted) + const settling = yield* controller.settle.pipe(Effect.forkScoped) + yield* Deferred.await(clearStarted) + + expect(yield* Fiber.join(replacing).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "controller-closed", + }) + yield* Fiber.join(settling) + expect( + peer.received.filter(({ request }) => request.method === "tool.attach").map(({ request }) => request.params), + ).toEqual([{ tools: [registration] }, { tools: [replacement] }, { tools: [] }]) + }), + ), +) + +it.live("releases a disconnected replacement when its generation ends", () => + Effect.scoped( + Effect.gen(function* () { + let attaches = 0 + const replacementStarted = yield* Deferred.make() + const replacement = { + ...registration, + name: "search", + description: "Search for a value", + } + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.attach" && ++attaches === 2) { + Deferred.doneUnsafe(replacementStarted, Effect.void) + socket.close() + return + } + sendResult(socket, request, { attached: true }) + }) + yield* Effect.addFinalizer(() => + Effect.sync(() => { + void peer.stop() + }), + ) + const backendScope = yield* Scope.make() + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(backendScope)) + const controller = yield* ToolProducer.make(new Set()) + const attachment = yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + + const replacing = yield* controller.controls.attach({ tools: [replacement] }).pipe(Effect.forkScoped) + yield* Deferred.await(replacementStarted) + yield* backend.closed + yield* attachment.detach() + yield* Scope.close(backendScope, Exit.void) + yield* controller.endGeneration + yield* controller.settle + + expect(yield* Fiber.join(replacing).pipe(Effect.flip)).toMatchObject({ + operation: "attach", + reason: "controller-closed", + }) + }), + ), +) + +it.effect("rejects a malformed take call ID", () => + Effect.scoped( + Effect.gen(function* () { + const controller = yield* ToolProducer.make(new Set()) + expect(yield* controller.controls.take(null as unknown as string).pipe(Effect.flip)).toMatchObject({ + operation: "take", + reason: "rejected", + }) + }), + ), +) + +it.live("retries in-flight progress after reconnect without advancing its sequence", () => + Effect.scoped( + Effect.gen(function* () { + let updates = 0 + const firstUpdate = yield* Deferred.make() + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.update" && ++updates === 1) { + Deferred.doneUnsafe(firstUpdate, Effect.void) + socket.close() + return + } + sendResult(socket, request, request.method === "tool.attach" ? { attached: true } : { ok: true }) + }) + yield* Effect.addFinalizer(() => + Effect.sync(() => { + // Bun does not resolve server.stop after this peer initiates a WebSocket close. + void peer.stop() + }), + ) + const controller = yield* ToolProducer.make(new Set()) + const firstScope = yield* Scope.make() + const first = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(firstScope)) + const firstAttachment = yield* controller.connect(first) + yield* controller.controls.attach({ tools: [registration] }) + notify(peer.received[0].socket, "tool.invocation", invocation) + const call = yield* controller.controls.take("call_lookup") + + const progress = yield* call.progress({ structured: { phase: "searching" } }).pipe(Effect.forkScoped) + yield* Deferred.await(firstUpdate) + yield* first.closed + yield* firstAttachment.detach() + yield* Scope.close(firstScope, Exit.void) + const secondScope = yield* Scope.make() + const second = yield* SimulationConnector.backend(peer.url, { + attach: false, + }).pipe(Scope.provide(secondScope)) + const secondAttachment = yield* controller.connect(second) + yield* Fiber.join(progress) + yield* call.fail("finished") + + expect( + peer.received.filter(({ request }) => request.method === "tool.update").map(({ request }) => request.params), + ).toEqual([ + { + id: "tool_1", + sequence: 0, + update: { structured: { phase: "searching" } }, + }, + { + id: "tool_1", + sequence: 0, + update: { structured: { phase: "searching" } }, + }, + ]) + yield* secondAttachment.detach() + yield* Scope.close(secondScope, Exit.void) + yield* controller.endGeneration + yield* controller.shutdown + }), + ), +) + +it.live("does not retry progress interrupted by its caller", () => + Effect.scoped( + Effect.gen(function* () { + const updateReceived = yield* Deferred.make() + const peer = startTransportPeer(({ request, socket }) => { + if (request.method === "tool.update") { + Deferred.doneUnsafe(updateReceived, Effect.void) + return + } + sendResult(socket, request, request.method === "tool.attach" ? { attached: true } : { ok: true }) + }) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + notify(peer.received[0].socket, "tool.invocation", invocation) + const call = yield* controller.controls.take("call_lookup") + + const progress = yield* call.progress({ structured: { phase: "searching" } }).pipe(Effect.forkScoped) + yield* Deferred.await(updateReceived) + yield* Fiber.interrupt(progress) + yield* call.fail("finished") + + expect(peer.received.filter(({ request }) => request.method === "tool.update")).toHaveLength(1) + }), + ), +) + +it.live("rejects malformed progress without advancing its sequence", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => + sendResult(socket, request, request.method === "tool.attach" ? { attached: true } : { ok: true }), + ) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set()) + yield* controller.connect(backend) + yield* controller.controls.attach({ tools: [registration] }) + notify(peer.received[0].socket, "tool.invocation", invocation) + const call = yield* controller.controls.take("call_lookup") + + const malformed = { structured: [] } as unknown as Progress + expect(yield* call.progress(malformed).pipe(Effect.flip)).toMatchObject({ + operation: "progress", + reason: "rejected", + callID: "call_lookup", + }) + yield* call.progress({ structured: { phase: "valid" } }) + yield* call.fail("finished") + + expect( + peer.received.filter(({ request }) => request.method === "tool.update").map(({ request }) => request.params), + ).toEqual([ + { + id: "tool_1", + sequence: 0, + update: { structured: { phase: "valid" } }, + }, + ]) + }), + ), +) + +it.live("rejects dynamic names that collide with static adapters", () => + Effect.scoped( + Effect.gen(function* () { + const peer = startTransportPeer(({ request, socket }) => sendResult(socket, request, { attached: true })) + yield* Effect.addFinalizer(() => Effect.promise(() => peer.stop())) + const backend = yield* SimulationConnector.backend(peer.url, { + attach: false, + }) + const controller = yield* ToolProducer.make(new Set(["shell"])) + yield* controller.connect(backend) + + expect( + yield* controller.controls + .attach({ + tools: [{ ...registration, name: "shell" }], + }) + .pipe(Effect.flip), + ).toMatchObject({ + operation: "attach", + reason: "rejected", + message: expect.stringContaining("static adapter: shell"), + }) + expect(peer.received).toEqual([]) + }), + ), +) diff --git a/packages/drive/tsconfig.json b/packages/drive/tsconfig.json new file mode 100644 index 00000000000..33345d2dc64 --- /dev/null +++ b/packages/drive/tsconfig.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@tsconfig/bun/tsconfig.json", + "compilerOptions": { + "strict": true, + "noEmit": true, + "skipLibCheck": true + }, + "include": ["src", "examples", "compile"] +} diff --git a/packages/drive/vitest.config.ts b/packages/drive/vitest.config.ts new file mode 100644 index 00000000000..a488d7d1266 --- /dev/null +++ b/packages/drive/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "vitest/config" + +export default defineConfig({ + test: { + fileParallelism: false, + hookTimeout: 30_000, + exclude: ["test/cli/integration.test.ts", "test/fixtures/**"], + include: ["test/**/*.test.ts"], + testTimeout: 30_000, + }, +}) diff --git a/packages/lab/catalog/.gitignore b/packages/lab/catalog/.gitignore new file mode 100644 index 00000000000..7cc6eedfac0 --- /dev/null +++ b/packages/lab/catalog/.gitignore @@ -0,0 +1,4 @@ +.tmp/ +node_modules/ +.DS_Store +dist/ diff --git a/packages/lab/catalog/AGENTS.md b/packages/lab/catalog/AGENTS.md new file mode 100644 index 00000000000..cf228f5dcc0 --- /dev/null +++ b/packages/lab/catalog/AGENTS.md @@ -0,0 +1,145 @@ +# OpenCode Terminal Catalog Agent Guide + +## Purpose + +This repository is the OpenCode-specific catalog application. It owns the scripted state suite, authored taxonomy, variant manifests, raw frame artifacts, browser renderer, review interactions, and deployment. + +OpenCode Drive is the generic lifecycle and automation module. Do not move catalog concepts, OpenCode screen IDs, taxonomies, or comparison UI into Drive. + +## Architecture + +```text +OpenCode simulation protocol + ui.capture -> normalized terminal frame + | +OpenCode Drive + isolated lifecycle + typed UI/LLM control + | +Terminal catalog capture runner + authored scenario + variants + deterministic manifest + | +Catalog compiler + boundary validation + taxonomy/flow compilation + | +React catalog + canvas renderer + filtering + variant navigation +``` + +The module seams are: + +- `scripts/capture-opencode-drive.ts`: executes the canonical state scenario against one or more variants. +- `catalog/schema.ts`: versioned persisted and browser data contracts. +- `catalog/authoring.ts`: validates the capture graph and compiles authored metadata. +- `src/components/TerminalFrame.tsx`: derives canvas pixels from normalized frames. +- `src/App.tsx`: owns active variant and selected screen state. + +## State Addresses + +Executable states have canonical `/` addresses. The catalog viewer's **Copy ID** action copies that address in flow mode. In screen and UI-element modes it copies the standalone capture ID. + +Resolve and reproduce an executable state with: + +```bash +bun run reproduce -- patch-success-lifecycle/permission-prompt \ + --opencode /path/to/opencode +``` + +The command executes the recipe only through the selected state and prints the path to a normalized `opencode-terminal-frame-v1` artifact. `packages/lab/catalog/scenarios/index.ts` is the executable-flow registry used for string resolution. An address is agent-replayable only after its flow is registered there; narrative catalog flows that have not migrated to executable recipes are browse-only. + +## Protocol Convention + +Keep Drive `--command.ui.*` names and parameter shapes identical to the frontend portion of the canonical OpenCode simulation protocol. The raw-frame command is `ui.capture` with no parameters. + +Protocol changes originate in OpenCode, then are copied directly into Drive. Do not add aliases, convenience protocol commands, or backend LLM controls to the CLI. + +`ui.capture` landed on OpenCode's `v2` branch in anomalyco/opencode#37135. + +## Frame Contract + +`opencode-terminal-frame-v1` is the authoritative visual artifact. It contains: + +- `cols`, `rows`, and cursor coordinates. +- Lines of run-length-encoded spans. +- Span text and display-cell width. +- Resolved RGBA foreground/background tuples. +- OpenTUI text-attribute bits. + +PNG is not authoritative. Do not reintroduce routine checked-in PNG capture. + +The browser renderer must preserve the canonical 10 by 20 pixel cell geometry and use the bundled Commit Mono and Noto symbol/math fallback stack. Ordinary Unicode symbols belong in fallback fonts, not hand-drawn code. Render only terminal cell primitives such as solid blocks and structural bars geometrically. Cell geometry, attribute bits, and the block/bar glyph table are shared with the Drive PNG renderer through `opencode-drive/frame`; extend that module instead of hand-syncing constants. + +The frame format is renderer-neutral. An SVG exporter should consume the same frame artifacts rather than changing capture. + +## Variants + +Variants are independent capture environments, not duplicated screen definitions. + +```bash +bun run capture -- \ + --opencode /path/to/opencode \ + --revision v2~1 \ + --revision v2 \ + --theme opencode \ + --theme rosepine +``` + +Each variant must have: + +- A unique lowercase slug ID. +- An OpenCode checkout path. +- A recorded checkout basename and Git revision. +- An optional OpenCode theme name. + +Variants run concurrently with separate `OpenCodeDriver` instances. Steps inside a variant are sequential because later permission, question, subagent, and session states depend on earlier actions. Preserve deterministic manifest ordering regardless of execution concurrency. + +The MVP displays one active variant at a time. In the viewer, left/right moves through flow steps and up/down changes the active variant. Do not add split comparison unless explicitly requested. + +## Authored And Generated Files + +Edit these by hand: + +- `catalog/authored/taxonomies.ts` +- `catalog/authored/screens.ts` +- `catalog/authored/flows.ts` +- Capture scenario code and application source. + +Generate, never hand-edit: + +- `public/captures/**/*.frame.json` +- `public/drive-captures.json` +- `public/catalog.json` +- `dist/` + +If OpenCode UI copy drifts, inspect the current target checkout and update exact markers. Do not paper over synchronization failures with large unconditional sleeps. + +## Scope + +- The annotation system was deliberately removed. Do not restore annotation routes, storage, KV bindings, or markup UI without an explicit product decision. +- OpenCode Drive is the generic published package in this monorepo (`packages/drive`); this app owns everything OpenCode-catalog-specific, and the package must not import the app. +- The catalog package is private and deployed only as internal developer tooling under `dev.opencode.ai/lab`. + +## Verification + +After capture or schema changes, run: + +```bash +bun run generate +bun run typecheck +bun run test +bun run build +bunx oxlint src catalog scripts server.ts worker.ts +``` + +For UI changes, verify in a real browser at desktop and mobile widths: + +- Every expected canvas loads without console errors. +- Intrinsic dimensions equal `cols * 10` by `rows * 20`. +- Left/right moves through flow steps; up/down switches variants. +- Up/down moves screens only inside the viewer. +- The page has no horizontal overflow on mobile. + +For protocol changes, also run the OpenCode simulation tests and the full OpenCode Drive test suite. + +## Dependencies + +The catalog consumes OpenCode Drive as a Bun workspace dependency (`"opencode-drive": "workspace:*"`) and imports only its published entry points (`opencode-drive`, `opencode-drive/driver`, `opencode-drive/client` for protocol schemas, and the browser-safe `opencode-drive/frame` for renderer geometry). Never import package-internal `src/` paths. diff --git a/packages/lab/catalog/README.md b/packages/lab/catalog/README.md new file mode 100644 index 00000000000..3ac20a2ff3c --- /dev/null +++ b/packages/lab/catalog/README.md @@ -0,0 +1,235 @@ +# OpenCode Terminal Catalog + +Internal deployment: + +Capture a reproducible catalog of OpenCode terminal states from local checkouts, browse every state in one web app, and flip between themes or branches without changing the selected screen. + +The generated manifest is the source of truth for the current state count. It covers navigation, sessions, assistant responses, questions, subagents, shell, file patches, reads, project search, web tools, permissions, notifications, and review surfaces. + +## Prerequisites + +- [Bun](https://bun.sh/) 1.3 or newer. +- A current local OpenCode v2 checkout with dependencies installed. + +## Install + +```bash +gh repo clone anomalyco/opencode +cd opencode/packages/lab/catalog +bun install +``` + +The OpenCode checkout can live anywhere. Capture commands receive its path explicitly; no sibling-directory layout is required. + +## Capture Revision Sets + +```bash +bun run capture -- \ + --opencode $HOME/code/opencode \ + --revision v2~1 \ + --revision v2 + +bun run generate +bun run dev +``` + +Open the URL printed by `bun run dev`. + +Each revision is resolved to an immutable commit and captured from an isolated detached worktree. Set IDs are derived from the commit SHA, prior sets remain in the manifest, and rerunning the same commit/theme replaces only that set. Sets are ordered by commit time, so the newest commit is selected when the catalog opens. + +Prepared revision worktrees are cached under `.tmp/capture-worktrees`. Warm captures reuse the exact resolved commit and its installed dependencies; pass `--fresh` to deliberately rebuild the prepared checkout. Full capture groups scenarios by their declared LLM response mode and reuses one OpenCode process within each group. Frames are staged under `.tmp` and replace the revision directory only after every scenario succeeds. + +During scenario development, execute one registered flow without changing the authoritative manifest: + +```bash +bun run capture -- \ + --opencode $HOME/code/opencode \ + --revision v2 \ + --flow search-lifecycle +``` + +Preview frames are written under `.tmp/capture-runs`. The scenario registry in `scenarios/index.ts` is authoritative for capture, canonical replay addresses, authored screens, and replayable flow metadata. + +When `--revision` is omitted, capture resolves `origin/v2`; it never trusts the checkout's current `HEAD`, which may be a stale feature branch. + +## Compare Themes + +Variants can use the same OpenCode checkout with different configured themes: + +```bash +bun run capture -- \ + --opencode $HOME/code/opencode \ + --revision v2 \ + --theme opencode \ + --theme rosepine + +bun run generate +bun run dev +``` + +Repeated revisions and themes form a cross-product. Use `--theme default` to include OpenCode's configured default alongside named themes. Built-in names include `opencode`, `nord`, `one-dark`, `gruvbox`, `rosepine`, `solarized`, `monokai`, and `palenight`. + +In the catalog: + +- Use the capture-set picker or press up/down to compare revisions and themes without losing the current screen. +- In the viewer, press left/right to move through flow steps and up/down to switch capture sets. +- Use **Copy ID** to copy the active flow state address, or the capture ID when browsing screens directly. +- Open captures have stable `screen`, `flow`, and `set` URL parameters for sharing an exact catalog state. +- Right-click any terminal image to copy its canonical ID or deep link. +- Click a card to open its full-screen viewer and press `Escape` to close it. +- Press `Cmd+K` or `Ctrl+K` to search screens, labels, UI elements, and flows. + +Reproduce a registered executable state against an OpenCode checkout: + +```bash +bun run reproduce -- patch-success-lifecycle/permission-prompt \ + --opencode /path/to/opencode +``` + +The command prints the path to a normalized terminal frame. Only states from flows registered in `scenarios/index.ts` are currently reproducible; other catalog flows remain browse-only until their recipes are migrated. + +## Compare Branches + +Capture any refs available in one OpenCode checkout: + +```bash +bun run capture -- \ + --opencode $HOME/code/opencode \ + --revision origin/v2 \ + --revision v2 + +bun run generate +bun run dev +``` + +The common local feature-branch comparison is: + +```bash +bun run capture -- \ + --opencode /path/to/opencode \ + --revision origin/v2 \ + --revision HEAD +``` + +Commit local changes first: capture sets intentionally resolve Git commits and exclude an uncommitted working tree. In the catalog, `origin/v2` is the before set and `HEAD` is the after set; use the picker or up/down without losing the selected state. + +Themes and checkout comparisons can be combined: + +```bash +bun run capture -- \ + --opencode $HOME/code/opencode \ + --revision origin/v2 \ + --revision v2 \ + --theme nord \ + --theme rosepine +``` + +Each capture set runs in an isolated OpenCode Drive instance. Independent sets capture concurrently, while states inside one set remain sequential so session-dependent states stay deterministic. + +## Agent Workflow + +An agent can operate the full workflow using ordinary shell commands. Give it the catalog repository path, the OpenCode checkout paths, and the variants you want. + +Example request: + +```text +Capture the OpenCode terminal catalog with these variants: + +- baseline: ~/code/opencode-main using the opencode theme +- redesign: ~/code/opencode-redesign using the rosepine theme + +Run generation, typecheck, tests, and the production build. Start the local +catalog and verify that left/right moves through flow steps while up/down changes variants. +Do not hand-edit generated frame files. +``` + +The equivalent commands are: + +```bash +bun install +bun run capture -- \ + --opencode $HOME/code/opencode \ + --revision v2~1 \ + --revision v2 \ + --theme opencode \ + --theme rosepine +bun run generate +bun run typecheck +bun run test +bun run build +bun run dev +``` + +Repository-specific architecture and editing rules for agents are in [`AGENTS.md`](./AGENTS.md). + +## Generated Artifacts + +Capture writes: + +```text +public/drive-captures.json +public/captures//.frame.json +``` + +Generation reads those files and writes: + +```text +public/catalog.json +``` + +Raw terminal frames are authoritative. They preserve text spans, cell widths, resolved RGBA colors, text attributes, cursor position, and terminal dimensions. The browser derives canvas pixels from those frames with Commit Mono. PNG and SVG renderers can be added later without recapturing states. + +Do not edit generated frame or manifest files manually. Change the capture scenario or authored catalog metadata and regenerate them. + +## Catalog Metadata + +Human-authored classification lives in: + +```text +catalog/authored/taxonomies.ts +catalog/authored/screens.ts +catalog/authored/flows.ts +``` + +These files control titles, labels, UI elements, facets, and flow membership independently of terminal capture data. + +## Validation + +Run the complete local validation: + +```bash +bun run generate +bun run typecheck +bun run test +bun run build +``` + +Generation validates every frame's schema, viewport, row count, and cell width before producing `catalog.json`. + +## Deploy + +The application deploys as a Cloudflare Worker with static assets: + +```bash +bun run deploy +``` + +Current deployment: https://dev.opencode.ai/lab/catalog + +## Troubleshooting + +### `ui.capture` is unknown + +The target OpenCode checkout predates the simulation protocol change. Fetch and update to the current `v2` branch, which includes [PR #37135](https://github.com/anomalyco/opencode/pull/37135). + +### Capture times out waiting for text + +OpenCode UI copy changed. Read the current v2 TUI source, update the exact wait marker in `scripts/capture-opencode-drive.ts`, and rerun the whole capture. Do not weaken waits with arbitrary sleeps. + +### A theme does not appear + +Confirm the theme name in OpenCode's `/themes` picker. Theme names are passed directly to OpenCode configuration. + +### The browser shows stale assets + +Restart `bun run dev` after changing dependencies, then reload the page. Production builds always start from a clean `dist/` directory. diff --git a/packages/lab/catalog/catalog/authored/flows.ts b/packages/lab/catalog/catalog/authored/flows.ts new file mode 100644 index 00000000000..758a877ee64 --- /dev/null +++ b/packages/lab/catalog/catalog/authored/flows.ts @@ -0,0 +1,116 @@ +import { defineFlows } from "../dsl" +import { executableFlowDefinitions } from "../../scenarios" +import { screens } from "./screens" + +export const flowGroups = defineFlows(screens, { + "getting-started": { + label: "Getting started", + flows: { + "starting-a-session": { + title: "Starting a session", + description: "Begin from the OpenCode start screen and prepare a new conversation.", + steps: [ + { capture: "home", title: "Start a new conversation", trigger: "Open OpenCode" }, + { capture: "model-picker", title: "Choose a model", trigger: "Open the model picker" }, + { capture: "agent-picker", title: "Choose an agent", trigger: "Open the agent picker" }, + ], + }, + }, + }, + "session-management": { + label: "Session management", + flows: { + ...executableFlowDefinitions("session-management"), + "switching-sessions": { + title: "Switching sessions", + description: "Find an existing conversation and resume it from the session picker.", + steps: [ + { capture: "command-palette", title: "Open session navigation", trigger: "Open the command palette" }, + { capture: "session-picker", title: "Open the session picker", trigger: "Run Switch session" }, + { capture: "session-picker-populated", title: "Select a session", trigger: "Search, then press Enter" }, + ], + }, + "renaming-a-session": { + title: "Renaming a session", + description: "Give the current conversation a recognizable name.", + steps: [ + { capture: "session-picker-populated", title: "Identify the current session" }, + { capture: "session-rename", title: "Enter the new name", trigger: "Run /rename" }, + ], + }, + "forking-a-session": { + title: "Forking a session", + description: "Branch an existing conversation from a selected message.", + steps: [ + { capture: "session-picker-populated", title: "Open the source session" }, + { capture: "session-fork", title: "Choose the fork point", trigger: "Run /fork" }, + ], + }, + "exporting-a-session": { + title: "Exporting a session", + description: "Choose an export format and confirm the transcript was copied.", + steps: [ + { capture: "session-export", title: "Choose an export format", trigger: "Run /export" }, + { capture: "toast-success", title: "Confirm the export", trigger: "Complete the export action" }, + ], + }, + }, + }, + "tool-use": { + label: "Tool use", + flows: { + ...executableFlowDefinitions("tool-use"), + "answering-a-question": { + title: "Answering an agent question", + description: "Respond to a structured question without leaving the conversation.", + steps: [ + { capture: "question-prompt", title: "Choose or enter an answer", trigger: "Submit the question form" }, + ], + }, + }, + }, + subagents: { + label: "Subagents", + flows: executableFlowDefinitions("subagents"), + }, + responses: { + label: "Responses", + flows: executableFlowDefinitions("responses"), + }, + configuration: { + label: "Configuration", + flows: { + "connecting-an-integration": { + title: "Connecting an integration", + description: "Choose an integration and verify its connection state.", + steps: [ + { capture: "integration-picker", title: "Choose an integration" }, + { capture: "status", title: "Check the connection status" }, + ], + }, + "managing-mcp-servers": { + title: "Managing MCP servers", + description: "Inspect configured MCP servers and their runtime status.", + steps: [ + { capture: "mcp-list", title: "Open MCP management" }, + { capture: "status", title: "Inspect MCP status" }, + ], + }, + "pairing-a-device": { + title: "Pairing a device", + description: "Open the pairing code used to connect another device.", + steps: [{ capture: "pair", title: "Scan the pairing code" }], + }, + }, + }, + review: { + label: "Review", + flows: { + "reviewing-a-diff": { + title: "Reviewing a diff", + description: "Inspect the working tree and verify whether files have changed.", + steps: [{ capture: "diff-viewer", title: "Open the diff viewer", trigger: "Run /diff" }], + }, + }, + }, +}) diff --git a/packages/lab/catalog/catalog/authored/index.ts b/packages/lab/catalog/catalog/authored/index.ts new file mode 100644 index 00000000000..4d3480c18bc --- /dev/null +++ b/packages/lab/catalog/catalog/authored/index.ts @@ -0,0 +1,10 @@ +import type { CatalogDefinition } from "../dsl" +import { flowGroups } from "./flows" +import { screens } from "./screens" +import { taxonomies } from "./taxonomies" + +export const definition = { + taxonomies, + screens, + flowGroups, +} satisfies CatalogDefinition diff --git a/packages/lab/catalog/catalog/authored/screens.ts b/packages/lab/catalog/catalog/authored/screens.ts new file mode 100644 index 00000000000..1d18f13db1b --- /dev/null +++ b/packages/lab/catalog/catalog/authored/screens.ts @@ -0,0 +1,229 @@ +import { defineScreens, type ScreenId } from "../dsl" +import { executableScreens } from "../../scenarios" +import { taxonomies } from "./taxonomies" + +export const screens = defineScreens(taxonomies, { + home: { + title: "Home", + category: "system", + screenLabels: ["start-screen", "new-session", "composer"], + uiElements: ["composer", "keyboard-hints", "full-screen-view", "empty-state"], + surfaces: "full-screen", + patterns: "landing", + features: ["system", "session"], + states: "empty", + }, + "command-palette": { + title: "Command palette", + category: "navigation", + screenLabels: ["command-navigation"], + uiElements: ["command-palette", "search-field", "list", "keyboard-hints", "dialog"], + surfaces: "modal", + patterns: "palette", + features: ["commands", "navigation"], + states: "default", + }, + "model-picker": { + title: "Model picker", + category: "picker", + screenLabels: ["model-selection"], + uiElements: ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints"], + surfaces: "modal", + patterns: "picker", + features: "model", + states: "default", + }, + "agent-picker": { + title: "Agent picker", + category: "picker", + screenLabels: ["agent-selection"], + uiElements: ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints"], + surfaces: "modal", + patterns: "picker", + features: "agent", + states: "default", + }, + "integration-picker": { + title: "Integrations", + category: "picker", + screenLabels: ["integration-setup"], + uiElements: ["picker", "single-select", "list", "dialog"], + surfaces: "modal", + patterns: "picker", + features: "integration", + states: "default", + }, + "theme-picker": { + title: "Theme picker", + category: "picker", + screenLabels: ["theme-selection"], + uiElements: ["picker", "single-select", "list", "dialog"], + surfaces: "modal", + patterns: "picker", + features: "theme", + states: "default", + }, + "mcp-list": { + title: "MCPs", + category: "status", + screenLabels: ["mcp-management"], + uiElements: ["list", "dialog", "empty-state"], + surfaces: "modal", + patterns: "list", + features: "mcp", + states: "empty", + }, + status: { + title: "Status", + category: "status", + screenLabels: ["system-status", "mcp-management"], + uiElements: ["status-indicator", "list", "dialog", "empty-state"], + surfaces: "modal", + patterns: "status", + features: ["system", "mcp"], + states: "empty", + }, + debug: { + title: "Debug", + category: "information", + screenLabels: ["debugging", "system-status"], + uiElements: ["debug-information", "dialog"], + surfaces: "modal", + patterns: "info", + features: ["debug", "system"], + states: "default", + }, + help: { + title: "Help", + category: "information", + screenLabels: ["help-reference", "command-navigation"], + uiElements: ["shortcut-list", "keyboard-hints", "dialog", "list"], + surfaces: "modal", + patterns: "info", + features: ["help", "shortcuts"], + states: "default", + }, + pair: { + title: "Pair device", + category: "information", + screenLabels: ["device-pairing", "integration-setup"], + uiElements: ["qr-code", "dialog"], + surfaces: "modal", + patterns: "pairing", + features: "device", + states: "default", + }, + "session-picker": { + title: "Session picker", + category: "session", + screenLabels: ["session-list"], + uiElements: ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints", "empty-state"], + surfaces: "modal", + patterns: "picker", + features: "session", + states: "empty", + }, + "skill-picker": { + title: "Skill picker", + category: "session", + screenLabels: ["skill-selection"], + uiElements: ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints"], + surfaces: "modal", + patterns: "picker", + features: "skill", + states: "default", + }, + ...executableScreens, + "session-rename": { + title: "Rename session", + category: "session", + screenLabels: ["rename-session"], + uiElements: ["dialog", "form", "text-input"], + surfaces: "modal", + patterns: "form", + features: "session", + states: "default", + }, + "session-fork": { + title: "Fork session", + category: "session", + screenLabels: ["fork-session"], + uiElements: ["dialog", "picker", "single-select", "list"], + surfaces: "modal", + patterns: "picker", + features: "session", + states: "default", + }, + "session-export": { + title: "Export session", + category: "session", + screenLabels: ["export-session"], + uiElements: ["dialog", "form", "single-select", "button-group"], + surfaces: "modal", + patterns: "form", + features: ["session", "export"], + states: "default", + }, + "question-prompt": { + title: "Question prompt", + category: "session", + screenLabels: ["question-response", "tool-execution"], + uiElements: ["inline-prompt", "question-prompt", "form", "single-select", "button-group", "confirmation"], + surfaces: "inline", + patterns: "form", + features: ["question", "tool"], + states: "confirmation", + }, + "session-picker-populated": { + title: "Session picker (populated)", + category: "session", + screenLabels: ["session-list"], + uiElements: ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints"], + surfaces: "modal", + patterns: "picker", + features: "session", + states: "populated", + }, + "toast-success": { + title: "Success toast", + category: "system", + screenLabels: ["export-session", "toast-success"], + uiElements: ["toast", "confirmation", "transcript"], + surfaces: "toast", + patterns: "notification", + features: ["session", "export", "notification"], + states: "success", + }, + "toast-info": { + title: "Info toast", + category: "system", + screenLabels: ["debugging", "toast-info"], + uiElements: ["toast", "confirmation"], + surfaces: "toast", + patterns: "notification", + features: ["debug", "notification"], + states: "default", + }, + "toast-error": { + title: "Error toast", + category: "system", + screenLabels: ["error-recovery", "toast-error"], + uiElements: ["toast", "error-report"], + surfaces: "toast", + patterns: "notification", + features: "notification", + states: "error", + }, + "diff-viewer": { + title: "Diff viewer", + category: "session", + screenLabels: ["diff-review"], + uiElements: ["full-screen-view", "list", "keyboard-hints", "empty-state"], + surfaces: "full-screen", + patterns: "list", + features: ["diff", "session"], + states: "empty", + }, +}) + +export type CaptureId = ScreenId diff --git a/packages/lab/catalog/catalog/authored/taxonomies.ts b/packages/lab/catalog/catalog/authored/taxonomies.ts new file mode 100644 index 00000000000..8653b2edcdc --- /dev/null +++ b/packages/lab/catalog/catalog/authored/taxonomies.ts @@ -0,0 +1,134 @@ +import { defineTaxonomies } from "../dsl" + +export const taxonomies = defineTaxonomies({ + screenLabels: { + "getting-started": { + label: "Getting started", + items: { + "start-screen": "Start screen", + "new-session": "New session", + }, + }, + conversation: { + label: "Conversation", + items: { + composer: "Composer", + "question-response": "Question response", + "tool-execution": "Tool execution", + "diff-review": "Diff review", + "subagent-activity": "Subagent activity", + "shell-activity": "Shell activity", + }, + }, + "session-management": { + label: "Session management", + items: { + "session-list": "Session list", + "rename-session": "Rename session", + "fork-session": "Fork session", + "export-session": "Export session", + }, + }, + notifications: { + label: "Notifications", + items: { + "toast-info": "Info toast", + "toast-success": "Success toast", + "toast-error": "Error toast", + }, + }, + "models-and-agents": { + label: "Models & agents", + items: { + "model-selection": "Model selection", + "agent-selection": "Agent selection", + "skill-selection": "Skill selection", + }, + }, + configuration: { + label: "Configuration", + items: { + "integration-setup": "Integration setup", + "mcp-management": "MCP management", + "theme-selection": "Theme selection", + "device-pairing": "Device pairing", + }, + }, + system: { + label: "System", + items: { + "command-navigation": "Command navigation", + "system-status": "System status", + "help-reference": "Help & reference", + debugging: "Debugging", + "error-recovery": "Error recovery", + }, + }, + }, + uiElements: { + navigation: { + label: "Navigation", + items: { + "command-palette": "Command palette", + tabs: "Tabs", + "keyboard-hints": "Keyboard hints", + "shortcut-list": "Shortcut list", + }, + }, + selection: { + label: "Selection", + items: { + picker: "Picker", + "search-field": "Search field", + "single-select": "Single select", + list: "List", + }, + }, + input: { + label: "Input", + items: { + "text-input": "Text input", + form: "Form", + composer: "Composer", + "question-prompt": "Question prompt", + }, + }, + actions: { + label: "Actions", + items: { + "button-group": "Button group", + "approval-actions": "Approval actions", + "destructive-action": "Destructive action", + }, + }, + feedback: { + label: "Feedback", + items: { + "empty-state": "Empty state", + "status-indicator": "Status indicator", + toast: "Toast", + confirmation: "Confirmation", + "error-report": "Error report", + }, + }, + content: { + label: "Content", + items: { + "terminal-output": "Terminal output", + transcript: "Transcript", + "tool-card": "Tool card", + "qr-code": "QR code", + "debug-information": "Debug information", + }, + }, + containers: { + label: "Containers", + items: { + dialog: "Dialog", + "inline-prompt": "Inline prompt", + panel: "Panel", + "full-screen-view": "Full-screen view", + }, + }, + }, +}) diff --git a/packages/lab/catalog/catalog/authoring.test.ts b/packages/lab/catalog/catalog/authoring.test.ts new file mode 100644 index 00000000000..6f67af86ce9 --- /dev/null +++ b/packages/lab/catalog/catalog/authoring.test.ts @@ -0,0 +1,272 @@ +import { describe, expect, test } from "bun:test" +import { Effect } from "effect" +import "./authoring.typecheck" +import { compileCatalog } from "./authoring" +import type { CatalogDefinition, ScreenDefinition } from "./dsl" +import type { DriveManifest } from "./schema" + +const manifest: DriveManifest = { + format: "opencode-terminal-frame-captures-v1", + generatedBy: "scripts/capture-opencode-drive.ts", + variants: [ + { + id: "baseline", + label: "Baseline", + source: "/tmp/opencode", + revision: "abc123", + ref: "v2", + committedAt: "2026-07-17T10:17:51Z", + theme: "opencode", + }, + ], + captures: [ + { + id: "home", + title: "Home", + category: "system", + frames: [ + { + variantId: "baseline", + src: "captures/baseline/home.frame.json", + cols: 118, + rows: 34, + }, + ], + }, + ], +} + +const homeDefinition = { + title: "Home", + category: "system", + screenLabels: ["start-screen"], + uiElements: ["full-screen-view"], + surfaces: "full-screen", + patterns: "landing", + features: "session", + states: "empty", +} satisfies ScreenDefinition + +const definition: CatalogDefinition = { + taxonomies: { + screenLabels: { + "getting-started": { + label: "Getting started", + items: { "start-screen": "Start screen" }, + }, + }, + uiElements: { + containers: { + label: "Containers", + items: { "full-screen-view": "Full-screen view" }, + }, + }, + }, + screens: { + home: homeDefinition, + }, + flowGroups: { + "getting-started": { + label: "Getting started", + flows: { + "starting-a-session": { + title: "Starting a session", + description: "Begin a new conversation.", + steps: [{ capture: "home", title: "Open OpenCode" }], + }, + }, + }, + }, +} + +describe("catalog authoring", () => { + test("compiles authored records into the runtime catalog", async () => { + const catalog = await Effect.runPromise(compileCatalog(definition, manifest)) + + expect(catalog.screenTaxonomy[0]).toEqual({ + id: "getting-started", + label: "Getting started", + items: [{ id: "start-screen", label: "Start screen" }], + }) + expect(catalog.screens[0]?.tags).toEqual([ + "start-screen", + "full-screen-view", + "full-screen", + "landing", + "session", + "empty", + ]) + expect(catalog.flows[0]?.steps[0]?.screenId).toBe("home") + }) + + test("uses authored display metadata without requiring a recapture", async () => { + const catalog = await Effect.runPromise( + compileCatalog( + { + ...definition, + screens: { + home: { ...homeDefinition, title: "Start screen" }, + }, + }, + manifest, + ), + ) + + expect(catalog.screens[0]?.title).toBe("Start screen") + }) + + test("allows older capture sets to omit screens introduced later", async () => { + const catalog = await Effect.runPromise( + compileCatalog(definition, { + ...manifest, + variants: [ + manifest.variants[0], + { + id: "older", + label: "Older", + source: "/tmp/opencode", + revision: "def456", + ref: "v2~1", + committedAt: "2026-07-16T10:17:51Z", + }, + ], + }), + ) + + expect(catalog.screens[0]?.frames.map((frame) => frame.variantId)).toEqual(["baseline"]) + }) + + test("rejects frames for unknown capture sets", async () => { + const error = await Effect.runPromise( + compileCatalog(definition, { + ...manifest, + captures: [ + { + id: "home", + title: "Home", + category: "system", + frames: [ + { + variantId: "unknown", + src: "captures/unknown/home.frame.json", + cols: 118, + rows: 34, + }, + ], + }, + ], + }).pipe(Effect.flip), + ) + + expect(error._tag).toBe("CatalogBuildError") + if (error._tag !== "CatalogBuildError") return + expect(error.issues).toContainEqual({ + path: "drive-captures.json.captures.home.frames", + message: "Capture home references unknown variant unknown", + }) + }) + + test("reports every missing and orphaned capture together", async () => { + const error = await Effect.runPromise( + compileCatalog( + { + ...definition, + screens: { + orphan: homeDefinition, + }, + }, + manifest, + ).pipe(Effect.flip), + ) + + expect(error._tag).toBe("CatalogBuildError") + if (error._tag !== "CatalogBuildError") return + expect(error.issues.map((issue) => issue.message)).toEqual([ + "Capture home has no authored screen definition", + "Authored screen orphan has no capture", + "Flow starting-a-session references unknown capture home", + ]) + }) + + test("rejects taxonomy IDs repeated across groups", async () => { + const error = await Effect.runPromise( + compileCatalog( + { + ...definition, + taxonomies: { + ...definition.taxonomies, + screenLabels: { + first: { label: "First", items: { repeated: "Repeated" } }, + second: { label: "Second", items: { repeated: "Repeated again" } }, + }, + }, + screens: { + home: { + ...homeDefinition, + screenLabels: ["repeated"], + }, + }, + }, + manifest, + ).pipe(Effect.flip), + ) + + expect(error._tag).toBe("CatalogBuildError") + if (error._tag !== "CatalogBuildError") return + expect(error.issues).toContainEqual({ + path: "screenLabels", + message: "Duplicate value repeated", + }) + }) + + test("reports invalid authored values as build errors", async () => { + const error = await Effect.runPromise( + compileCatalog( + { + ...definition, + taxonomies: { + ...definition.taxonomies, + screenLabels: { + "getting-started": { + label: "", + items: { "start-screen": "Start screen" }, + }, + }, + }, + }, + manifest, + ).pipe(Effect.flip), + ) + + expect(error._tag).toBe("CatalogBuildError") + if (error._tag !== "CatalogBuildError") return + expect(error.issues[0]?.path).toBe("catalog") + }) + + test("rejects flow IDs repeated across groups", async () => { + const repeatedFlow = { + title: "Starting a session", + description: "Begin a new conversation.", + steps: [{ capture: "home", title: "Open OpenCode" }], + } as const + const error = await Effect.runPromise( + compileCatalog( + { + ...definition, + flowGroups: { + first: { label: "First", flows: { repeated: repeatedFlow } }, + second: { label: "Second", flows: { repeated: repeatedFlow } }, + }, + }, + manifest, + ).pipe(Effect.flip), + ) + + expect(error._tag).toBe("CatalogBuildError") + if (error._tag !== "CatalogBuildError") return + expect(error.issues).toContainEqual({ + path: "flowGroups", + message: "Duplicate value repeated", + }) + }) +}) diff --git a/packages/lab/catalog/catalog/authoring.ts b/packages/lab/catalog/catalog/authoring.ts new file mode 100644 index 00000000000..6f9977930b2 --- /dev/null +++ b/packages/lab/catalog/catalog/authoring.ts @@ -0,0 +1,205 @@ +import { Effect } from "effect" +import { Catalog, CatalogBuildError, type CatalogIssue, type DriveManifest } from "./schema" +import type { CatalogDefinition, FlowStepDefinition, NonEmpty, OneOrMany, TaxonomyDefinition } from "./dsl" + +export const compileCatalog = Effect.fn("Catalog.compile")(function* ( + definition: CatalogDefinition, + manifest: DriveManifest, +) { + const issues = collectIssues(definition, manifest) + const first = issues[0] + if (first) { + return yield* new CatalogBuildError({ issues: [first, ...issues.slice(1)] }) + } + + const screenTaxonomy = normalizeTaxonomy(definition.taxonomies.screenLabels) + const uiElementTaxonomy = normalizeTaxonomy(definition.taxonomies.uiElements) + const screens = manifest.captures.map((capture) => { + const authored = definition.screens[capture.id] + if (!authored) throw new Error(`Validated screen definition missing for ${capture.id}`) + const firstFrame = capture.frames[0] + const surfaces = normalize(authored.surfaces) + const patterns = normalize(authored.patterns) + const features = normalize(authored.features) + const states = normalize(authored.states) + return { + id: capture.id, + title: authored.title, + category: authored.category, + summary: "", + tags: [...authored.screenLabels, ...authored.uiElements, ...surfaces, ...patterns, ...features, ...states], + screenLabels: authored.screenLabels, + uiElements: authored.uiElements, + surfaces, + patterns, + features, + states, + dimensions: [] as const, + viewport: { cols: firstFrame.cols, rows: firstFrame.rows }, + variations: [] as const, + frames: capture.frames, + } + }) + const flows = Object.entries(definition.flowGroups).flatMap(([, group]) => + Object.entries(group.flows).map(([id, flow]) => { + const [first, ...rest] = flow.steps + const steps: NonEmpty> = [ + normalizeFlowStep(first), + ...rest.map(normalizeFlowStep), + ] + return { + id, + title: flow.title, + group: group.label, + description: flow.description, + replayable: flow.replayable ?? false, + steps, + } + }), + ) + + return yield* Catalog.makeEffect({ + format: "opencode-terminal-catalog-v3", + generatedBy: manifest.generatedBy, + variants: manifest.variants, + screenTaxonomy, + uiElementTaxonomy, + surfaces: facetValues(screens, (screen) => screen.surfaces), + patterns: facetValues(screens, (screen) => screen.patterns), + features: facetValues(screens, (screen) => screen.features), + states: facetValues(screens, (screen) => screen.states), + screens, + flows, + }).pipe( + Effect.mapError( + (cause) => + new CatalogBuildError({ + issues: [{ path: "catalog", message: cause.toString() }], + }), + ), + ) +}) + +function normalize(value: OneOrMany): ReadonlyArray { + return typeof value === "string" ? [value] : value +} + +function normalizeFlowStep(step: FlowStepDefinition) { + return { + screenId: step.capture, + title: step.title, + ...(step.trigger === undefined ? {} : { trigger: step.trigger }), + ...(step.description === undefined ? {} : { description: step.description }), + } +} + +function normalizeTaxonomy(definition: TaxonomyDefinition) { + return Object.entries(definition).map(([id, group]) => ({ + id, + label: group.label, + items: Object.entries(group.items).map(([itemId, label]) => ({ id: itemId, label })), + })) +} + +function facetValues( + screens: ReadonlyArray, + select: (screen: Screen) => ReadonlyArray, +) { + return Array.from(new Set(screens.flatMap(select))).sort() +} + +function collectIssues(definition: CatalogDefinition, manifest: DriveManifest): Array { + const issues: Array = [] + const captureIds = manifest.captures.map((capture) => capture.id) + const variantIds = manifest.variants.map((variant) => variant.id) + const captureIdSet = new Set(captureIds) + const screenIds = Object.keys(definition.screens) + const screenIdSet = new Set(screenIds) + const screenLabelIds = taxonomyIds(definition.taxonomies.screenLabels, "screenLabels", issues) + const uiElementIds = taxonomyIds(definition.taxonomies.uiElements, "uiElements", issues) + + duplicateIssues(captureIds, "drive-captures.json.captures", issues) + duplicateIssues(variantIds, "drive-captures.json.variants", issues) + + for (const capture of manifest.captures) { + const frameVariantIds = capture.frames.map((frame) => frame.variantId) + duplicateIssues(frameVariantIds, `drive-captures.json.captures.${capture.id}.frames`, issues) + for (const variantId of frameVariantIds) { + if (!variantIds.includes(variantId)) { + issues.push({ + path: `drive-captures.json.captures.${capture.id}.frames`, + message: `Capture ${capture.id} references unknown variant ${variantId}`, + }) + } + } + const screen = definition.screens[capture.id] + if (!screen) { + issues.push({ + path: `screens.${capture.id}`, + message: `Capture ${capture.id} has no authored screen definition`, + }) + continue + } + } + + for (const screenId of screenIds) { + if (!captureIdSet.has(screenId)) { + issues.push({ path: `screens.${screenId}`, message: `Authored screen ${screenId} has no capture` }) + } + const screen = definition.screens[screenId] + if (!screen) continue + referenceIssues(screen.screenLabels, screenLabelIds, `screens.${screenId}.screenLabels`, issues) + referenceIssues(screen.uiElements, uiElementIds, `screens.${screenId}.uiElements`, issues) + duplicateIssues(screen.screenLabels, `screens.${screenId}.screenLabels`, issues) + duplicateIssues(screen.uiElements, `screens.${screenId}.uiElements`, issues) + duplicateIssues(normalize(screen.surfaces), `screens.${screenId}.surfaces`, issues) + duplicateIssues(normalize(screen.patterns), `screens.${screenId}.patterns`, issues) + duplicateIssues(normalize(screen.features), `screens.${screenId}.features`, issues) + duplicateIssues(normalize(screen.states), `screens.${screenId}.states`, issues) + } + + const flowIds: Array = [] + for (const [groupId, group] of Object.entries(definition.flowGroups)) { + for (const [flowId, flow] of Object.entries(group.flows)) { + flowIds.push(flowId) + if (flow.steps.length === 0) { + issues.push({ path: `flowGroups.${groupId}.${flowId}.steps`, message: `Flow ${flowId} has no steps` }) + } + for (const [index, step] of flow.steps.entries()) { + if (!screenIdSet.has(step.capture)) { + issues.push({ + path: `flowGroups.${groupId}.${flowId}.steps.${index}.capture`, + message: `Flow ${flowId} references unknown capture ${step.capture}`, + }) + } + } + } + } + duplicateIssues(flowIds, "flowGroups", issues) + return issues +} + +function taxonomyIds(taxonomy: TaxonomyDefinition, path: string, issues: Array): ReadonlySet { + const ids = Object.values(taxonomy).flatMap((group) => Object.keys(group.items)) + duplicateIssues(ids, path, issues) + return new Set(ids) +} + +function duplicateIssues(values: ReadonlyArray, path: string, issues: Array) { + const seen = new Set() + for (const value of values) { + if (seen.has(value)) issues.push({ path, message: `Duplicate value ${value}` }) + seen.add(value) + } +} + +function referenceIssues( + values: ReadonlyArray, + known: ReadonlySet, + path: string, + issues: Array, +) { + for (const value of values) { + if (!known.has(value)) issues.push({ path, message: `Unknown reference ${value}` }) + } +} diff --git a/packages/lab/catalog/catalog/authoring.typecheck.ts b/packages/lab/catalog/catalog/authoring.typecheck.ts new file mode 100644 index 00000000000..364b6e64464 --- /dev/null +++ b/packages/lab/catalog/catalog/authoring.typecheck.ts @@ -0,0 +1,115 @@ +import { defineFlows, defineScreens, defineTaxonomies } from "./dsl" +import { defineExecutableFlow, executeFlow } from "./flow" + +const taxonomies = defineTaxonomies({ + screenLabels: { + session: { label: "Session", items: { "session-list": "Session list" } }, + }, + uiElements: { + selection: { label: "Selection", items: { picker: "Picker" } }, + }, +}) + +const screens = defineScreens(taxonomies, { + "session-picker": { + title: "Session picker", + category: "session", + screenLabels: ["session-list"], + uiElements: ["picker"], + surfaces: "modal", + patterns: "picker", + features: "session", + states: "default", + }, +}) + +// @ts-expect-error Unknown screen labels are rejected at the authoring site. +defineScreens(taxonomies, { + invalid: { + title: "Invalid", + category: "session", + screenLabels: ["session-lits"], + uiElements: ["picker"], + surfaces: "modal", + patterns: "picker", + features: "session", + states: "default", + }, +}) + +defineScreens(taxonomies, { + invalid: { + title: "Invalid", + category: "session", + screenLabels: ["session-list"], + uiElements: ["picker"], + // @ts-expect-error Closed facet vocabularies reject typo-created filters. + surfaces: "modla", + patterns: "picker", + features: "session", + states: "default", + }, +}) + +// @ts-expect-error Flow steps can only reference authored screen keys. +defineFlows(screens, { + session: { + label: "Session", + flows: { + invalid: { + title: "Invalid flow", + description: "Type-level reference check.", + steps: [ + { + capture: "session-pikcer", + title: "Open the picker", + }, + ], + }, + }, + }, +}) + +const firstFlow = defineExecutableFlow( + taxonomies, + { + id: "first-flow", + title: "First flow", + group: { id: "tests", label: "Tests" }, + description: "First flow.", + }, + ({ state, program }) => { + const first = state("first", { + screen: screens["session-picker"], + step: { title: "First" }, + }) + return program([first], ({ checkpoint }) => checkpoint(first)) + }, +) + +const secondFlow = defineExecutableFlow( + taxonomies, + { + id: "second-flow", + title: "Second flow", + group: { id: "tests", label: "Tests" }, + description: "Second flow.", + }, + ({ state, program }) => { + const second = state("second", { + screen: screens["session-picker"], + step: { title: "Second" }, + }) + return program([second], ({ checkpoint }) => { + // @ts-expect-error Checkpoints only accept states declared by this flow. + return checkpoint(firstFlow.states[0]) + }) + }, +) + +executeFlow(secondFlow, { + driver: undefined as never, + // @ts-expect-error Selected states must belong to the executed flow. + through: firstFlow.states[0], + capture: () => undefined as never, +}) diff --git a/packages/lab/catalog/catalog/capture-sets.test.ts b/packages/lab/catalog/catalog/capture-sets.test.ts new file mode 100644 index 00000000000..23a48143e56 --- /dev/null +++ b/packages/lab/catalog/catalog/capture-sets.test.ts @@ -0,0 +1,81 @@ +import { describe, expect, test } from "bun:test" +import { resolve } from "node:path" +import { captureMatrixManifest, captureSetId, captureSetLabel, parseCaptureOptions } from "../scripts/capture-sets" + +describe("capture revision sets", () => { + test("parses repeated revisions and themes", () => { + expect( + parseCaptureOptions( + [ + "--opencode", + "./opencode", + "--revision", + "v2~1", + "--revision", + "v2", + "--theme", + "opencode", + "--theme", + "rosepine", + ], + "/default", + ), + ).toEqual({ + opencode: resolve("opencode"), + revisions: ["v2~1", "v2"], + themes: ["opencode", "rosepine"], + flow: undefined, + fresh: false, + jobs: 3, + workerOutput: undefined, + }) + }) + + test("defaults to the canonical v2 branch instead of a stale checkout HEAD", () => { + expect(parseCaptureOptions([], "/opencode").revisions).toEqual(["origin/v2"]) + }) + + test("selects one flow and deliberately refreshes its prepared worktree", () => { + expect(parseCaptureOptions(["--flow", "search-lifecycle", "--fresh"], "/opencode")).toMatchObject({ + flow: "search-lifecycle", + fresh: true, + }) + }) + + test("derives stable theme IDs and labels", () => { + expect(captureSetId("ABCDEF1234567890", undefined)).toBe("abcdef123456") + expect(captureSetId("ABCDEF1234567890", "One Dark")).toBe("one-dark") + expect(captureSetId("ABCDEF1234567890", "One Dark", true)).toBe("abcdef123456-one-dark") + expect(captureSetLabel("abcdef1234567890", "opencode")).toBe("Opencode") + expect(captureSetLabel("abcdef1234567890", "tokyonight")).toBe("Tokyo Night") + expect(captureSetLabel("abcdef1234567890", "everforest")).toBe("Everforest") + }) + + test("publishes only the requested theme matrix", () => { + const variant = { + id: "opencode", + label: "Opencode", + source: "opencode", + revision: "a".repeat(40), + ref: "HEAD", + committedAt: "2026-08-12T12:00:00Z", + theme: "opencode", + } + const manifest = captureMatrixManifest( + [variant], + [ + { + id: "home", + title: "Home", + category: "system", + frames: [{ variantId: "opencode", src: "captures/opencode/home.frame.json", cols: 2, rows: 2 }], + }, + ], + ) + + expect(manifest.variants).toEqual([variant]) + expect(manifest.captures[0]?.frames).toEqual([ + { variantId: "opencode", src: "captures/opencode/home.frame.json", cols: 2, rows: 2 }, + ]) + }) +}) diff --git a/packages/lab/catalog/catalog/deep-link.test.ts b/packages/lab/catalog/catalog/deep-link.test.ts new file mode 100644 index 00000000000..5956b025cd9 --- /dev/null +++ b/packages/lab/catalog/catalog/deep-link.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, test } from "bun:test" +import { catalogBrowseUrl, readCatalogLocation } from "../src/deep-link" + +describe("catalog deep links", () => { + test("round-trips filters and removes an open viewer", () => { + const url = catalogBrowseUrl( + { + variantId: "baseline", + mode: "ui-elements", + query: "session", + screenLabels: [], + uiElements: ["dialog", "tabs"], + surfaces: ["modal"], + patterns: [], + features: ["session"], + states: ["default", "running"], + }, + new URL("https://catalog.example/?screen=session-picker&flow=sessions"), + ) + + expect(url).toBe( + "https://catalog.example/?set=baseline&mode=ui-elements&q=session&ui-element=dialog&ui-element=tabs&surface=modal&feature=session&state=default&state=running", + ) + expect(readCatalogLocation(new URL(url))).toMatchObject({ + variantId: "baseline", + mode: "ui-elements", + query: "session", + uiElements: ["dialog", "tabs"], + surfaces: ["modal"], + features: ["session"], + states: ["default", "running"], + }) + }) +}) diff --git a/packages/lab/catalog/catalog/dsl.ts b/packages/lab/catalog/catalog/dsl.ts new file mode 100644 index 00000000000..5beef01e33c --- /dev/null +++ b/packages/lab/catalog/catalog/dsl.ts @@ -0,0 +1,139 @@ +export type NonEmpty = readonly [A, ...ReadonlyArray] +export type OneOrMany = A | NonEmpty + +export const ScreenCategories = ["system", "navigation", "picker", "status", "information", "session"] as const +export type ScreenCategory = (typeof ScreenCategories)[number] + +export const Surfaces = ["full-screen", "modal", "inline", "panel", "toast"] as const +export type Surface = (typeof Surfaces)[number] + +export const Patterns = [ + "landing", + "palette", + "picker", + "list", + "status", + "info", + "pairing", + "approval", + "form", + "terminal", + "notification", + "error-report", + "navigation", +] as const +export type Pattern = (typeof Patterns)[number] + +export const States = [ + "default", + "empty", + "populated", + "pending", + "idle", + "running", + "streaming", + "selected", + "expanded", + "confirmation", + "success", + "error", +] as const +export type ScreenState = (typeof States)[number] + +export type TaxonomyDefinition = Readonly< + Record< + string, + { + readonly label: string + readonly items: Readonly> + } + > +> + +type ValueOf = T[keyof T] +export type TaxonomyItemId = + ValueOf extends infer Group + ? Group extends { readonly items: infer Items extends Readonly> } + ? Extract + : never + : never + +export interface Taxonomies { + readonly screenLabels: ScreenLabels + readonly uiElements: UiElements +} + +export interface ScreenDefinition { + readonly title: string + readonly category: ScreenCategory + readonly screenLabels: NonEmpty + readonly uiElements: NonEmpty + readonly surfaces: OneOrMany + readonly patterns: OneOrMany + readonly features: OneOrMany + readonly states: OneOrMany +} + +export type ScreenDefinitions = Readonly< + Record> +> + +export type ScreenId> = Extract + +export interface FlowStepDefinition { + readonly capture: CaptureId + readonly title: string + readonly trigger?: string + readonly description?: string +} + +export interface FlowDefinition { + readonly title: string + readonly description: string + readonly replayable?: boolean + readonly steps: NonEmpty> +} + +export type FlowGroupDefinitions = Readonly< + Record< + string, + { + readonly label: string + readonly flows: Readonly>> + } + > +> + +export interface CatalogDefinition { + readonly taxonomies: Taxonomies + readonly screens: ScreenDefinitions + readonly flowGroups: FlowGroupDefinitions +} + +export function defineTaxonomies< + const ScreenLabels extends TaxonomyDefinition, + const UiElements extends TaxonomyDefinition, +>(definitions: { + readonly screenLabels: ScreenLabels + readonly uiElements: UiElements +}): Taxonomies { + return definitions +} + +export function defineScreens< + ScreenLabels extends TaxonomyDefinition, + UiElements extends TaxonomyDefinition, + const Definitions extends ScreenDefinitions, +>( + taxonomies: Taxonomies, + definitions: Definitions & ScreenDefinitions, TaxonomyItemId>, +): Definitions { + return definitions +} + +export function defineFlows< + Screens extends ScreenDefinitions, + const Definitions extends FlowGroupDefinitions, +>(screens: Screens, definitions: Definitions & FlowGroupDefinitions>): Definitions { + return definitions +} diff --git a/packages/lab/catalog/catalog/feedback.test.ts b/packages/lab/catalog/catalog/feedback.test.ts new file mode 100644 index 00000000000..b614e129937 --- /dev/null +++ b/packages/lab/catalog/catalog/feedback.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, test } from "bun:test" +import { feedbackIssueUrl } from "../src/feedback" + +describe("catalog feedback", () => { + test("opens a prefilled issue for an exact capture", () => { + const url = new URL( + feedbackIssueUrl({ + title: "Skill picker", + identifier: "skill-picker", + deepLink: "https://dev.opencode.ai/lab/catalog?screen=skill-picker&set=opencode", + variant: "opencode", + }), + ) + + expect(`${url.origin}${url.pathname}`).toBe("https://github.com/anomalyco/opencode/issues/new") + expect(url.searchParams.get("title")).toBe("[Catalog feedback] Skill picker") + expect(url.searchParams.get("labels")).toBe("catalog,design-feedback") + expect(url.searchParams.get("body")).toContain("`skill-picker`") + expect(url.searchParams.get("body")).toContain("screen=skill-picker&set=opencode") + }) +}) diff --git a/packages/lab/catalog/catalog/flow.test.ts b/packages/lab/catalog/catalog/flow.test.ts new file mode 100644 index 00000000000..418e5b49138 --- /dev/null +++ b/packages/lab/catalog/catalog/flow.test.ts @@ -0,0 +1,119 @@ +import { describe, expect, test } from "bun:test" +import { Effect } from "effect" +import type { Driver } from "opencode-drive/driver" +import { defineTaxonomies } from "./dsl" +import { defineExecutableFlow, executeFlow, FlowStateNotReachedError } from "./flow" + +const taxonomies = defineTaxonomies({ + screenLabels: { + session: { label: "Session", items: { transcript: "Transcript" } }, + }, + uiElements: { + status: { label: "Status", items: { message: "Message" } }, + }, +}) + +const stateMetadata = (title: string) => ({ + screen: { + title, + category: "session" as const, + screenLabels: ["transcript"] as const, + uiElements: ["message"] as const, + surfaces: "inline" as const, + patterns: "status" as const, + features: "test", + states: "default" as const, + }, + step: { title }, +}) + +function fixture(trace: Array) { + return defineExecutableFlow( + taxonomies, + { + id: "test-flow", + title: "Test flow", + group: { id: "tests", label: "Tests" }, + description: "Exercises flow checkpoints.", + }, + ({ state, program }) => { + const first = state("first", stateMetadata("First")) + const second = state("second", stateMetadata("Second")) + const third = state("third", stateMetadata("Third")) + return program([first, second, third], ({ checkpoint }) => + Effect.gen(function* () { + trace.push("first") + yield* checkpoint(first) + trace.push("second") + yield* checkpoint(second) + trace.push("third") + yield* checkpoint(third) + }), + ) + }, + ) +} + +const driver = undefined as unknown as Driver + +describe("executable catalog flows", () => { + test("captures every declared checkpoint in program order", async () => { + const trace: Array = [] + const captured: Array = [] + const flow = fixture(trace) + + await Effect.runPromise( + executeFlow(flow, { + driver, + capture: (state) => Effect.sync(() => captured.push(state.address)), + }), + ) + + expect(trace).toEqual(["first", "second", "third"]) + expect(captured).toEqual(["test-flow/first", "test-flow/second", "test-flow/third"]) + }) + + test("captures one selected state and interrupts the remaining program", async () => { + const trace: Array = [] + const captured: Array = [] + const flow = fixture(trace) + + await Effect.runPromise( + executeFlow(flow, { + driver, + through: flow.states[1], + capture: (state) => Effect.sync(() => captured.push(state.address)), + }), + ) + + expect(trace).toEqual(["first", "second"]) + expect(captured).toEqual(["test-flow/second"]) + }) + + test("rejects a full run that does not reach every declared state", async () => { + const incomplete = defineExecutableFlow( + taxonomies, + { + id: "incomplete-flow", + title: "Incomplete flow", + group: { id: "tests", label: "Tests" }, + description: "Omits its final state.", + }, + ({ state, program }) => { + const first = state("first", stateMetadata("First")) + const missing = state("missing", stateMetadata("Missing")) + return program([first, missing], ({ checkpoint }) => checkpoint(first)) + }, + ) + + const error = await Effect.runPromise( + executeFlow(incomplete, { + driver, + capture: () => Effect.void, + }).pipe(Effect.flip), + ) + + expect(error).toBeInstanceOf(FlowStateNotReachedError) + expect(error).toMatchObject({ address: "incomplete-flow/missing" }) + }) +}) diff --git a/packages/lab/catalog/catalog/flow.ts b/packages/lab/catalog/catalog/flow.ts new file mode 100644 index 00000000000..ec4dd806233 --- /dev/null +++ b/packages/lab/catalog/catalog/flow.ts @@ -0,0 +1,241 @@ +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import type { Driver } from "opencode-drive/driver" +import type { + FlowStepDefinition, + NonEmpty, + ScreenDefinition, + Taxonomies, + TaxonomyDefinition, + TaxonomyItemId, +} from "./dsl" + +const FlowStateTypeId: unique symbol = Symbol("CatalogFlowState") + +export interface FlowStateMetadata { + readonly screen: ScreenDefinition + readonly step: Omit, "capture"> +} + +export interface FlowState< + FlowId extends string, + StateId extends string, + Metadata extends FlowStateMetadata = FlowStateMetadata, +> { + readonly [FlowStateTypeId]: (flow: FlowId) => FlowId + readonly id: StateId + readonly address: `${FlowId}/${StateId}` + readonly metadata: Metadata +} + +type AnyFlowState = FlowState + +export interface FlowRunContext>> { + readonly driver: Driver + readonly checkpoint: (state: States[number]) => Effect.Effect +} + +interface FlowProgram>, Error, Requirements> { + readonly states: States + readonly run: (context: FlowRunContext) => Effect.Effect +} + +export interface ExecutableFlow< + FlowId extends string, + States extends NonEmpty>, + Error, + Requirements, + GroupId extends string = string, +> { + readonly id: FlowId + readonly title: string + readonly group: { readonly id: GroupId; readonly label: string } + readonly description: string + readonly states: States + readonly run: (context: FlowRunContext) => Effect.Effect +} + +export interface ExecutableScenarioState { + readonly id: string + readonly address: string + readonly metadata: FlowStateMetadata +} + +export interface ExecutableScenario { + readonly id: string + readonly title: string + readonly group: { readonly id: string; readonly label: string } + readonly description: string + readonly llmMode: "queue" | "serve" + readonly clientIsolation: "shared" | "isolated" + readonly states: ReadonlyArray + readonly run: (options: { + readonly driver: Driver + readonly through?: string + readonly capture: (state: ExecutableScenarioState) => Effect.Effect + }) => Effect.Effect +} + +interface FlowAuthor { + readonly state: >( + id: StateId, + metadata: Metadata, + ) => FlowState + readonly program: >, Error, Requirements>( + states: States, + run: (context: FlowRunContext) => Effect.Effect, + ) => FlowProgram +} + +export function defineExecutableFlow< + ScreenLabels extends TaxonomyDefinition, + UiElements extends TaxonomyDefinition, + const FlowId extends string, + const GroupId extends string, + const States extends NonEmpty>, + Error, + Requirements, +>( + taxonomies: Taxonomies, + definition: { + readonly id: FlowId + readonly title: string + readonly group: { readonly id: GroupId; readonly label: string } + readonly description: string + }, + build: ( + author: FlowAuthor, TaxonomyItemId>, + ) => FlowProgram, +): ExecutableFlow { + void taxonomies + const author: FlowAuthor, TaxonomyItemId> = { + state: (id, metadata) => ({ + [FlowStateTypeId]: (flow) => flow, + id, + address: `${definition.id}/${id}`, + metadata, + }), + program: (states, run) => ({ states, run }), + } + const program = build(author) + return { ...definition, ...program } +} + +export class FlowStateNotReachedError extends Error { + readonly _tag = "FlowStateNotReachedError" + + constructor(readonly address: string) { + super(`Flow completed without reaching ${address}`) + } +} + +export class FlowCheckpointOrderError extends Error { + readonly _tag = "FlowCheckpointOrderError" + + constructor( + readonly expected: string, + readonly actual: string, + ) { + super(`Expected checkpoint ${expected}, received ${actual}`) + } +} + +export function executeFlow< + const FlowId extends string, + const States extends NonEmpty>, + FlowError, + FlowRequirements, + CaptureError, +>( + flow: ExecutableFlow, + options: { + readonly driver: Driver + readonly through?: States[number] + readonly capture: (state: States[number]) => Effect.Effect + }, +): Effect.Effect< + void, + FlowError | CaptureError | FlowCheckpointOrderError | FlowStateNotReachedError, + FlowRequirements +> { + const target = options.through + if (target === undefined) { + return Effect.gen(function* () { + let index = 0 + yield* flow.run({ + driver: options.driver, + checkpoint: (state) => + Effect.gen(function* () { + const expected = flow.states[index] + if (state !== expected) { + return yield* Effect.fail( + new FlowCheckpointOrderError(expected?.address ?? "the end of the flow", state.address), + ) + } + index++ + yield* options.capture(state) + }), + }) + const missing = flow.states[index] + if (missing) return yield* Effect.fail(new FlowStateNotReachedError(missing.address)) + }) + } + + return Effect.gen(function* () { + const reached = yield* Deferred.make() + let index = 0 + const program = flow + .run({ + driver: options.driver, + checkpoint: (state) => + Effect.gen(function* () { + const expected = flow.states[index] + if (state !== expected) { + return yield* Effect.fail( + new FlowCheckpointOrderError(expected?.address ?? "the end of the flow", state.address), + ) + } + index++ + if (state !== target) return + return yield* options + .capture(state) + .pipe(Effect.andThen(Deferred.succeed(reached, undefined)), Effect.andThen(Effect.never)) + }), + }) + .pipe(Effect.andThen(Effect.fail(new FlowStateNotReachedError(target.address)))) + yield* Effect.raceFirst(Deferred.await(reached), program) + }) +} + +export function executableScenario< + const FlowId extends string, + const States extends NonEmpty>, + FlowError, + const GroupId extends string, +>( + flow: ExecutableFlow, + options: { + readonly llmMode?: "queue" | "serve" + readonly clientIsolation?: "shared" | "isolated" + } = {}, +): ExecutableScenario & { + readonly flow: ExecutableFlow +} { + return { + flow, + id: flow.id, + title: flow.title, + group: flow.group, + description: flow.description, + llmMode: options.llmMode ?? "queue", + clientIsolation: options.clientIsolation ?? "shared", + states: flow.states, + run: ({ driver, through, capture }) => { + const target = through === undefined ? undefined : flow.states.find((state) => state.id === through) + if (through !== undefined && target === undefined) { + return Effect.fail(new Error(`Unknown state ${JSON.stringify(`${flow.id}/${through}`)}`)) + } + return executeFlow(flow, { driver, through: target, capture }) + }, + } +} diff --git a/packages/lab/catalog/catalog/font-coverage.test.ts b/packages/lab/catalog/catalog/font-coverage.test.ts new file mode 100644 index 00000000000..d76934e8064 --- /dev/null +++ b/packages/lab/catalog/catalog/font-coverage.test.ts @@ -0,0 +1,22 @@ +import { expect, test } from "bun:test" +import mathUnicode from "@fontsource/noto-sans-math/unicode.json" +import symbolsUnicode from "@fontsource/noto-sans-symbols/unicode.json" +import symbols2Unicode from "@fontsource/noto-sans-symbols-2/unicode.json" + +const OpenCodeSymbols = [..."△⇆⊙⚙✱↳◌◈⟳▸▾■⬝⬥⬩⬪"] + +test("the bundled fallback font declares coverage for OpenCode symbols", () => { + const ranges = [symbolsUnicode.symbols, symbols2Unicode.symbols, mathUnicode.math] + .flatMap((value) => value.split(",")) + .map((range) => { + const [start, end = start] = range.slice(2).split("-") + return [Number.parseInt(start!, 16), Number.parseInt(end!, 16)] as const + }) + + expect( + OpenCodeSymbols.filter((symbol) => { + const codePoint = symbol.codePointAt(0)! + return !ranges.some(([start, end]) => codePoint >= start && codePoint <= end) + }), + ).toEqual([]) +}) diff --git a/packages/lab/catalog/catalog/lifecycle-flows.test.ts b/packages/lab/catalog/catalog/lifecycle-flows.test.ts new file mode 100644 index 00000000000..8a9a73f0010 --- /dev/null +++ b/packages/lab/catalog/catalog/lifecycle-flows.test.ts @@ -0,0 +1,75 @@ +import { describe, expect, test } from "bun:test" +import { executableFlows, executableScenarios, executableStates } from "../scenarios" +import { catalogScenarioRuntime, catalogViewport } from "../scenarios/runtime" +import { shellLifecycleFlow } from "../scenarios/tools/shell-lifecycle" +import { subagentLifecycleFlow } from "../scenarios/subagents/subagent-lifecycle" +import { sessionTabsFlow } from "../scenarios/session-tabs" +import { patchSuccessFlow } from "../scenarios/tools/patch-success" +import { flowGroups } from "./authored/flows" +import { screens } from "./authored/screens" + +describe("catalog lifecycle scenarios", () => { + test("registers canonical executable state addresses", () => { + expect(shellLifecycleFlow.states.map((state) => state.address)).toEqual([ + "shell-lifecycle/thinking-streaming", + "shell-lifecycle/shell-input-streaming", + "shell-lifecycle/shell-output-streaming", + "shell-lifecycle/shell-execute-succeeded", + "shell-lifecycle/shell-execute-failed", + ]) + expect(subagentLifecycleFlow.states.map((state) => state.address)).toEqual([ + "subagent-lifecycle/subagent-running", + "subagent-lifecycle/subagent-completed", + "subagent-lifecycle/subagent-session", + ]) + expect(sessionTabsFlow.states.map((state) => state.address)).toEqual([ + "session-tabs-lifecycle/session-tabs-running", + "session-tabs-lifecycle/session-tabs-idle", + ]) + expect(patchSuccessFlow.states.map((state) => state.address)).toContain( + "patch-success-lifecycle/permission-fullscreen", + ) + expect(executableFlows).toContain(shellLifecycleFlow) + expect(executableFlows).toContain(subagentLifecycleFlow) + expect(executableStates.map((state) => state.address)).toContain("shell-lifecycle/shell-execute-failed") + expect(executableStates.map((state) => state.address)).toContain("subagent-lifecycle/subagent-session") + }) + + test("authors screens and replayable flows from executable scenarios", () => { + const authored = Object.values(flowGroups).flatMap((group) => Object.entries(group.flows)) + for (const scenario of executableScenarios) { + for (const state of scenario.states) { + const authoredScreen = Object.entries(screens).find(([id]) => id === state.id)?.[1] + expect(authoredScreen === state.metadata.screen).toBe(true) + } + expect(authored.find(([id]) => id === scenario.id)?.[1].replayable).toBe(true) + } + expect(flowGroups["tool-use"].flows["shell-lifecycle"].replayable).toBe(true) + expect(flowGroups.subagents.flows["subagent-lifecycle"].replayable).toBe(true) + expect(flowGroups["session-management"].flows["session-tabs-lifecycle"].replayable).toBe(true) + }) + + test("declares the one dynamic response-mode scenario", () => { + expect( + executableScenarios.filter((scenario) => scenario.llmMode === "serve").map((scenario) => scenario.id), + ).toEqual(["subagent-lifecycle"]) + }) + + test("isolates scenarios that cannot safely reset their TUI client", () => { + expect( + executableScenarios.filter((scenario) => scenario.clientIsolation === "isolated").map((scenario) => scenario.id), + ).toEqual(["assistant-lifecycle", "question-lifecycle", "read-file-lifecycle", "session-tabs-lifecycle"]) + }) + + test("builds the shared capture and reproduce driver runtime", () => { + const runtime = catalogScenarioRuntime({ opencode: "/tmp/opencode", theme: "rosepine" }) + expect(runtime.opencode).toEqual({ dev: "/tmp/opencode" }) + expect(runtime.tui?.viewport).toEqual(catalogViewport) + expect(runtime.project?.files).toMatchObject({ + "fixture.txt": "before\n", + "src/ledger.ts": expect.stringContaining("total"), + }) + expect(runtime.tools).toBeFunction() + expect(runtime.setup).toBeFunction() + }) +}) diff --git a/packages/lab/catalog/catalog/response-tool-flows.test.ts b/packages/lab/catalog/catalog/response-tool-flows.test.ts new file mode 100644 index 00000000000..59fcc3744b6 --- /dev/null +++ b/packages/lab/catalog/catalog/response-tool-flows.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, test } from "bun:test" +import { assistantLifecycleFlow } from "../scenarios/responses/assistant-lifecycle" +import { questionLifecycleFlow } from "../scenarios/tools/question-lifecycle" + +describe("response and question executable flows", () => { + test("exports the assistant lifecycle states in execution order", () => { + expect(assistantLifecycleFlow.states.map((state) => state.address)).toEqual([ + "assistant-lifecycle/assistant-response-succeeded", + "assistant-lifecycle/assistant-response-failed", + "assistant-lifecycle/assistant-response-interrupted", + ]) + }) + + test("exports the question lifecycle states in execution order", () => { + expect(questionLifecycleFlow.states.map((state) => state.address)).toEqual([ + "question-lifecycle/question-input-streaming", + "question-lifecycle/question-awaiting-form", + "question-lifecycle/question-review", + "question-lifecycle/question-succeeded", + "question-lifecycle/question-denied", + ]) + }) + + test("uses distinct terminal states for each lifecycle", () => { + expect(assistantLifecycleFlow.states.map((state) => state.metadata.screen.states)).toEqual([ + "success", + "error", + "error", + ]) + expect(questionLifecycleFlow.states.at(-1)?.metadata.screen.states).toBe("error") + }) +}) diff --git a/packages/lab/catalog/catalog/schema.ts b/packages/lab/catalog/catalog/schema.ts new file mode 100644 index 00000000000..bbcb3e58571 --- /dev/null +++ b/packages/lab/catalog/catalog/schema.ts @@ -0,0 +1,148 @@ +import { Schema } from "effect" +import { Frontend } from "opencode-drive/client" +import { Patterns, ScreenCategories, States, Surfaces } from "./dsl" + +const Slug = Schema.NonEmptyString.check(Schema.isPattern(/^[a-z0-9]+(?:-[a-z0-9]+)*$/)) +const CapturePath = Schema.String.check( + Schema.isPattern(/^captures\/[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*\.frame\.json$/), +) +const PositiveInt = Schema.Int.check(Schema.isGreaterThan(0)) +const ScreenCategory = Schema.Literals(ScreenCategories) +const Surface = Schema.Literals(Surfaces) +const Pattern = Schema.Literals(Patterns) +const ScreenState = Schema.Literals(States) + +export const Variant = Schema.Struct({ + id: Slug, + label: Schema.NonEmptyString, + source: Schema.NonEmptyString, + revision: Schema.NonEmptyString, + ref: Schema.NonEmptyString, + committedAt: Schema.NonEmptyString, + theme: Schema.optionalKey(Schema.NonEmptyString), +}) + +export interface Variant extends Schema.Schema.Type {} + +export const Frame = Schema.Struct({ + variantId: Slug, + src: CapturePath, + cols: PositiveInt, + rows: PositiveInt, +}) + +export interface Frame extends Schema.Schema.Type {} + +export const DriveCapture = Schema.Struct({ + id: Slug, + title: Schema.NonEmptyString, + category: ScreenCategory, + frames: Schema.NonEmptyArray(Frame), +}) + +export interface DriveCapture extends Schema.Schema.Type {} + +export const DriveManifest = Schema.Struct({ + format: Schema.Literal("opencode-terminal-frame-captures-v1"), + generatedBy: Schema.NonEmptyString, + variants: Schema.NonEmptyArray(Variant), + captures: Schema.Array(DriveCapture), +}) + +export interface DriveManifest extends Schema.Schema.Type {} + +export const TaxonomyItem = Schema.Struct({ + id: Slug, + label: Schema.NonEmptyString, +}) + +export interface TaxonomyItem extends Schema.Schema.Type {} + +export const TaxonomyGroup = Schema.Struct({ + id: Slug, + label: Schema.NonEmptyString, + items: Schema.Array(TaxonomyItem), +}) + +export interface TaxonomyGroup extends Schema.Schema.Type {} + +export const FlowStep = Schema.Struct({ + screenId: Slug, + title: Schema.NonEmptyString, + trigger: Schema.optionalKey(Schema.NonEmptyString), + description: Schema.optionalKey(Schema.NonEmptyString), +}) + +export interface FlowStep extends Schema.Schema.Type {} + +export const Flow = Schema.Struct({ + id: Slug, + title: Schema.NonEmptyString, + group: Schema.NonEmptyString, + description: Schema.NonEmptyString, + replayable: Schema.Boolean, + steps: Schema.NonEmptyArray(FlowStep), +}) + +export interface Flow extends Schema.Schema.Type {} + +export const FrameArtifact = Schema.Struct({ + format: Schema.Literal("opencode-terminal-frame-v1"), + ...Frontend.CapturedFrame.fields, + cols: PositiveInt, + rows: PositiveInt, +}) + +export interface FrameArtifact extends Schema.Schema.Type {} + +export const Screen = Schema.Struct({ + id: Slug, + title: Schema.NonEmptyString, + category: ScreenCategory, + summary: Schema.String, + tags: Schema.Array(Schema.NonEmptyString), + screenLabels: Schema.Array(Schema.NonEmptyString), + uiElements: Schema.Array(Schema.NonEmptyString), + surfaces: Schema.Array(Surface), + patterns: Schema.Array(Pattern), + features: Schema.Array(Schema.NonEmptyString), + states: Schema.Array(ScreenState), + dimensions: Schema.Tuple([]), + viewport: Schema.Struct({ cols: PositiveInt, rows: PositiveInt }), + variations: Schema.Tuple([]), + frames: Schema.NonEmptyArray(Frame), +}) + +export interface Screen extends Schema.Schema.Type {} + +export const Catalog = Schema.Struct({ + format: Schema.Literal("opencode-terminal-catalog-v3"), + generatedBy: Schema.NonEmptyString, + variants: Schema.NonEmptyArray(Variant), + screenTaxonomy: Schema.Array(TaxonomyGroup), + uiElementTaxonomy: Schema.Array(TaxonomyGroup), + surfaces: Schema.Array(Surface), + patterns: Schema.Array(Pattern), + features: Schema.Array(Schema.NonEmptyString), + states: Schema.Array(ScreenState), + screens: Schema.Array(Screen), + flows: Schema.Array(Flow), +}) + +export interface Catalog extends Schema.Schema.Type {} + +export const CatalogIssue = Schema.Struct({ + path: Schema.NonEmptyString, + message: Schema.NonEmptyString, +}) + +export interface CatalogIssue extends Schema.Schema.Type {} + +export class CatalogBuildError extends Schema.TaggedErrorClass()("CatalogBuildError", { + issues: Schema.NonEmptyArray(CatalogIssue), +}) {} + +export class CatalogBoundaryError extends Schema.TaggedErrorClass()("CatalogBoundaryError", { + boundary: Schema.NonEmptyString, + cause: Schema.Defect(), +}) {} diff --git a/packages/lab/catalog/catalog/search-flows.test.ts b/packages/lab/catalog/catalog/search-flows.test.ts new file mode 100644 index 00000000000..1a46b5e0a4d --- /dev/null +++ b/packages/lab/catalog/catalog/search-flows.test.ts @@ -0,0 +1,25 @@ +import { describe, expect, test } from "bun:test" +import { searchLifecycleFlow } from "../scenarios/tools/search-lifecycle" +import { webLifecycleFlow } from "../scenarios/tools/web-lifecycle" + +describe("search and web executable flows", () => { + test("exports project search states in execution order", () => { + expect(searchLifecycleFlow.states.map((state) => state.address)).toEqual([ + "search-lifecycle/glob-success", + "search-lifecycle/glob-empty", + "search-lifecycle/grouped-exploration", + "search-lifecycle/grep-success", + "search-lifecycle/grep-empty", + "search-lifecycle/grep-failure", + ]) + }) + + test("exports renderer-specific web states", () => { + expect(webLifecycleFlow.states.map((state) => state.address)).toEqual([ + "web-lifecycle/webfetch-streaming", + "web-lifecycle/webfetch-success", + "web-lifecycle/websearch-running", + "web-lifecycle/websearch-failure", + ]) + }) +}) diff --git a/packages/lab/catalog/catalog/worker.test.ts b/packages/lab/catalog/catalog/worker.test.ts new file mode 100644 index 00000000000..2cf2fec2e18 --- /dev/null +++ b/packages/lab/catalog/catalog/worker.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, test } from "bun:test" +import wrangler from "../wrangler.jsonc" +import { assetPath } from "../worker" + +describe("catalog worker", () => { + test("serves the app shell for catalog routes", () => { + expect(assetPath("/lab/catalog")).toBe("/index.html") + expect(assetPath("/lab/catalog/")).toBe("/index.html") + expect(assetPath("/lab/catalog/deep-link")).toBe("/index.html") + }) + + test("strips the catalog prefix from assets", () => { + expect(assetPath("/lab/catalog/catalog.json")).toBe("/catalog.json") + expect(assetPath("/lab/catalog/captures/opencode/home.frame.json")).toBe("/captures/opencode/home.frame.json") + }) + + test("leaves HTML routing to the worker", () => { + expect(wrangler.assets.html_handling).toBe("none") + }) +}) diff --git a/packages/lab/catalog/compile/driver-consumer.ts b/packages/lab/catalog/compile/driver-consumer.ts new file mode 100644 index 00000000000..f90e34048c8 --- /dev/null +++ b/packages/lab/catalog/compile/driver-consumer.ts @@ -0,0 +1,22 @@ +import * as Effect from "effect/Effect" +import type * as Scope from "effect/Scope" +import { OpenCodeDriver } from "opencode-drive" + +type Equal = + (() => Value extends Left ? 1 : 2) extends () => Value extends Right ? 1 : 2 ? true : false + +type Assert = Value + +type Managed = ReturnType +declare const managed: Managed +const scoped = Effect.scoped(managed) +type Scoped = typeof scoped + +export type ManagedRequiresScope = Assert, Scope.Scope>> +export type ScopedIsRunnable = Assert, never>> + +declare const driver: OpenCodeDriver.Driver +export type PrimaryUiIsCanonical = Assert> +export type AdditionalUiIsCanonical = Assert< + Equal>["ui"], OpenCodeDriver.Ui> +> diff --git a/packages/lab/catalog/doctor.config.json b/packages/lab/catalog/doctor.config.json new file mode 100644 index 00000000000..b742877ec41 --- /dev/null +++ b/packages/lab/catalog/doctor.config.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://react.doctor/schema/config.json", + "ignore": { + "files": [".tmp/**"] + } +} diff --git a/packages/lab/catalog/package.json b/packages/lab/catalog/package.json new file mode 100644 index 00000000000..ffedb0f188e --- /dev/null +++ b/packages/lab/catalog/package.json @@ -0,0 +1,39 @@ +{ + "name": "@opencode-ai/lab-catalog", + "private": true, + "type": "module", + "packageManager": "bun@1.3.14", + "scripts": { + "generate": "bun ./scripts/generate-catalog.ts", + "capture": "bun ./scripts/capture-opencode-drive.ts", + "reproduce": "bun ./scripts/reproduce-state.ts", + "dev": "bun ./server.ts", + "lint": "cd ../../.. && bun run lint -- packages/lab/catalog/src packages/lab/catalog/catalog packages/lab/catalog/scripts packages/lab/catalog/scenarios packages/lab/catalog/server.ts packages/lab/catalog/worker.ts", + "typecheck": "tsc --noEmit", + "build": "rm -rf dist && bun build ./src/index.html --outdir dist --public-path=/lab/catalog/ --minify && cp -R public/captures public/catalog.json public/drive-captures.json dist/", + "deploy": "bun run generate && bun run build && bunx wrangler deploy", + "doctor": "bunx -y react-doctor@latest .", + "bench:capture-flow": "bun ./scripts/bench-capture-flow.ts", + "bench:capture-matrix": "bun ./scripts/bench-capture-matrix.ts", + "test": "bun test ./catalog", + "check": "bun run generate && git diff --exit-code -- public/catalog.json && bun run lint && bun run typecheck && bun run test && bun build ./src/index.html --outdir .tmp/build && bun build ./scripts/generate-catalog.ts --target=bun --outdir .tmp/scripts", + "drive:capture": "bun run capture" + }, + "dependencies": { + "@fontsource/commit-mono": "5.2.5", + "@fontsource/noto-sans-math": "5.2.8", + "@fontsource/noto-sans-symbols": "5.2.8", + "@fontsource/noto-sans-symbols-2": "5.2.8", + "react": "^19.2.7", + "react-dom": "^19.2.7" + }, + "devDependencies": { + "@types/bun": "catalog:", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "effect": "catalog:", + "opencode-drive": "workspace:*", + "typescript": "^7.0.2", + "wrangler": "4.110.0" + } +} diff --git a/packages/lab/catalog/perf/capture-feedback.md b/packages/lab/catalog/perf/capture-feedback.md new file mode 100644 index 00000000000..522545fecaa --- /dev/null +++ b/packages/lab/catalog/perf/capture-feedback.md @@ -0,0 +1,74 @@ +# Capture Feedback Performance + +## Goal + +Minimize edit-to-feedback latency for one catalog flow while preserving an isolated, reproducible full capture. + +## Benchmark + +```sh +bun run bench:capture-flow +``` + +The benchmark performs one warmup and seven measured runs of `search-lifecycle` against immutable OpenCode revision `5d5b33f195cc`. + +## Metrics + +- Primary: `capture_flow_total_median_ms` +- Secondary: preparation median, total MAD, best, and worst + +## Baseline + +Cold targeted capture before cache reuse: + +- Preparation: 24,261 ms +- Total: 48,642 ms + +The previous full-catalog-only workflow also replayed the baseline and every preceding flow before reporting a late failure, so it had no bounded per-flow feedback metric. + +## Hypotheses + +1. Reusing a revision-keyed immutable worktree removes repeated checkout and install cost. +2. Running all scenarios through one OpenCode process removes repeated server and TUI startup from full capture. +3. Staging frames outside `public` prevents failed experiments from contaminating authoritative artifacts. + +## Experiments + +### Revision-keyed worktree cache + +- Before: 48,642 ms cold targeted capture; 24,261 ms preparation +- After: 15,448 ms warm targeted median; 102 ms preparation median +- Spread: 4,077 ms MAD; 11,371 ms best; 22,619 ms worst +- Decision: keep + +The cache removes repeated checkout and dependency installation while retaining the exact resolved commit. `--fresh` remains available to deliberately rebuild the prepared checkout. + +### Registry-driven process reuse + +- Before: nine OpenCode server/TUI lifecycles for the baseline and eight lifecycle scenarios +- After: two lifecycles, grouped by the Drive controller's `queue` and `serve` response modes +- Full 60-state capture: 88,910 ms +- Scenario execution: approximately 40,100 ms; remaining time is baseline capture and two process lifecycles +- Decision: keep + +A single process cannot truthfully combine `queue` and dynamic `serve`: Drive deliberately locks each controller to one response mode. Grouping by declared scenario mode preserves that invariant while removing seven process launches. + +### Staged publication + +- Before: failed runs wrote partial and orphaned frames directly into `public/captures` +- After: full runs write to a unique staging tree and replace revision directories only after all scenarios pass +- Decision: keep for correctness; it does not target the latency metric + +### Registry-declared client isolation + +- Before: 150,825 ms with one fresh TUI client per scenario +- After: 142,652 ms with one shared client for reset-safe queue scenarios and isolated clients for assistant interruption and read permission +- Improvement: 5.4% +- Decision: keep + +The next pooling candidates require weakening explicit lifecycle guarantees for a small projected gain, so optimization stops here. + +## Dead Ends + +- Repeated full capture after each marker edit recreated and reinstalled the same revision. +- A manually prepared `/tmp` worktree reused Bun install metadata without creating complete local dependency links. diff --git a/packages/lab/catalog/perf/capture-matrix.md b/packages/lab/catalog/perf/capture-matrix.md new file mode 100644 index 00000000000..461bfbdbfa0 --- /dev/null +++ b/packages/lab/catalog/perf/capture-matrix.md @@ -0,0 +1,31 @@ +# Capture Matrix Performance + +## Goal + +Minimize authoritative three-theme capture wall time without sharing OpenCode driver state between themes or publishing partial results. + +## Benchmark + +```sh +bun run bench:capture-matrix +``` + +Primary metric: `capture_matrix_total_ms`. Correctness requires identical ordered screen coverage for Opencode, Tokyo Night, and Everforest before publication. + +## Baseline + +- Sequential three-theme capture: 465,542 ms +- Output: 65 screens per theme, 195 frames total + +## Experiment 1: Process-Isolated Theme Workers + +Hypothesis: theme captures can run concurrently when each owns a separate Bun process and `OpenCodeDriver` lifecycle. Earlier in-process concurrency was discarded because LLM and permission timing became nondeterministic. + +The coordinator now starts up to three theme workers, collects their staged outputs in requested order, and publishes only after every worker succeeds. A failed worker leaves the existing public manifest untouched. + +Final clean parallel run: 170,584 ms, a 2.73x speedup over the 465,509 ms sequential control. The first publication attempts exposed aggregation contract bugs; both were caught by generation validation and fixed before deployment. The final run captured and generated all 65 screens for each theme successfully. + +## Dead Ends + +- In-process variant concurrency: discarded after repeatable permission and LLM synchronization failures. +- Sharing one driver across scenarios: discarded because tool-result continuations leaked between scenario queues. diff --git a/packages/lab/catalog/public/captures/everforest/agent-picker.frame.json b/packages/lab/catalog/public/captures/everforest/agent-picker.frame.json new file mode 100644 index 00000000000..1a69d7ad81f --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/agent-picker.frame.json @@ -0,0 +1,680 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Select agent", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 37 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { + "text": "build The default agent. Executes tools based on con", + "fg": [45, 53, 59, 255], + "bg": [167, 192, 128, 255], + "attributes": 1, + "width": 52 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "plan", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " Read-only agent for exploring the codebase and ", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 48 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "reviewer", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { + "text": " Reviews deterministic UI fixtures", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 34 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/assistant-response-failed.frame.json b/packages/lab/catalog/public/captures/everforest/assistant-response-failed.frame.json new file mode 100644 index 00000000000..6a74cb6b790 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/assistant-response-failed.frame.json @@ -0,0 +1,517 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a successful streaming assistant response.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 64 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "This assistant response completes successfully.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 66 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 78ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a failed assistant response.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "This response starts but the simulated provider disconnects.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 53 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "Error: Decode error (200 POST https://api.openai.com/v1/chat/completions)", + "fg": [230, 126, 128, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 73 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 40 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "Build · Simulated Model · 293ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 31 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...d16a-1997-4fcb-8dcd-f7806b4739af/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/assistant-response-interrupted.frame.json b/packages/lab/catalog/public/captures/everforest/assistant-response-interrupted.frame.json new file mode 100644 index 00000000000..930a3381012 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/assistant-response-interrupted.frame.json @@ -0,0 +1,546 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [57, 67, 71, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [57, 67, 71, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [57, 67, 71, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [57, 67, 71, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [57, 67, 71, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a successful streaming assistant response.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 64 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "This assistant response completes successfully.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 66 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 78ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a failed assistant response.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "This response starts but the simulated provider disconnects.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 53 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "Error: Decode error (200 POST https://api.openai.com/v1/chat/completions)", + "fg": [230, 126, 128, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 73 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 40 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "Build · Simulated Model · 293ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 31 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Show an interrupted assistant response.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 72 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "This response remains active until the user interrupts it.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 55 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝⬝", "fg": [60, 77, 81, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/assistant-response-succeeded.frame.json b/packages/lab/catalog/public/captures/everforest/assistant-response-succeeded.frame.json new file mode 100644 index 00000000000..e780b5e5f8a --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/assistant-response-succeeded.frame.json @@ -0,0 +1,476 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [59, 69, 73, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [59, 69, 73, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [59, 69, 73, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [59, 69, 73, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [59, 69, 73, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a successful streaming assistant response.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 64 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "This assistant response completes successfully.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 66 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 78ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...d16a-1997-4fcb-8dcd-f7806b4739af/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/command-palette.frame.json b/packages/lab/catalog/public/captures/everforest/command-palette.frame.json new file mode 100644 index 00000000000..0e64e074286 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/command-palette.frame.json @@ -0,0 +1,741 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Commands", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 41 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Suggested", "fg": [214, 153, 182, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 3 }, + { "text": "Switch model", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [167, 192, 128, 255], + "attributes": 0, + "width": 32 + }, + { "text": "ctrl+x m", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "Connect an integration", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Open settings", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Session", "fg": [214, 153, 182, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Switch session", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 30 + }, + { "text": "ctrl+x l", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Buil", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "New session", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 33 + }, + { "text": "ctrl+x n", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀▀▀", "fg": [21, 26, 28, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "Open session or project", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 23 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 23 + }, + { "text": "ctrl+o", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "▀▀▀▀▀▀▀▀", "fg": [21, 26, 28, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "/privat", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Close tab", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { "text": "ctrl+x w", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "Reopen closed tab", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 23 + }, + { "text": "ctrl+shift+t", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/debug.frame.json b/packages/lab/catalog/public/captures/everforest/debug.frame.json new file mode 100644 index 00000000000..612460ed460 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/debug.frame.json @@ -0,0 +1,627 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Debug", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Version ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "local (local)", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Date ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "2026-08-12T19:26:35.902Z", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "OS ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "macOS 25.5.0 (arm64)", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 55 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Terminal ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "ghostty 1.3.1", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Session ID", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "n/a", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 72 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Model ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "simulation/gpt-sim-model", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Share this when reporting an issue.", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 39 + }, + { "text": "copy", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "enter", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/diff-viewer.frame.json b/packages/lab/catalog/public/captures/everforest/diff-viewer.frame.json new file mode 100644 index 00000000000..477908c9fa9 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/diff-viewer.frame.json @@ -0,0 +1,460 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "Diff ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "working tree", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 93 + }, + { "text": "0 files", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 } + ] + }, + { + "spans": [ + { + "text": "────────────────────────────────────────────────────────────────────────────────", + "fg": [133, 146, 137, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 80 + }, + { "text": "┃", "fg": [131, 192, 146, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [131, 192, 146, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "──", "fg": [133, 146, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "No changes to show", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 61 + }, + { "text": "┃", "fg": [131, 192, 146, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { + "text": "Debug info copied to clipboard", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 30 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [131, 192, 146, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 80 + }, + { "text": "┃", "fg": [131, 192, 146, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [131, 192, 146, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { + "text": "focus file tree", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "n ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "next file", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "] ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "next hunk", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "[ ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "previous hunk", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "previous file", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "d ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "switch source", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "m ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "mark reviewed", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "? ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "all", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/glob-empty.frame.json b/packages/lab/catalog/public/captures/everforest/glob-empty.frame.json new file mode 100644 index 00000000000..19ebdd3af2d --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/glob-empty.frame.json @@ -0,0 +1,530 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [62, 71, 74, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Find the TypeScript source files.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The first glob search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 659ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Find Rust files that do not exist.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty glob search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 146ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...3b2f-2b94-4593-a3bd-f3eedac32c25/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/glob-success.frame.json b/packages/lab/catalog/public/captures/everforest/glob-success.frame.json new file mode 100644 index 00000000000..825f2c35cc7 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/glob-success.frame.json @@ -0,0 +1,486 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 64, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [53, 64, 68, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 64, 68, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [53, 64, 68, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [53, 64, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Find the TypeScript source files.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The first glob search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 659ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...3b2f-2b94-4593-a3bd-f3eedac32c25/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/grep-empty.frame.json b/packages/lab/catalog/public/captures/everforest/grep-empty.frame.json new file mode 100644 index 00000000000..3b9247b5fed --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/grep-empty.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [61, 71, 74, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The grouped exploration is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 735ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for credits.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The matching grep search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 76 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 102ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for DEADBEEF.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty grep search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 113ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...3b2f-2b94-4593-a3bd-f3eedac32c25/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [230, 126, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/grep-failure.frame.json b/packages/lab/catalog/public/captures/everforest/grep-failure.frame.json new file mode 100644 index 00000000000..d3133b918d1 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/grep-failure.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [58, 68, 72, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [58, 68, 72, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [58, 68, 72, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [58, 68, 72, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [58, 68, 72, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The matching grep search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 76 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 102ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for DEADBEEF.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty grep search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 113ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Run an invalid regular expression search.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The invalid grep search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 110ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...3b2f-2b94-4593-a3bd-f3eedac32c25/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [230, 126, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/grep-success.frame.json b/packages/lab/catalog/public/captures/everforest/grep-success.frame.json new file mode 100644 index 00000000000..b9252fd5998 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/grep-success.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [55, 66, 70, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [55, 66, 70, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [55, 66, 70, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [55, 66, 70, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 66, 70, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty glob search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 146ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Explore TypeScript files and search them for credits together.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 62 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 2 searches", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 90 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The grouped exploration is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 735ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for credits.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The matching grep search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 76 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 102ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...3b2f-2b94-4593-a3bd-f3eedac32c25/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [230, 126, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/grouped-exploration.frame.json b/packages/lab/catalog/public/captures/everforest/grouped-exploration.frame.json new file mode 100644 index 00000000000..c2c3b59ee3c --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/grouped-exploration.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [68, 75, 79, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [68, 75, 79, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [68, 75, 79, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [68, 75, 79, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [68, 75, 79, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The first glob search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 659ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Find Rust files that do not exist.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty glob search is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 146ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Explore TypeScript files and search them for credits together.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 62 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 2 searches", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 90 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The grouped exploration is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 735ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...3b2f-2b94-4593-a3bd-f3eedac32c25/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [230, 126, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/help.frame.json b/packages/lab/catalog/public/captures/everforest/help.frame.json new file mode 100644 index 00000000000..44a45c895aa --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/help.frame.json @@ -0,0 +1,678 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Help", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": "esc/enter", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Press ctrl+p to see all available actions and commands ", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 55 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "in any context.", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 3 }, + { "text": "ok", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/home.frame.json b/packages/lab/catalog/public/captures/everforest/home.frame.json new file mode 100644 index 00000000000..d7fd327adb6 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/home.frame.json @@ -0,0 +1,616 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "New session", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ▄ ", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 1, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 40 + }, + { + "text": "█▀▀█ █▀▀█ █▀▀█ █▀▀▄", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "█▀▀▀ █▀▀█ █▀▀█ █▀▀█", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 1, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 40 + }, + { "text": "█", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [122, 132, 120, 255], "bg": [64, 73, 74, 255], "attributes": 0, "width": 2 }, + { "text": "█ █", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [122, 132, 120, 255], "bg": [64, 73, 74, 255], "attributes": 0, "width": 2 }, + { "text": "█ █", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "▀▀▀", "fg": [122, 132, 120, 255], "bg": [64, 73, 74, 255], "attributes": 0, "width": 3 }, + { "text": " █", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [122, 132, 120, 255], "bg": [64, 73, 74, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [87, 89, 87, 255], "attributes": 1, "width": 3 }, + { "text": " █", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 1, "width": 2 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [87, 89, 87, 255], "attributes": 1, "width": 2 }, + { "text": "█ █", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [87, 89, 87, 255], "attributes": 1, "width": 2 }, + { "text": "█ █", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 1, "width": 3 }, + { "text": "▀▀▀", "fg": [211, 198, 170, 255], "bg": [87, 89, 87, 255], "attributes": 1, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 40 + }, + { + "text": "▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 16 + }, + { "text": "▀▀", "fg": [64, 73, 74, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "▀", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 1, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask anything... \"Fix a TODO in the codebase\"", + "fg": [122, 132, 120, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-45e13804d277/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/integration-picker.frame.json b/packages/lab/catalog/public/captures/everforest/integration-picker.frame.json new file mode 100644 index 00000000000..305931d8c4a --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/integration-picker.frame.json @@ -0,0 +1,729 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "Connect an integration", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 1, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 27 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Popular", "fg": [214, 153, 182, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 3 }, + { "text": "OpenCode", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [167, 192, 128, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "openai", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "github-copilot", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 42 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Services", "fg": [214, 153, 182, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 48 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "azure", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Buil", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "cloudflare-ai-gateway", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀▀▀", "fg": [21, 26, 28, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "cloudflare-workers-ai", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { "text": "▀▀▀▀▀▀▀▀", "fg": [21, 26, 28, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "/privat", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Exa", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 53 + }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Firecrawl", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/mcp-list.frame.json b/packages/lab/catalog/public/captures/everforest/mcp-list.frame.json new file mode 100644 index 00000000000..8c621f3fec6 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/mcp-list.frame.json @@ -0,0 +1,676 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "MCP servers", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 38 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "No items available", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "connect space", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/model-picker.frame.json b/packages/lab/catalog/public/captures/everforest/model-picker.frame.json new file mode 100644 index 00000000000..c3cdf888187 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/model-picker.frame.json @@ -0,0 +1,687 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Select model", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 37 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [45, 53, 59, 255], + "bg": [167, 192, 128, 255], + "attributes": 1, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [167, 192, 128, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "View all integrations", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ctrl+a", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/pair.frame.json b/packages/lab/catalog/public/captures/everforest/pair.frame.json new file mode 100644 index 00000000000..5387c7219f9 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/pair.frame.json @@ -0,0 +1,813 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Pair", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 77 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "This device", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 30 + }, + { + "text": "█▀▀▀▀▀▀▀███▀███▀█▀██▀▀▀█▀██▀████▀██▀▀▀▀▀▀▀█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "http://localhost:60113", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 19 + }, + { + "text": "█ █▀▀▀█ █▄▄ ▄▄█▀▄██▄▀ ▀█▀▀▄█▄▀▄▀█▄█ █▀▀▀█ █", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █ █ █▄▄ ▀ █▀ ▀█▄▄▀▀▀██▄▀▄▄▄▀▀ █ █ █ █", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "URLs", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 37 + }, + { + "text": "█ ▀▀▀▀▀ █ ▄ ▄ █▀█▀█ ▄▀▄ █▀█▀▄▀▄ █▀█ ▀▀▀▀▀ █", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "http://127.0.0.1:60113", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 19 + }, + { + "text": "█▀▀▀▀▀█▀▀▀▄███▀▀█▄▀▄ ▄▄ ▀█▀█▄ ▀ ▄▀▀█▀█▀█▀██", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█████▄▄▀▄▄█▀▀▀ ▀▀█ ▄▄▄▀▄▄██▄▀█▀▀▄▀ ▄▄ █▄██", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Username", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 33 + }, + { + "text": "██▀ ▄█▄▀ █▄█▀█▄▀▄ ▄▄▄█ █▀▀ ████ ▄███▄ ▀███", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "opencode", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 33 + }, + { + "text": "█ ▀▄▄█▀▀▄▀▀██▄██ ▀█▄█▀▄█▄███ ▀▄█ ▀ ▀ █▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█▀▄███▄▀██ █ ▀ █▀█▀▄▄▀▄▄▀▄ ▀▀██▄█▄▄ █ ▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Password", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 33 + }, + { + "text": "██▄▀███▀█▀▄▄▄ █▄▀██ ▄█▀▀▄▀ ▄▀▀▀▄▄▀█▄▀▄█▀███", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "************", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 29 + }, + { + "text": "█▄▀▀▄▄█▀ ▀█▄█▀█▄▀██▀ ▀ ▀▄ ▀▀ ▀▀ █▀▀▄▀ ▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█▄█▄ █▄▀▀▄█▄▀▀▀▄▄▄ █▄▄█▀▄██▄▀▀ █▄█▄▄ ▄██ ▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Run `opencode service set ", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 15 + }, + { + "text": "█ ▀▀▀▄▄▀██▀ ▀▀ █▄▀▄▄▀▄▀ ▀▄▀ ▀ █▄█ ▄▀▀ █", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "hostname 0.0.0.0` to access ", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 28 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 13 }, + { + "text": "██▀█ ▀▀▀▀█▄▀▄▀ ▀▀ ▄▄█ ▀▄ █▄▀███▄██ ▄▄▄▄ ▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "the service remotely.", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 20 + }, + { + "text": "█ ▄█▄ ▀ ▄▄▄▄▀ ▄▄▄█▄ ▀▀▀ █▄▀▀ ████▀ ▀ █", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █▄█▀█▀█ ▀▀█▄▀█ ▀▀ ▄█ ▄██▀█ █▀█ ▄▄▄ ▄██▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █▀ █▀▀▄▀███▄▀ █▀█▀█▄ ▄▀▀▄▄█▀ ▀ █ ▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█▀▀▀▀▀▀▀█ █▄▄██▄▀▄█ ▄▀▄▀▄▄▀█▀█▀▄ █▀█ ▀▀▀▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █▀▀▀█ █▀▀█ ▀█▄ ▄█▀█ ▄▀▀▀█▀ █▀██ ▀▀▀ █▀ ▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █ █ █ ▄▀▀▀ ▄▄ █▄▀▀▀▄█▀█▀ ████▀▄▀▄██▄█", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/patch-created.frame.json b/packages/lab/catalog/public/captures/everforest/patch-created.frame.json new file mode 100644 index 00000000000..d866eb4fe2b --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/patch-created.frame.json @@ -0,0 +1,498 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [168, 192, 129, 255], "bg": [57, 68, 71, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [55, 66, 70, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [55, 66, 70, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 66, 70, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "# Created", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-e99c412a-cd6f-4e30-9649-e0848a987eaf/files/patched.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "created by patch", + "fg": [211, 198, 170, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [94, 133, 131, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [60, 77, 81, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [68, 90, 92, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [80, 110, 110, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/patch-deleted.frame.json b/packages/lab/catalog/public/captures/everforest/patch-deleted.frame.json new file mode 100644 index 00000000000..b3c6c158e36 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/patch-deleted.frame.json @@ -0,0 +1,558 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 73, 76, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [168, 192, 129, 255], "bg": [60, 69, 73, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [57, 67, 71, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [57, 67, 71, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [57, 67, 71, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "# Created", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-e99c412a-cd6f-4e30-9649-e0848a987eaf/files/patched.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "created by patch", + "fg": [211, 198, 170, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-e99c412a-cd6f-4e30-9649-e0848a987eaf/files/fixture.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "updated by patch", + "fg": [211, 198, 170, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "# Deleted", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-e99c412a-cd6f-4e30-9649-e0848a987eaf/files/patched.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "-1 line", "fg": [197, 59, 83, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "⬝", "fg": [89, 126, 124, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [60, 77, 81, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [68, 90, 92, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [80, 110, 110, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝", "fg": [89, 126, 124, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/patch-failed.frame.json b/packages/lab/catalog/public/captures/everforest/patch-failed.frame.json new file mode 100644 index 00000000000..a44b6d017fd --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/patch-failed.frame.json @@ -0,0 +1,577 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 73, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [180, 184, 142, 255], "bg": [64, 74, 76, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 77, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [211, 198, 170, 255], "bg": [66, 75, 77, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [211, 198, 170, 255], "bg": [67, 75, 78, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [68, 76, 78, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [211, 198, 170, 255], "bg": [69, 77, 78, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [211, 198, 170, 255], "bg": [69, 77, 79, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [211, 198, 170, 255], "bg": [69, 78, 79, 255], "attributes": 1, "width": 1 }, + { "text": "de D", "fg": [211, 198, 170, 255], "bg": [70, 78, 79, 255], "attributes": 1, "width": 4 }, + { "text": "r", "fg": [211, 198, 170, 255], "bg": [69, 77, 78, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [211, 198, 170, 255], "bg": [65, 75, 77, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [211, 198, 170, 255], "bg": [62, 72, 74, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [61, 71, 74, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [49, 58, 65, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-e99c412a-cd6f-4e30-9649-e0848a987eaf/files/fixture.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "updated by patch", + "fg": [211, 198, 170, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "# Deleted", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-e99c412a-cd6f-4e30-9649-e0848a987eaf/files/patched.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "-1 line", "fg": [197, 59, 83, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "# Patch failed", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 14 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "missing-patch.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "patch verification failed: Failed to read file to update /private/var/folders/dd/", + "fg": [230, 126, 128, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 81 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 30 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-e99c412a-cd6f-4e30-9649-e0848a987eaf/files/missing-patch.", + "fg": [230, 126, 128, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 109 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "txt: file does not exist", + "fg": [230, 126, 128, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 87 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The patch file-change lifecycle is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 69 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 3.1s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...412a-cd6f-4e30-9649-e0848a987eaf/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/patch-input-streaming.frame.json b/packages/lab/catalog/public/captures/everforest/patch-input-streaming.frame.json new file mode 100644 index 00000000000..81b652e712e --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/patch-input-streaming.frame.json @@ -0,0 +1,481 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 76, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [168, 192, 129, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [60, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [60, 70, 73, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [60, 70, 73, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⠸", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [94, 133, 131, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [60, 77, 81, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [68, 90, 92, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [80, 110, 110, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/patch-success.frame.json b/packages/lab/catalog/public/captures/everforest/patch-success.frame.json new file mode 100644 index 00000000000..c906a0b2d3e --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/patch-success.frame.json @@ -0,0 +1,509 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 65, 70, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [54, 65, 70, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 65, 70, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [54, 65, 70, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [54, 65, 70, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-45e13804d277/files/fixture.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [211, 198, 170, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.9s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...e25f-6338-4d9f-ad75-45e13804d277/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/patch-updated.frame.json b/packages/lab/catalog/public/captures/everforest/patch-updated.frame.json new file mode 100644 index 00000000000..dd7e092ec0c --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/patch-updated.frame.json @@ -0,0 +1,538 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 73, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [168, 192, 129, 255], "bg": [60, 70, 73, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [57, 68, 71, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [57, 68, 71, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [57, 68, 71, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "# Created", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-e99c412a-cd6f-4e30-9649-e0848a987eaf/files/patched.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "created by patch", + "fg": [211, 198, 170, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-e99c412a-cd6f-4e30-9649-e0848a987eaf/files/fixture.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "updated by patch", + "fg": [211, 198, 170, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "⬝", "fg": [89, 126, 124, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [60, 77, 81, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [68, 90, 92, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [80, 110, 110, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝", "fg": [89, 126, 124, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/permission-always-confirmation.frame.json b/packages/lab/catalog/public/captures/everforest/permission-always-confirmation.frame.json new file mode 100644 index 00000000000..d50d5b55f51 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/permission-always-confirmation.frame.json @@ -0,0 +1,493 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "OpenC", "fg": [211, 198, 170, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 5 }, + { "text": "od", "fg": [211, 198, 170, 255], "bg": [63, 73, 75, 255], "attributes": 1, "width": 2 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [64, 74, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [65, 74, 76, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [211, 198, 170, 255], "bg": [66, 74, 76, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [211, 198, 170, 255], "bg": [67, 75, 77, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [211, 198, 170, 255], "bg": [68, 76, 78, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [211, 198, 170, 255], "bg": [69, 77, 78, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [69, 77, 79, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [69, 78, 79, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [70, 79, 80, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [71, 79, 80, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [70, 78, 80, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [67, 75, 77, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 73, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 6 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⠙", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Always allow", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 97 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "This will allow edit until OpenCode is restarted.", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "Confirm", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Cancel", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 68 + }, + { "text": "⇆ ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/permission-always-selected.frame.json b/packages/lab/catalog/public/captures/everforest/permission-always-selected.frame.json new file mode 100644 index 00000000000..339c4bce0d0 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/permission-always-selected.frame.json @@ -0,0 +1,543 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [62, 72, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 74, 255], "attributes": 0, "width": 1 }, + { "text": "OpenC", "fg": [211, 198, 170, 255], "bg": [62, 72, 74, 255], "attributes": 1, "width": 5 }, + { "text": "o", "fg": [211, 198, 170, 255], "bg": [63, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [211, 198, 170, 255], "bg": [64, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [64, 73, 76, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [65, 74, 76, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [211, 198, 170, 255], "bg": [66, 75, 77, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [211, 198, 170, 255], "bg": [67, 76, 77, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [211, 198, 170, 255], "bg": [67, 76, 78, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [211, 198, 170, 255], "bg": [68, 77, 79, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [69, 78, 79, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [70, 78, 80, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [70, 79, 80, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [71, 79, 80, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [69, 77, 79, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 74, 255], "attributes": 0, "width": 7 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": "45e13804d277/files/fixture.txt", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [211, 198, 170, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": "Allow once", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "Allow always", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Reject", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/permission-fullscreen.frame.json b/packages/lab/catalog/public/captures/everforest/permission-fullscreen.frame.json new file mode 100644 index 00000000000..b6b66f7e270 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/permission-fullscreen.frame.json @@ -0,0 +1,558 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode D", "fg": [211, 198, 170, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 10 }, + { "text": "r", "fg": [211, 198, 170, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": "iv", "fg": [211, 198, 170, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 2 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [63, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 73, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 73, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 74, 76, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 77, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 73, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 2 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": "45e13804d277/files/fixture.txt", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [211, 198, 170, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": "Allow once", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": "Allow always", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "Reject", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 32 + }, + { "text": "ctrl+f ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": "minimize", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/permission-prompt.frame.json b/packages/lab/catalog/public/captures/everforest/permission-prompt.frame.json new file mode 100644 index 00000000000..ee48b166d0c --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/permission-prompt.frame.json @@ -0,0 +1,543 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "Open", "fg": [211, 198, 170, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 4 }, + { "text": "C", "fg": [211, 198, 170, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [211, 198, 170, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [211, 198, 170, 255], "bg": [63, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [64, 72, 76, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [65, 73, 76, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [211, 198, 170, 255], "bg": [66, 74, 76, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [211, 198, 170, 255], "bg": [66, 75, 77, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [211, 198, 170, 255], "bg": [67, 76, 77, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [211, 198, 170, 255], "bg": [68, 76, 78, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [68, 77, 78, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [69, 78, 79, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [70, 78, 79, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [67, 76, 77, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 7 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": "45e13804d277/files/fixture.txt", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [211, 198, 170, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "Allow once", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Allow always", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": "Reject", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/permission-reject-selected.frame.json b/packages/lab/catalog/public/captures/everforest/permission-reject-selected.frame.json new file mode 100644 index 00000000000..1cf02abdef0 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/permission-reject-selected.frame.json @@ -0,0 +1,542 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "OpenC", "fg": [211, 198, 170, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 5 }, + { "text": "o", "fg": [211, 198, 170, 255], "bg": [63, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [211, 198, 170, 255], "bg": [63, 73, 75, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [64, 73, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [64, 74, 76, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [211, 198, 170, 255], "bg": [65, 74, 76, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [211, 198, 170, 255], "bg": [66, 75, 77, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [211, 198, 170, 255], "bg": [67, 75, 77, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [211, 198, 170, 255], "bg": [68, 76, 78, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [69, 77, 78, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [69, 78, 79, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [70, 79, 80, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [69, 77, 78, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 6 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⠙", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": "45e13804d277/files/fixture.txt", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [211, 198, 170, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": "Allow once", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": "Allow always", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "Reject", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 30 + }, + { "text": "ctrl+f ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/question-awaiting-form.frame.json b/packages/lab/catalog/public/captures/everforest/question-awaiting-form.frame.json new file mode 100644 index 00000000000..b77959d8e82 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/question-awaiting-form.frame.json @@ -0,0 +1,539 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [62, 72, 75, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 2 questions", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Runtime", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": "Validation", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": "Confirm", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "1.", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Bun", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 105 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the repository's configured runtime.", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 68 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "2.", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Node", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the Node.js compatibility runtime.", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "3.", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Type your own answer", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "tab", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/question-denied.frame.json b/packages/lab/catalog/public/captures/everforest/question-denied.frame.json new file mode 100644 index 00000000000..2e560d49eb8 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/question-denied.frame.json @@ -0,0 +1,582 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [49, 58, 65, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Bun", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 108 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Which validation should run?", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Focused", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The catalog answers were submitted.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 78 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 6.7s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask one more runtime question that I will dismiss.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 61 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 1 question", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "1.", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Bun", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 105 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the repository's configured runtime.", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 68 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "2.", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Node", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the Node.js compatibility runtime.", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "3.", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Type your own answer", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 75 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/question-input-streaming.frame.json b/packages/lab/catalog/public/captures/everforest/question-input-streaming.frame.json new file mode 100644 index 00000000000..e3b94e9e79f --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/question-input-streaming.frame.json @@ -0,0 +1,478 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 76, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [168, 192, 129, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [60, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [60, 70, 73, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [60, 70, 73, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "⠸", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Asking questions...", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [94, 133, 131, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [60, 77, 81, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [68, 90, 92, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [80, 110, 110, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/question-prompt.frame.json b/packages/lab/catalog/public/captures/everforest/question-prompt.frame.json new file mode 100644 index 00000000000..fed466d067b --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/question-prompt.frame.json @@ -0,0 +1,586 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [62, 72, 75, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-45e13804d277/files/fixture.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [211, 198, 170, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.9s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me about the fixture direction.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 1 question", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Which direction should the fixture take?", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "1.", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Keep it minimal (Recommended)", + "fg": [167, 192, 128, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { + "text": "Small deterministic fixture", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "2.", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Expand coverage", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 93 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { + "text": "Add more scripted states", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 84 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "3.", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Type your own answer", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 75 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/question-review.frame.json b/packages/lab/catalog/public/captures/everforest/question-review.frame.json new file mode 100644 index 00000000000..1317cf8ab09 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/question-review.frame.json @@ -0,0 +1,498 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [62, 72, 75, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 2 questions", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Runtime", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": "Validation", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": "Confirm", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Review", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 105 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Runtime:", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Bun", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Validation:", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Focused", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 92 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "tab", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": "scroll", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 68 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/question-succeeded.frame.json b/packages/lab/catalog/public/captures/everforest/question-succeeded.frame.json new file mode 100644 index 00000000000..ee13b309d73 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/question-succeeded.frame.json @@ -0,0 +1,525 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [61, 70, 73, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [61, 70, 73, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [61, 70, 73, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "# Questions", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Bun", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 108 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Which validation should run?", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Focused", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The catalog answers were submitted.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 78 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 6.7s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...8af6-01b9-4a6f-9954-e29745cc69aa/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/read-denied.frame.json b/packages/lab/catalog/public/captures/everforest/read-denied.frame.json new file mode 100644 index 00000000000..3f7c137ccc2 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/read-denied.frame.json @@ -0,0 +1,575 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [62, 71, 74, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [101, 110, 103, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "Explored", "fg": [101, 110, 103, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "—", "fg": [101, 110, 103, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [101, 110, 103, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "read", "fg": [101, 110, 103, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture read succeeded.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 604ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Now try to read a missing file.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 31 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 80 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 read", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The missing-file read failed as expected.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 72 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 151ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Now read the ledger file.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [230, 152, 117, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Read src/ledger.ts", + "fg": [230, 152, 117, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 93 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Read src/ledger.ts", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Path: src/ledger.ts", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 92 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "Allow once", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Allow always", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": "Reject", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/read-input-streaming.frame.json b/packages/lab/catalog/public/captures/everforest/read-input-streaming.frame.json new file mode 100644 index 00000000000..d324e4b936d --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/read-input-streaming.frame.json @@ -0,0 +1,478 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [62, 72, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 74, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [62, 72, 74, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [62, 72, 74, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Read the fixture file.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "⠹", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Exploring — 1 read", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 93 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [60, 77, 81, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [68, 90, 92, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [80, 110, 110, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝", "fg": [84, 117, 116, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/read-permission.frame.json b/packages/lab/catalog/public/captures/everforest/read-permission.frame.json new file mode 100644 index 00000000000..5e1c09dd160 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/read-permission.frame.json @@ -0,0 +1,505 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [67, 75, 77, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [230, 152, 117, 255], "bg": [65, 74, 76, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [211, 198, 170, 255], "bg": [58, 69, 72, 255], "attributes": 1, "width": 1 }, + { "text": "penCode Drive", "fg": [211, 198, 170, 255], "bg": [57, 68, 72, 255], "attributes": 1, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [57, 68, 72, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Read the fixture file.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [230, 152, 117, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Read fixture.txt", + "fg": [230, 152, 117, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [230, 152, 117, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Read fixture.txt", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 91 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Path: fixture.txt", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 94 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "Allow once", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Allow always", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": "Reject", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/read-succeeded.frame.json b/packages/lab/catalog/public/captures/everforest/read-succeeded.frame.json new file mode 100644 index 00000000000..04815fa1b1e --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/read-succeeded.frame.json @@ -0,0 +1,486 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 64, 69, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [53, 64, 69, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 64, 69, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [53, 64, 69, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [53, 64, 69, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Read the fixture file.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 read", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture read succeeded.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 604ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...d8f1-35a2-4ee5-8b7d-3a4920c0bc28/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/session-export.frame.json b/packages/lab/catalog/public/captures/everforest/session-export.frame.json new file mode 100644 index 00000000000..b517aa75e33 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/session-export.frame.json @@ -0,0 +1,647 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Drive", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Change", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "from", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "after.", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-45e13804d277/files/fixture.txt", + "fg": [50, 54, 49, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [87, 82, 70, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [87, 82, 70, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Export session", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 39 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Export as:", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "◉ Markdown", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": "○ JSON", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "[x]", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Include thinking", + "fg": [167, 192, 128, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 31 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 4 }, + { "text": "Copy", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": "Export", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...e25f-6338-4d9f-ad75-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/session-fork.frame.json b/packages/lab/catalog/public/captures/everforest/session-fork.frame.json new file mode 100644 index 00000000000..35ec70d88dc --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/session-fork.frame.json @@ -0,0 +1,574 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Drive", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Change", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "from", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "after.", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-45e13804d277/files/fixture.txt", + "fg": [50, 54, 49, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "befo", "fg": [87, 82, 70, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "afte", "fg": [87, 82, 70, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Fork session", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 65 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "fixtur", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "Full session", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [167, 192, 128, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Si", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 33 + }, + { "text": "3:26 PM", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...e25f-6338-4d9f-ad75-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/session-picker-populated.frame.json b/packages/lab/catalog/public/captures/everforest/session-picker-populated.frame.json new file mode 100644 index 00000000000..ed7c8e78aed --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/session-picker-populated.frame.json @@ -0,0 +1,620 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "DriveCatalog", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "cap", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": "t", "fg": [74, 70, 62, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [58, 57, 51, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [42, 44, 42, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [27, 30, 31, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [42, 45, 42, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [42, 45, 42, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-45e13804d277/files/fixture.txt", + "fg": [42, 45, 42, 255], + "bg": [20, 24, 27, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [87, 82, 70, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [87, 82, 70, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Si", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Sessions", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 69 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "me", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "abo", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Today", "fg": [214, 153, 182, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { + "text": "OpenCode DriveCatalog capture session", + "fg": [45, 53, 59, 255], + "bg": [167, 192, 128, 255], + "attributes": 1, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [167, 192, 128, 255], + "attributes": 0, + "width": 46 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "#", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Question", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "delete", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ctrl+d", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "rename", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ctrl+r", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { "text": "all projects", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "ctrl+a", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Which", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "dire", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Keep", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "it", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "minimal", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "(Recommended)", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 82 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "Keeping", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "minimal.", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "216ms", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...e25f-6338-4d9f-ad75-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/session-picker.frame.json b/packages/lab/catalog/public/captures/everforest/session-picker.frame.json new file mode 100644 index 00000000000..6fe0669f04a --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/session-picker.frame.json @@ -0,0 +1,628 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Sessions", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 69 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "No sessions available", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "delete ctrl+d", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "rename ctrl+r", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { "text": "all projects", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "ctrl+a", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/session-rename.frame.json b/packages/lab/catalog/public/captures/everforest/session-rename.frame.json new file mode 100644 index 00000000000..7c4bca4c3b8 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/session-rename.frame.json @@ -0,0 +1,602 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [22, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [69, 79, 53, 255], "bg": [22, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [22, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [87, 82, 70, 255], "bg": [22, 26, 28, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [22, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Drive", "fg": [87, 82, 70, 255], "bg": [22, 26, 28, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [22, 26, 28, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Change", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "from", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "after.", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-c471e25f-6338-4d9f-ad75-45e13804d277/files/fixture.txt", + "fg": [50, 54, 49, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [87, 82, 70, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [87, 82, 70, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Rename session", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 39 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...e25f-6338-4d9f-ad75-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/session-tabs-idle.frame.json b/packages/lab/catalog/public/captures/everforest/session-tabs-idle.frame.json new file mode 100644 index 00000000000..b207ebe3159 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/session-tabs-idle.frame.json @@ -0,0 +1,481 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [70, 79, 80, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [188, 181, 151, 255], "bg": [71, 79, 80, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [71, 79, 80, 255], "attributes": 0, "width": 1 }, + { "text": "Op", "fg": [211, 198, 170, 255], "bg": [71, 79, 80, 255], "attributes": 1, "width": 2 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [69, 78, 79, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [211, 198, 170, 255], "bg": [66, 74, 76, 255], "attributes": 1, "width": 1 }, + { "text": "Code Drive", "fg": [211, 198, 170, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 73, 75, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 73, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [66, 74, 77, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [67, 75, 77, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [68, 76, 78, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [68, 77, 78, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [69, 78, 79, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Audit the current tab state.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "Working on a tab audit.Tab audit complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 42 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 71 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 2.1s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...6791-5962-41f3-a342-e9aa6450e7c8/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/session-tabs-running.frame.json b/packages/lab/catalog/public/captures/everforest/session-tabs-running.frame.json new file mode 100644 index 00000000000..41620ff9dc2 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/session-tabs-running.frame.json @@ -0,0 +1,472 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 65, 69, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [54, 65, 69, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 65, 69, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [54, 65, 69, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [54, 65, 69, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Audit the current tab state.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "Working on a tab audit.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 23 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 90 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝", "fg": [65, 85, 88, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/shell-execute-failed.frame.json b/packages/lab/catalog/public/captures/everforest/shell-execute-failed.frame.json new file mode 100644 index 00000000000..ab7b24dc7cc --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/shell-execute-failed.frame.json @@ -0,0 +1,556 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [61, 70, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 70, 74, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Dr", "fg": [211, 198, 170, 255], "bg": [61, 70, 74, 255], "attributes": 1, "width": 11 }, + { "text": "iv", "fg": [211, 198, 170, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 2 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [62, 72, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 73, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 74, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [66, 75, 77, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [67, 76, 78, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [68, 77, 78, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [69, 77, 79, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [69, 78, 79, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [70, 78, 79, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [68, 77, 78, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 73, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 70, 74, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 1.4s", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "$", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "printf catalog-shell-success", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Tool result declared output without an output schema", + "fg": [230, 126, 128, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 52 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 59 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The successful shell command completed.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 74 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 3.0s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Now run one failing foreground shell command.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⠇", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "catalog-shell-fail", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 91 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The shell lifecycle is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 32 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 81 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.6s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...df42-0409-406d-933a-07fb0ca4a1d8/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/shell-execute-succeeded.frame.json b/packages/lab/catalog/public/captures/everforest/shell-execute-succeeded.frame.json new file mode 100644 index 00000000000..b1a03fbc66b --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/shell-execute-succeeded.frame.json @@ -0,0 +1,520 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [55, 66, 70, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [55, 66, 70, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [55, 66, 70, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode D", "fg": [211, 198, 170, 255], "bg": [55, 66, 70, 255], "attributes": 1, "width": 10 }, + { "text": "r", "fg": [211, 198, 170, 255], "bg": [56, 67, 71, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [211, 198, 170, 255], "bg": [57, 67, 71, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [211, 198, 170, 255], "bg": [57, 68, 72, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [58, 69, 72, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [59, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [60, 71, 73, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 73, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 74, 76, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 74, 76, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 73, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [58, 69, 72, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [55, 66, 70, 255], "attributes": 0, "width": 2 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 1.4s", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "$", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "printf catalog-shell-success", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Tool result declared output without an output schema", + "fg": [230, 126, 128, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 52 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 59 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The successful shell command completed.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 74 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 3.0s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...df42-0409-406d-933a-07fb0ca4a1d8/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/shell-input-streaming.frame.json b/packages/lab/catalog/public/captures/everforest/shell-input-streaming.frame.json new file mode 100644 index 00000000000..0bd6343f58c --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/shell-input-streaming.frame.json @@ -0,0 +1,489 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [173, 193, 134, 255], "bg": [63, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 73, 75, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [211, 198, 170, 255], "bg": [63, 73, 75, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [211, 198, 170, 255], "bg": [63, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [60, 70, 73, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [211, 198, 170, 255], "bg": [56, 66, 70, 255], "attributes": 1, "width": 1 }, + { "text": "Code Drive", "fg": [211, 198, 170, 255], "bg": [54, 64, 69, 255], "attributes": 1, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [54, 64, 69, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "Thought", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 104 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "Writing command...", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 91 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝⬝⬝⬝⬝⬝⬝", "fg": [71, 96, 98, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/shell-output-streaming.frame.json b/packages/lab/catalog/public/captures/everforest/shell-output-streaming.frame.json new file mode 100644 index 00000000000..8299d61ffba --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/shell-output-streaming.frame.json @@ -0,0 +1,495 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCo", "fg": [211, 198, 170, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 6 }, + { "text": "d", "fg": [211, 198, 170, 255], "bg": [53, 64, 68, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [53, 64, 69, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [54, 65, 69, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [211, 198, 170, 255], "bg": [55, 65, 70, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [211, 198, 170, 255], "bg": [56, 66, 70, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [211, 198, 170, 255], "bg": [57, 67, 71, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [211, 198, 170, 255], "bg": [58, 68, 72, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [59, 69, 72, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [60, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 71, 74, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 74, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [58, 68, 72, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 65, 69, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 1.4s", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "printf catalog-shell-success", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝⬝⬝⬝⬝⬝⬝", "fg": [83, 114, 114, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/skill-picker.frame.json b/packages/lab/catalog/public/captures/everforest/skill-picker.frame.json new file mode 100644 index 00000000000..9d3e3e8c8be --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/skill-picker.frame.json @@ -0,0 +1,619 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Skills", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 3 }, + { + "text": "OpenCode Use this skill for any question about OpenCode itself, including how Op", + "fg": [45, 53, 59, 255], + "bg": [167, 192, 128, 255], + "attributes": 1, + "width": 80 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Report ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { + "text": " Use when the user wants to report an opencode issue or bug. Collect sta", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 72 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/status.frame.json b/packages/lab/catalog/public/captures/everforest/status.frame.json new file mode 100644 index 00000000000..228f79935a0 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/status.frame.json @@ -0,0 +1,669 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Status", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 47 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "No MCP servers", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": "█", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀", "fg": [50, 54, 49, 255], "bg": [26, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 37, 36, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 37, 36, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 37, 36, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 1 }, + { "text": "▀▀▀", "fg": [87, 82, 70, 255], "bg": [36, 37, 36, 255], "attributes": 1, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": "▀▀▀▀", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "█▀▀▀", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀", "fg": [26, 30, 30, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "▀", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 1, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/subagent-completed.frame.json b/packages/lab/catalog/public/captures/everforest/subagent-completed.frame.json new file mode 100644 index 00000000000..9d29c89385d --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/subagent-completed.frame.json @@ -0,0 +1,494 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [59, 69, 73, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [58, 68, 72, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Driv", "fg": [211, 198, 170, 255], "bg": [58, 68, 72, 255], "attributes": 1, "width": 13 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [59, 69, 73, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [60, 69, 73, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [60, 70, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 73, 75, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 74, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 75, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [66, 76, 77, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [67, 76, 77, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 75, 76, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Use a subagent to inspect src/ledger.ts and calculate the total.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 64 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 36ms", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "✓", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Researcher Subagent — Inspect ledger lifecycle", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 65 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "Subagent completed the ledger lifecycle.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 73 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.7s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...d8b4-5a7a-42b9-9894-29a3b13227bd/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/subagent-running.frame.json b/packages/lab/catalog/public/captures/everforest/subagent-running.frame.json new file mode 100644 index 00000000000..e2e218e1ab1 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/subagent-running.frame.json @@ -0,0 +1,478 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [60, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [60, 70, 73, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [60, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [60, 70, 73, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [60, 70, 73, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Use a subagent to inspect src/ledger.ts and calculate the total.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 64 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 36ms", "fg": [156, 112, 94, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Researcher Subagent — Inspect ledger lifecycle", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 65 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝", "fg": [65, 85, 88, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/subagent-session.frame.json b/packages/lab/catalog/public/captures/everforest/subagent-session.frame.json new file mode 100644 index 00000000000..3a7574383f0 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/subagent-session.frame.json @@ -0,0 +1,507 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 73, 76, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [170, 192, 131, 255], "bg": [65, 73, 76, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 73, 76, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [211, 198, 170, 255], "bg": [65, 73, 76, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [211, 198, 170, 255], "bg": [63, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": "enCode Drive", "fg": [211, 198, 170, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [61, 71, 74, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 72, 75, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [63, 72, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 72, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [64, 73, 76, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [65, 73, 76, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [214, 153, 182, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [214, 153, 182, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "You are a subagent spawned by another session.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 65 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [214, 153, 182, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Read src/ledger.ts and report its exports, values, and calculated total.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 72 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 39 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [214, 153, 182, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The child inspected src/ledger.ts and calculated total 42.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 55 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Researcher", "fg": [214, 153, 182, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { + "text": " · Simulated Model · 1.5s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 78 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Subagents", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Shell", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 90 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " No active subagents", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 92 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "show inactive", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 13 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "ctrl+a", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "tabs", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "←/→", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [133, 146, 137, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/theme-picker.frame.json b/packages/lab/catalog/public/captures/everforest/theme-picker.frame.json new file mode 100644 index 00000000000..1b0dda296d8 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/theme-picker.frame.json @@ -0,0 +1,727 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Themes", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 43 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "catppuccin-frappe", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { + "text": "catppuccin-macchiato", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "cobalt2", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "cursor", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "dracula", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [167, 192, 128, 255], "attributes": 0, "width": 1 }, + { "text": "everforest", "fg": [45, 53, 59, 255], "bg": [167, 192, 128, 255], "attributes": 1, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [167, 192, 128, 255], + "attributes": 0, + "width": 45 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "flexoki", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Buil", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "github", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 50 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀▀▀", "fg": [21, 26, 28, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "gruvbox", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 49 + }, + { "text": "▀▀▀▀▀▀▀▀", "fg": [21, 26, 28, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 22 + }, + { "text": "/privat", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "kanagawa", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 48 + }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": "lucent-orng", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/thinking-streaming.frame.json b/packages/lab/catalog/public/captures/everforest/thinking-streaming.frame.json new file mode 100644 index 00000000000..7e56219e059 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/thinking-streaming.frame.json @@ -0,0 +1,469 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 75, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [62, 72, 75, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [62, 72, 75, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "⠙", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "Thinking", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 103 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝", "fg": [70, 93, 95, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/toast-error.frame.json b/packages/lab/catalog/public/captures/everforest/toast-error.frame.json new file mode 100644 index 00000000000..380e5a9c1ed --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/toast-error.frame.json @@ -0,0 +1,593 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "OpenCode DriveCatalog cap", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 1, + "width": 25 + }, + { "text": "t", "fg": [179, 171, 150, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [141, 139, 125, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [103, 106, 101, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [65, 74, 76, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [101, 110, 103, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [101, 110, 103, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-c4", + "fg": [101, 110, 103, 255], + "bg": [49, 58, 65, 255], + "attributes": 0, + "width": 49 + }, + { "text": "┃", "fg": [230, 126, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 50 + }, + { "text": "┃", "fg": [230, 126, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 61 + }, + { "text": "┃", "fg": [230, 126, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { + "text": "Sharing is not implemented for V2 sessions yet", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 46 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [230, 126, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 47 + }, + { "text": "┃", "fg": [230, 126, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 50 + }, + { "text": "┃", "fg": [230, 126, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [211, 198, 170, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.9s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me about the fixture direction.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "# Questions", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Which direction should the fixture take?", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Keep it minimal (Recommended)", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 82 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "Keeping the fixture minimal.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 216ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...e25f-6338-4d9f-ad75-45e13804d277/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/toast-info.frame.json b/packages/lab/catalog/public/captures/everforest/toast-info.frame.json new file mode 100644 index 00000000000..978e26c2825 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/toast-info.frame.json @@ -0,0 +1,686 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [69, 79, 53, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "DriveCatalog", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "cap", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 3 }, + { "text": "t", "fg": [74, 70, 62, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [58, 57, 51, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [42, 44, 42, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [27, 30, 31, 255], "bg": [21, 26, 28, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [42, 45, 42, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [42, 45, 42, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 24, 27, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-c471e25f-6338-4d9f", + "fg": [42, 45, 42, 255], + "bg": [20, 24, 27, 255], + "attributes": 0, + "width": 65 + }, + { "text": "┃", "fg": [54, 79, 60, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [54, 79, 60, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 77 + }, + { "text": "┃", "fg": [54, 79, 60, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Debug", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "info", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "copied", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "clipboard", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [54, 79, 60, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [87, 82, 70, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 63 + }, + { "text": "┃", "fg": [54, 79, 60, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [54, 79, 60, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [66, 68, 69, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [87, 82, 70, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Si", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Debug", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + }, + { "text": "esc", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "me", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "abo", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Version ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "local (local)", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Date ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "2026-08-12T19:26:41.648Z", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "OS ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "macOS 25.5.0 (arm64)", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 55 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Terminal ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "ghostty 1.3.1", "fg": [211, 198, 170, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "#", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Question", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Session ID", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "ses_0088f226dffePe3QxXhQjUzBGq", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 45 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Model ", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": "simulation/gpt-sim-model", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Which", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "dire", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Keep", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "it", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "mi", "fg": [87, 82, 70, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Share this when reporting an issue.", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { "text": "✓ copied", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "enter", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [19, 22, 24, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "Keeping", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "minimal.", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "216ms", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [52, 77, 74, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [87, 82, 70, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [50, 54, 49, 255], "bg": [21, 26, 28, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 26, 28, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [52, 77, 74, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [21, 26, 28, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...e25f-6338-4d9f-ad75-45e13804d277/files", + "fg": [50, 54, 49, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [87, 82, 70, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [50, 54, 49, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 22, 24, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [19, 22, 24, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [69, 79, 53, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [50, 54, 49, 255], "bg": [21, 25, 28, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [21, 25, 28, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/toast-success.frame.json b/packages/lab/catalog/public/captures/everforest/toast-success.frame.json new file mode 100644 index 00000000000..9e763f4ac12 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/toast-success.frame.json @@ -0,0 +1,593 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "OpenCode DriveCatalog cap", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 1, + "width": 25 + }, + { "text": "t", "fg": [179, 171, 150, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [141, 139, 125, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [103, 106, 101, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [65, 74, 76, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [101, 110, 103, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [101, 110, 103, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 58, 65, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-c471e25f-", + "fg": [101, 110, 103, 255], + "bg": [49, 58, 65, 255], + "attributes": 0, + "width": 56 + }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 43 + }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 68 + }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { + "text": "Session transcript copied to clipboard!", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 39 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [211, 198, 170, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 54 + }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 43 + }, + { "text": "┃", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [160, 165, 167, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [211, 198, 170, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.9s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me about the fixture direction.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "# Questions", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Which direction should the fixture take?", + "fg": [122, 132, 120, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Keep it minimal (Recommended)", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 82 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [45, 53, 59, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "Keeping the fixture minimal.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 216ms", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...e25f-6338-4d9f-ad75-45e13804d277/files", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/webfetch-streaming.frame.json b/packages/lab/catalog/public/captures/everforest/webfetch-streaming.frame.json new file mode 100644 index 00000000000..ed5de44a398 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/webfetch-streaming.frame.json @@ -0,0 +1,475 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [59, 69, 72, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [59, 69, 72, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [59, 69, 72, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [59, 69, 72, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [59, 69, 72, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Fetching from the web...", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝", "fg": [70, 93, 95, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/webfetch-success.frame.json b/packages/lab/catalog/public/captures/everforest/webfetch-success.frame.json new file mode 100644 index 00000000000..392799edfbe --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/webfetch-success.frame.json @@ -0,0 +1,483 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 74, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [62, 72, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [62, 72, 74, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [62, 72, 74, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [62, 72, 74, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "%", "fg": [230, 126, 128, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "WebFetch https://example.com", + "fg": [230, 126, 128, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The web fetch is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝", "fg": [70, 93, 95, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/websearch-failure.frame.json b/packages/lab/catalog/public/captures/everforest/websearch-failure.frame.json new file mode 100644 index 00000000000..36359ab5989 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/websearch-failure.frame.json @@ -0,0 +1,529 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [167, 192, 128, 255], "bg": [52, 63, 68, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 64, 69, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [211, 198, 170, 255], "bg": [54, 64, 69, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [211, 198, 170, 255], "bg": [54, 65, 70, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [55, 66, 70, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [211, 198, 170, 255], "bg": [56, 67, 71, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [211, 198, 170, 255], "bg": [57, 68, 71, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [211, 198, 170, 255], "bg": [58, 68, 72, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [211, 198, 170, 255], "bg": [59, 69, 73, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [60, 70, 73, 255], "attributes": 1, "width": 1 }, + { "text": " D", "fg": [211, 198, 170, 255], "bg": [61, 71, 74, 255], "attributes": 1, "width": 2 }, + { "text": "ri", "fg": [211, 198, 170, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 2 }, + { "text": "v", "fg": [211, 198, 170, 255], "bg": [62, 72, 74, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [211, 198, 170, 255], "bg": [62, 71, 74, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [60, 70, 73, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [56, 66, 70, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 13 }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "%", "fg": [230, 126, 128, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "WebFetch https://example.com", + "fg": [230, 126, 128, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The web fetch is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 5.7s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the web for the OpenCode terminal interface.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 51 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "⠹", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Searching web...", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [98, 140, 137, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [80, 110, 110, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [68, 90, 92, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [60, 77, 81, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝", "fg": [94, 133, 131, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/everforest/websearch-running.frame.json b/packages/lab/catalog/public/captures/everforest/websearch-running.frame.json new file mode 100644 index 00000000000..6f9891ab7d8 --- /dev/null +++ b/packages/lab/catalog/public/captures/everforest/websearch-running.frame.json @@ -0,0 +1,518 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 64, 69, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [174, 186, 136, 255], "bg": [53, 64, 69, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 64, 69, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [211, 198, 170, 255], "bg": [53, 64, 69, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [53, 64, 69, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "%", "fg": [230, 126, 128, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "WebFetch https://example.com", + "fg": [230, 126, 128, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": "The web fetch is complete.", + "fg": [211, 198, 170, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 5.7s", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the web for the OpenCode terminal interface.", + "fg": [211, 198, 170, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 51 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "Searching web...", + "fg": [122, 132, 120, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [127, 187, 179, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [211, 198, 170, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [122, 132, 120, 255], "bg": [52, 63, 68, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [52, 63, 68, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [52, 63, 68, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [136, 199, 192, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [127, 187, 179, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝", "fg": [65, 85, 88, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [211, 198, 170, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [122, 132, 120, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 53, 59, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 53, 59, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [167, 192, 128, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [122, 132, 120, 255], "bg": [51, 60, 67, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [51, 60, 67, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/agent-picker.frame.json b/packages/lab/catalog/public/captures/opencode/agent-picker.frame.json new file mode 100644 index 00000000000..e4649c876a1 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/agent-picker.frame.json @@ -0,0 +1,684 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Select agent", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 37 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { + "text": "build The default agent. Executes tools based on con", + "fg": [10, 10, 10, 255], + "bg": [250, 178, 131, 255], + "attributes": 1, + "width": 52 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "plan", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " Read-only agent for exploring the codebase and ", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 48 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "reviewer", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " Reviews deterministic UI fixtures", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 34 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "\"What", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "is", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "tech", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "stack", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "of", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "this", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "project?\"", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/assistant-response-failed.frame.json b/packages/lab/catalog/public/captures/opencode/assistant-response-failed.frame.json new file mode 100644 index 00000000000..278ccf93d28 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/assistant-response-failed.frame.json @@ -0,0 +1,517 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a successful streaming assistant response.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 64 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "This assistant response completes successfully.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 66 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 114ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a failed assistant response.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "This response starts but the simulated provider disconnects.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 53 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "Error: Decode error (200 POST https://api.openai.com/v1/chat/completions)", + "fg": [224, 108, 117, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 73 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 40 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "Build · Simulated Model · 494ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 31 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...214e-117d-40e8-b217-bbf3bb0abed0/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [224, 108, 117, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/assistant-response-interrupted.frame.json b/packages/lab/catalog/public/captures/opencode/assistant-response-interrupted.frame.json new file mode 100644 index 00000000000..56c813e7a1b --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/assistant-response-interrupted.frame.json @@ -0,0 +1,548 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a successful streaming assistant response.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 64 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "This assistant response completes successfully.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 66 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 114ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a failed assistant response.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "This response starts but the simulated provider disconnects.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 53 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "Error: Decode error (200 POST https://api.openai.com/v1/chat/completions)", + "fg": [224, 108, 117, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 73 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 40 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "Build · Simulated Model · 494ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 31 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Show an interrupted assistant response.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 72 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "This response remains active until the user interrupts it.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 55 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝", "fg": [35, 54, 81, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [224, 108, 117, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/assistant-response-succeeded.frame.json b/packages/lab/catalog/public/captures/opencode/assistant-response-succeeded.frame.json new file mode 100644 index 00000000000..1b5f63be5a7 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/assistant-response-succeeded.frame.json @@ -0,0 +1,476 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 34, 34, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [34, 34, 34, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 34, 34, 255], "attributes": 0, "width": 1 }, + { "text": "New session", "fg": [238, 238, 238, 255], "bg": [34, 34, 34, 255], "attributes": 1, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 34, 34, 255], + "attributes": 0, + "width": 18 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a successful streaming assistant response.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 64 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "This assistant response completes successfully.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 66 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 114ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...214e-117d-40e8-b217-bbf3bb0abed0/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/command-palette.frame.json b/packages/lab/catalog/public/captures/opencode/command-palette.frame.json new file mode 100644 index 00000000000..bab2234d546 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/command-palette.frame.json @@ -0,0 +1,741 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Commands", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 41 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Suggested", "fg": [157, 124, 216, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 3 }, + { "text": "Switch model", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [250, 178, 131, 255], + "attributes": 0, + "width": 32 + }, + { "text": "ctrl+x m", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "Connect an integration", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Open settings", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Session", "fg": [157, 124, 216, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Switch session", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 30 + }, + { "text": "ctrl+x l", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Buil", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "New session", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 33 + }, + { "text": "ctrl+x n", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀▀▀", "fg": [12, 12, 12, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "Open session or project", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 23 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 23 + }, + { "text": "ctrl+o", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "▀▀▀▀▀▀▀▀", "fg": [12, 12, 12, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "/privat", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Close tab", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { "text": "ctrl+x w", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "Reopen closed tab", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 23 + }, + { "text": "ctrl+shift+t", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/debug.frame.json b/packages/lab/catalog/public/captures/opencode/debug.frame.json new file mode 100644 index 00000000000..0cd09c7a47c --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/debug.frame.json @@ -0,0 +1,555 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Debug", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Version ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "local (local)", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Date ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "2026-08-12T19:26:35.884Z", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "OS ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "macOS 25.5.0 (arm64)", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 55 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Terminal ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "ghostty 1.3.1", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Session ID", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "n/a", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 72 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Model ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "simulation/gpt-sim-model", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Share this when reporting an issue.", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 39 + }, + { "text": "copy", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "enter", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/diff-viewer.frame.json b/packages/lab/catalog/public/captures/opencode/diff-viewer.frame.json new file mode 100644 index 00000000000..55e4a42972a --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/diff-viewer.frame.json @@ -0,0 +1,460 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "Diff ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "working tree", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 93 + }, + { "text": "0 files", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 } + ] + }, + { + "spans": [ + { + "text": "────────────────────────────────────────────────────────────────────────────────", + "fg": [72, 72, 72, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 80 + }, + { "text": "┃", "fg": [86, 182, 194, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [86, 182, 194, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "──", "fg": [72, 72, 72, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "No changes to show", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 61 + }, + { "text": "┃", "fg": [86, 182, 194, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { + "text": "Debug info copied to clipboard", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 30 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [86, 182, 194, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 80 + }, + { "text": "┃", "fg": [86, 182, 194, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [86, 182, 194, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { + "text": "focus file tree", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "n ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "next file", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "] ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "next hunk", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "[ ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "previous hunk", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "previous file", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "d ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "switch source", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "m ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "mark reviewed", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "? ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "all", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/glob-empty.frame.json b/packages/lab/catalog/public/captures/opencode/glob-empty.frame.json new file mode 100644 index 00000000000..afb325c05a8 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/glob-empty.frame.json @@ -0,0 +1,530 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [33, 33, 33, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [33, 33, 33, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [33, 33, 33, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [33, 33, 33, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [33, 33, 33, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Find the TypeScript source files.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The first glob search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 937ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Find Rust files that do not exist.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty glob search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 149ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...8837-bd93-4bb8-b8f0-515ca3bddb81/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/glob-success.frame.json b/packages/lab/catalog/public/captures/opencode/glob-success.frame.json new file mode 100644 index 00000000000..457145a6a48 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/glob-success.frame.json @@ -0,0 +1,486 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Find the TypeScript source files.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The first glob search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 937ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...8837-bd93-4bb8-b8f0-515ca3bddb81/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/grep-empty.frame.json b/packages/lab/catalog/public/captures/opencode/grep-empty.frame.json new file mode 100644 index 00000000000..6e99b9b77c9 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/grep-empty.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [33, 33, 33, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [33, 33, 33, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [33, 33, 33, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [33, 33, 33, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [33, 33, 33, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The grouped exploration is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 734ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for credits.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The matching grep search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 76 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 105ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for DEADBEEF.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty grep search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 160ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...8837-bd93-4bb8-b8f0-515ca3bddb81/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [224, 108, 117, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/grep-failure.frame.json b/packages/lab/catalog/public/captures/opencode/grep-failure.frame.json new file mode 100644 index 00000000000..6187dddcee8 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/grep-failure.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 41, 41, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 41, 41, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [41, 41, 41, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The matching grep search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 76 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 105ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for DEADBEEF.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty grep search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 160ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Run an invalid regular expression search.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The invalid grep search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 109ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...8837-bd93-4bb8-b8f0-515ca3bddb81/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [224, 108, 117, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/grep-success.frame.json b/packages/lab/catalog/public/captures/opencode/grep-success.frame.json new file mode 100644 index 00000000000..5aff3ee7c39 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/grep-success.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty glob search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 149ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Explore TypeScript files and search them for credits together.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 62 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 2 searches", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 90 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The grouped exploration is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 734ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for credits.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The matching grep search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 76 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 105ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...8837-bd93-4bb8-b8f0-515ca3bddb81/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [224, 108, 117, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/grouped-exploration.frame.json b/packages/lab/catalog/public/captures/opencode/grouped-exploration.frame.json new file mode 100644 index 00000000000..3bdaf299146 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/grouped-exploration.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The first glob search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 937ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Find Rust files that do not exist.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty glob search is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 149ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Explore TypeScript files and search them for credits together.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 62 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 2 searches", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 90 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The grouped exploration is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 734ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...8837-bd93-4bb8-b8f0-515ca3bddb81/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [224, 108, 117, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/help.frame.json b/packages/lab/catalog/public/captures/opencode/help.frame.json new file mode 100644 index 00000000000..cfcb60cdb11 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/help.frame.json @@ -0,0 +1,682 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Help", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": "esc/enter", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Press ctrl+p to see all available actions and commands ", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 55 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "in any context.", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 50 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 3 }, + { "text": "ok", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "\"What", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "is", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "tech", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "stack", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "of", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "this", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "project?\"", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/home.frame.json b/packages/lab/catalog/public/captures/opencode/home.frame.json new file mode 100644 index 00000000000..6af5f3a0729 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/home.frame.json @@ -0,0 +1,616 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [250, 178, 131, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "New session", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ▄ ", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 1, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 40 + }, + { + "text": "█▀▀█ █▀▀█ █▀▀█ █▀▀▄", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "█▀▀▀ █▀▀█ █▀▀█ █▀▀█", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 1, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 40 + }, + { "text": "█", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [128, 128, 128, 255], "bg": [40, 40, 40, 255], "attributes": 0, "width": 2 }, + { "text": "█ █", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [128, 128, 128, 255], "bg": [40, 40, 40, 255], "attributes": 0, "width": 2 }, + { "text": "█ █", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "▀▀▀", "fg": [128, 128, 128, 255], "bg": [40, 40, 40, 255], "attributes": 0, "width": 3 }, + { "text": " █", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [128, 128, 128, 255], "bg": [40, 40, 40, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [67, 67, 67, 255], "attributes": 1, "width": 3 }, + { "text": " █", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 1, "width": 2 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [67, 67, 67, 255], "attributes": 1, "width": 2 }, + { "text": "█ █", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [67, 67, 67, 255], "attributes": 1, "width": 2 }, + { "text": "█ █", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 1, "width": 3 }, + { "text": "▀▀▀", "fg": [238, 238, 238, 255], "bg": [67, 67, 67, 255], "attributes": 1, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 40 + }, + { + "text": "▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 16 + }, + { "text": "▀▀", "fg": [40, 40, 40, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "▀", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 1, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask anything... \"What is the tech stack of this project?\"", + "fg": [128, 128, 128, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 57 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-dca9766779d4/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/integration-picker.frame.json b/packages/lab/catalog/public/captures/opencode/integration-picker.frame.json new file mode 100644 index 00000000000..351797dcda1 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/integration-picker.frame.json @@ -0,0 +1,729 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "Connect an integration", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 1, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 27 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Popular", "fg": [157, 124, 216, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 3 }, + { "text": "OpenCode", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [250, 178, 131, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "openai", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "github-copilot", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 42 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Services", "fg": [157, 124, 216, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 48 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "azure", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Buil", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "cloudflare-ai-gateway", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀▀▀", "fg": [12, 12, 12, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "cloudflare-workers-ai", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { "text": "▀▀▀▀▀▀▀▀", "fg": [12, 12, 12, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "/privat", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Exa", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 53 + }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Firecrawl", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/mcp-list.frame.json b/packages/lab/catalog/public/captures/opencode/mcp-list.frame.json new file mode 100644 index 00000000000..a5bcce3b9d8 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/mcp-list.frame.json @@ -0,0 +1,680 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "MCP servers", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 38 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "No items available", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "connect space", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "\"What", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "is", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "tech", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "stack", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "of", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "this", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "project?\"", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/model-picker.frame.json b/packages/lab/catalog/public/captures/opencode/model-picker.frame.json new file mode 100644 index 00000000000..ab7a20ebac0 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/model-picker.frame.json @@ -0,0 +1,691 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Select model", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 37 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [10, 10, 10, 255], + "bg": [250, 178, 131, 255], + "attributes": 1, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [250, 178, 131, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "View all integrations", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ctrl+a", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "\"What", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "is", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "tech", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "stack", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "of", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "this", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "project?\"", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/pair.frame.json b/packages/lab/catalog/public/captures/opencode/pair.frame.json new file mode 100644 index 00000000000..c787473e6f6 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/pair.frame.json @@ -0,0 +1,669 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Pair", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 77 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "This device", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 30 + }, + { + "text": "█▀▀▀▀▀▀▀█▀█▀▀▀▀███▀████▀██▀██▀▀██▀█▀▀▀▀▀▀▀█", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "http://localhost:60110", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 19 + }, + { + "text": "█ █▀▀▀█ ██▀ ▄▀ █▀█▄▄▀▀▀▀▀▀▄███▀ ██ █▀▀▀█ █", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █ █ ██▀▀▀▀█▄▀ ▀▄▄▄ ██▀▄█▀ █▀▄█ █ █ █", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "URLs", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 37 + }, + { + "text": "█ ▀▀▀▀▀ █▀█▀▄▀█▀▄ ▄ ▄▀█▀▄ █▀█ █ █▀█ ▀▀▀▀▀ █", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "http://127.0.0.1:60110", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 19 + }, + { + "text": "█▀▀█▀▀█▀█▄█▄▀█▄ ▄ ▀▄███▄▀▄▄▄▄█▀ ▀ █▀█████▀█", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█▀█▄▀█▀▀▀▀█▄ ▄ ▄▄▄▄▀ █ ██▀ ▄█▀▄▄██ ▄ ███", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Username", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 33 + }, + { + "text": "██▀██ ▀▀█ ▀▄▀▄ ███▀▄ ▀█▄ █▀▄▄▄▄ ▄ ▄▀▄ ▄█▀██", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "opencode", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 33 + }, + { + "text": "█▀▄█▄██▀▄▀▄ █▄ ▄▀██▄ █▀▄▄ █ ▄▀█▀▀ ▄▄▄▄▄▄ █", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █ █▄▀▀▄▄█▀▀ ▀█▀▄██▀▀█ ▄▀▀▄▀█▀▄▀█▄▀█▀▄▀██", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Password", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 33 + }, + { + "text": "█▄▄▀▀▄ ▀▀▄█▀▀ ▀ ▀ ▄▀▀▀▄ ▄▄ █▄▀▄▄▀█▄▀█", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "************", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 29 + }, + { + "text": "█▀ ▄▄▄█▀ ▀▄ █▀ █ ▀█▀█ ▀█▄ ▀█▀ █▀▄ ██▀ ▀ █", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█▀ ▀▀ █▀██▄██▀▀▀██▄█▄▀▄▀ ▀█▀▀█▄█▄ ██ ▄ ▀██", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Run `opencode service set ", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 15 + }, + { + "text": "██ █▀▄ ▀▄ █▀█▄▄▀▄▄ ██▄▄ █ ▀█▄ ▄▀█ ▄ ▄▀ ██", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "hostname 0.0.0.0` to access ", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 28 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 13 }, + { + "text": "█ ▄ █▄▀▀▀███▄▀█▀ █ ▄▀▄██▄ ▄█ ▀█▀▀▄▄▄▄▄▀█▀ █", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "the service remotely.", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 20 + }, + { + "text": "███ ▄▄ ▀▀▄█▀ ▄▄▄▀▀ ▄▄ █▀█▀▀▄▄▀█▀ ▄▄██▀ ▄▀▀█", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ ▀▀▀ ▀▀▀▄ ▄█▀▀▄▄ █▀▀ █▀▀ ▀ ▀ ▄█▀▀▄ █▄▀█", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ ▄█▀ ▀▄▀▀▀█▄▄▀▀▀▀█▄██▄▄▀▄▄▄▀▀ ▀▀ ▀▀▄▀ █", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█▀▀▀▀▀▀▀█▄██ ██▀ █▀ ▄▄ ▄ ▄█▄ ▄█ █▀█ ▀▄ ██", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █▀▀▀█ █▀█▀█▀▀ ▀▀ ▀▀ ▀█▄███▀ ▄▄▀ ▀▀▀ ▀█▀▀█", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █ █ █▄ █▀▀▄▀█ █ █ ▄▄▄▄█ ▄ █ ▄▄█▄▀ ▀▄ █", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/patch-created.frame.json b/packages/lab/catalog/public/captures/opencode/patch-created.frame.json new file mode 100644 index 00000000000..7450e484f5a --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/patch-created.frame.json @@ -0,0 +1,498 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 179, 132, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 34, 34, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [34, 34, 34, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 34, 34, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "# Created", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-8169a8e2-4e5e-4b06-abff-4de6b16313bb/files/patched.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "created by patch", + "fg": [238, 238, 238, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [25, 36, 52, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [33, 50, 75, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝", "fg": [49, 80, 122, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/patch-deleted.frame.json b/packages/lab/catalog/public/captures/opencode/patch-deleted.frame.json new file mode 100644 index 00000000000..3498fe70eb8 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/patch-deleted.frame.json @@ -0,0 +1,557 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 44, 44, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 179, 133, 255], "bg": [39, 39, 39, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [37, 37, 37, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "# Created", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-8169a8e2-4e5e-4b06-abff-4de6b16313bb/files/patched.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "created by patch", + "fg": [238, 238, 238, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-8169a8e2-4e5e-4b06-abff-4de6b16313bb/files/fixture.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "updated by patch", + "fg": [238, 238, 238, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "# Deleted", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-8169a8e2-4e5e-4b06-abff-4de6b16313bb/files/patched.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "-1 line", "fg": [197, 59, 83, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [59, 98, 151, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [25, 36, 52, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [33, 50, 75, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/patch-failed.frame.json b/packages/lab/catalog/public/captures/opencode/patch-failed.frame.json new file mode 100644 index 00000000000..8acb3524d6f --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/patch-failed.frame.json @@ -0,0 +1,576 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 44, 45, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [231, 171, 154, 255], "bg": [46, 45, 46, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 46, 47, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [48, 47, 48, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [238, 238, 238, 255], "bg": [49, 48, 49, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [49, 49, 50, 255], "attributes": 1, "width": 1 }, + { "text": "nC", "fg": [238, 238, 238, 255], "bg": [51, 51, 52, 255], "attributes": 1, "width": 2 }, + { "text": "o", "fg": [238, 238, 238, 255], "bg": [52, 52, 53, 255], "attributes": 1, "width": 1 }, + { "text": "de D", "fg": [238, 238, 238, 255], "bg": [53, 53, 54, 255], "attributes": 1, "width": 4 }, + { "text": "r", "fg": [238, 238, 238, 255], "bg": [51, 51, 52, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [238, 238, 238, 255], "bg": [47, 46, 47, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [238, 238, 238, 255], "bg": [43, 42, 43, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [42, 41, 42, 255], "attributes": 1, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [42, 41, 42, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [17, 17, 17, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-8169a8e2-4e5e-4b06-abff-4de6b16313bb/files/fixture.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "updated by patch", + "fg": [238, 238, 238, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "# Deleted", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-8169a8e2-4e5e-4b06-abff-4de6b16313bb/files/patched.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "-1 line", "fg": [197, 59, 83, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "# Patch failed", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 14 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "missing-patch.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "patch verification failed: Failed to read file to update /private/var/folders/dd/", + "fg": [224, 108, 117, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 81 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 30 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-8169a8e2-4e5e-4b06-abff-4de6b16313bb/files/missing-patch.", + "fg": [224, 108, 117, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 109 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "txt: file does not exist", + "fg": [224, 108, 117, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 87 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The patch file-change lifecycle is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 69 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 3.1s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...a8e2-4e5e-4b06-abff-4de6b16313bb/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/patch-input-streaming.frame.json b/packages/lab/catalog/public/captures/opencode/patch-input-streaming.frame.json new file mode 100644 index 00000000000..c9aff9de699 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/patch-input-streaming.frame.json @@ -0,0 +1,481 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 47, 47, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 179, 133, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 41, 41, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [41, 41, 41, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⠸", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [59, 98, 151, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [25, 36, 52, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [33, 50, 75, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/patch-success.frame.json b/packages/lab/catalog/public/captures/opencode/patch-success.frame.json new file mode 100644 index 00000000000..3ab635a68eb --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/patch-success.frame.json @@ -0,0 +1,509 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [32, 32, 32, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [32, 32, 32, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [32, 32, 32, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [32, 32, 32, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 32, 32, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-dca9766779d4/files/fixture.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [238, 238, 238, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.7s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5ab6-ac5f-4eeb-a801-dca9766779d4/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/patch-updated.frame.json b/packages/lab/catalog/public/captures/opencode/patch-updated.frame.json new file mode 100644 index 00000000000..88495ec6fec --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/patch-updated.frame.json @@ -0,0 +1,537 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 46, 46, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 180, 135, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 38, 38, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [38, 38, 38, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [38, 38, 38, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "# Created", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-8169a8e2-4e5e-4b06-abff-4de6b16313bb/files/patched.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "created by patch", + "fg": [238, 238, 238, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-8169a8e2-4e5e-4b06-abff-4de6b16313bb/files/fixture.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "updated by patch", + "fg": [238, 238, 238, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [59, 98, 151, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [25, 36, 52, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [33, 50, 75, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/permission-always-confirmation.frame.json b/packages/lab/catalog/public/captures/opencode/permission-always-confirmation.frame.json new file mode 100644 index 00000000000..8030200501b --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/permission-always-confirmation.frame.json @@ -0,0 +1,494 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [238, 238, 238, 255], "bg": [44, 44, 44, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [45, 45, 45, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [238, 238, 238, 255], "bg": [46, 46, 46, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [238, 238, 238, 255], "bg": [47, 47, 47, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [238, 238, 238, 255], "bg": [48, 48, 48, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [238, 238, 238, 255], "bg": [49, 49, 49, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [50, 50, 50, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [51, 51, 51, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [238, 238, 238, 255], "bg": [52, 52, 52, 255], "attributes": 1, "width": 1 }, + { "text": "ri", "fg": [238, 238, 238, 255], "bg": [53, 53, 53, 255], "attributes": 1, "width": 2 }, + { "text": "ve", "fg": [238, 238, 238, 255], "bg": [54, 54, 54, 255], "attributes": 1, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 54, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 53, 53, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 48, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 44, 44, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 11 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Always allow", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 97 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "This will allow edit until OpenCode is restarted.", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "Confirm", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Cancel", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 68 + }, + { "text": "⇆ ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/permission-always-selected.frame.json b/packages/lab/catalog/public/captures/opencode/permission-always-selected.frame.json new file mode 100644 index 00000000000..4829a07a861 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/permission-always-selected.frame.json @@ -0,0 +1,543 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 38, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [38, 38, 38, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 39, 39, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [39, 39, 39, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [238, 238, 238, 255], "bg": [40, 40, 40, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [238, 238, 238, 255], "bg": [45, 45, 45, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [238, 238, 238, 255], "bg": [46, 46, 46, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [47, 47, 47, 255], "attributes": 1, "width": 1 }, + { "text": " D", "fg": [238, 238, 238, 255], "bg": [49, 49, 49, 255], "attributes": 1, "width": 2 }, + { "text": "r", "fg": [238, 238, 238, 255], "bg": [50, 50, 50, 255], "attributes": 1, "width": 1 }, + { "text": "ive", "fg": [238, 238, 238, 255], "bg": [51, 51, 51, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 51, 51, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 49, 49, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 39, 39, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 38, 38, 255], "attributes": 0, "width": 11 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": "dca9766779d4/files/fixture.txt", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [238, 238, 238, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": "Allow once", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "Allow always", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Reject", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/permission-fullscreen.frame.json b/packages/lab/catalog/public/captures/opencode/permission-fullscreen.frame.json new file mode 100644 index 00000000000..1273dc32bd8 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/permission-fullscreen.frame.json @@ -0,0 +1,556 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": "OpenC", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 5 }, + { "text": "ode", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [44, 44, 44, 255], "attributes": 1, "width": 1 }, + { "text": "Dr", "fg": [238, 238, 238, 255], "bg": [45, 45, 45, 255], "attributes": 1, "width": 2 }, + { "text": "i", "fg": [238, 238, 238, 255], "bg": [46, 46, 46, 255], "attributes": 1, "width": 1 }, + { "text": "ve", "fg": [238, 238, 238, 255], "bg": [47, 47, 47, 255], "attributes": 1, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 48, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 47, 47, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 45, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 7 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": "dca9766779d4/files/fixture.txt", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [238, 238, 238, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": "Allow once", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": "Allow always", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "Reject", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 32 + }, + { "text": "ctrl+f ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": "minimize", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/permission-prompt.frame.json b/packages/lab/catalog/public/captures/opencode/permission-prompt.frame.json new file mode 100644 index 00000000000..afeeb7c0877 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/permission-prompt.frame.json @@ -0,0 +1,542 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 35, 35, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [35, 35, 35, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 36, 36, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [36, 36, 36, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [238, 238, 238, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [38, 38, 38, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [238, 238, 238, 255], "bg": [39, 39, 39, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [238, 238, 238, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [45, 45, 45, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [46, 46, 46, 255], "attributes": 1, "width": 1 }, + { "text": "Dr", "fg": [238, 238, 238, 255], "bg": [47, 47, 47, 255], "attributes": 1, "width": 2 }, + { "text": "ive", "fg": [238, 238, 238, 255], "bg": [48, 48, 48, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 48, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 45, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 39, 39, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 35, 35, 255], "attributes": 0, "width": 12 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": "dca9766779d4/files/fixture.txt", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 97 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [238, 238, 238, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "Allow once", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Allow always", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": "Reject", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/permission-reject-selected.frame.json b/packages/lab/catalog/public/captures/opencode/permission-reject-selected.frame.json new file mode 100644 index 00000000000..86594c13e10 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/permission-reject-selected.frame.json @@ -0,0 +1,543 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [238, 238, 238, 255], "bg": [44, 44, 44, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [45, 45, 45, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [238, 238, 238, 255], "bg": [46, 46, 46, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [238, 238, 238, 255], "bg": [47, 47, 47, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [238, 238, 238, 255], "bg": [48, 48, 48, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [238, 238, 238, 255], "bg": [49, 49, 49, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [51, 51, 51, 255], "attributes": 1, "width": 1 }, + { "text": " D", "fg": [238, 238, 238, 255], "bg": [52, 52, 52, 255], "attributes": 1, "width": 2 }, + { "text": "r", "fg": [238, 238, 238, 255], "bg": [53, 53, 53, 255], "attributes": 1, "width": 1 }, + { "text": "ive", "fg": [238, 238, 238, 255], "bg": [54, 54, 54, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [55, 55, 55, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 53, 53, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 49, 49, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 44, 44, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 10 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": "dca9766779d4/files/fixture.txt", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [238, 238, 238, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": "Allow once", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": "Allow always", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "Reject", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 30 + }, + { "text": "ctrl+f ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/question-awaiting-form.frame.json b/packages/lab/catalog/public/captures/opencode/question-awaiting-form.frame.json new file mode 100644 index 00000000000..4c8058cd259 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/question-awaiting-form.frame.json @@ -0,0 +1,539 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 2 questions", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Runtime", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": "Validation", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": "Confirm", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "1.", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Bun", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 105 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the repository's configured runtime.", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 68 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "2.", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Node", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the Node.js compatibility runtime.", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "3.", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Type your own answer", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "tab", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/question-denied.frame.json b/packages/lab/catalog/public/captures/opencode/question-denied.frame.json new file mode 100644 index 00000000000..85781e09684 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/question-denied.frame.json @@ -0,0 +1,582 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [17, 17, 17, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Bun", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 108 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Which validation should run?", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Focused", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The catalog answers were submitted.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 78 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 8.3s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask one more runtime question that I will dismiss.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 61 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 1 question", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "1.", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Bun", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 105 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the repository's configured runtime.", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 68 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "2.", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Node", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the Node.js compatibility runtime.", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "3.", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Type your own answer", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 75 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/question-input-streaming.frame.json b/packages/lab/catalog/public/captures/opencode/question-input-streaming.frame.json new file mode 100644 index 00000000000..8c5c648f77e --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/question-input-streaming.frame.json @@ -0,0 +1,478 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 46, 46, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 179, 132, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 41, 41, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [41, 41, 41, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "⠸", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Asking questions...", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [59, 98, 151, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [25, 36, 52, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [33, 50, 75, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/question-prompt.frame.json b/packages/lab/catalog/public/captures/opencode/question-prompt.frame.json new file mode 100644 index 00000000000..8bcab636080 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/question-prompt.frame.json @@ -0,0 +1,586 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-dca9766779d4/files/fixture.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [238, 238, 238, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.7s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me about the fixture direction.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 1 question", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Which direction should the fixture take?", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "1.", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Keep it minimal (Recommended)", + "fg": [250, 178, 131, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { + "text": "Small deterministic fixture", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "2.", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Expand coverage", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 93 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { + "text": "Add more scripted states", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 84 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "3.", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Type your own answer", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 75 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/question-review.frame.json b/packages/lab/catalog/public/captures/opencode/question-review.frame.json new file mode 100644 index 00000000000..f5a17fa3b16 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/question-review.frame.json @@ -0,0 +1,498 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 2 questions", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Runtime", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": "Validation", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": "Confirm", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Review", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 105 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Runtime:", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Bun", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Validation:", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Focused", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 92 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "tab", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": "scroll", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 68 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/question-succeeded.frame.json b/packages/lab/catalog/public/captures/opencode/question-succeeded.frame.json new file mode 100644 index 00000000000..a0d5c9eddfb --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/question-succeeded.frame.json @@ -0,0 +1,525 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [42, 42, 42, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "# Questions", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Bun", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 108 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Which validation should run?", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Focused", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The catalog answers were submitted.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 78 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 8.3s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...41c2-176e-4516-ad01-cc0342699108/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/read-denied.frame.json b/packages/lab/catalog/public/captures/opencode/read-denied.frame.json new file mode 100644 index 00000000000..06b7d73cabf --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/read-denied.frame.json @@ -0,0 +1,575 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [31, 31, 31, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [31, 31, 31, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [31, 31, 31, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [31, 31, 31, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [31, 31, 31, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [95, 95, 95, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "Explored", "fg": [95, 95, 95, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "—", "fg": [95, 95, 95, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [95, 95, 95, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "read", "fg": [95, 95, 95, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture read succeeded.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 983ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Now try to read a missing file.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 31 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 80 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 read", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The missing-file read failed as expected.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 72 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 88ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Now read the ledger file.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [245, 167, 66, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Read src/ledger.ts", + "fg": [245, 167, 66, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 93 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Read src/ledger.ts", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Path: src/ledger.ts", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 92 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "Allow once", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Allow always", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": "Reject", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/read-input-streaming.frame.json b/packages/lab/catalog/public/captures/opencode/read-input-streaming.frame.json new file mode 100644 index 00000000000..90890206260 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/read-input-streaming.frame.json @@ -0,0 +1,478 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Read the fixture file.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "⠹", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Exploring — 1 read", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 93 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [25, 36, 52, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [33, 50, 75, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝", "fg": [49, 80, 122, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/read-permission.frame.json b/packages/lab/catalog/public/captures/opencode/read-permission.frame.json new file mode 100644 index 00000000000..b0fd75e9c41 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/read-permission.frame.json @@ -0,0 +1,509 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [245, 167, 66, 255], "bg": [38, 38, 38, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 40, 40, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 1 }, + { "text": "pe", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 2 }, + { "text": "nCod", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 4 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [40, 40, 40, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [34, 34, 34, 255], "attributes": 1, "width": 1 }, + { "text": "Drive", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Read the fixture file.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [245, 167, 66, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Read fixture.txt", + "fg": [245, 167, 66, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [245, 167, 66, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Read fixture.txt", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 91 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Path: fixture.txt", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 94 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "Allow once", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Allow always", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": "Reject", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/read-succeeded.frame.json b/packages/lab/catalog/public/captures/opencode/read-succeeded.frame.json new file mode 100644 index 00000000000..217ab7ff73e --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/read-succeeded.frame.json @@ -0,0 +1,486 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Read the fixture file.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 read", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture read succeeded.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 983ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...0883-7eb7-4b4b-8607-12de47209aac/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/session-export.frame.json b/packages/lab/catalog/public/captures/opencode/session-export.frame.json new file mode 100644 index 00000000000..d7e55914236 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/session-export.frame.json @@ -0,0 +1,647 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Drive", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Change", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "from", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "after.", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-dca9766779d4/files/fixture.txt", + "fg": [53, 53, 53, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [98, 98, 98, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [98, 98, 98, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Export session", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 39 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Export as:", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "◉ Markdown", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": "○ JSON", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "[x]", "fg": [250, 178, 131, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Include thinking", + "fg": [250, 178, 131, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 31 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 4 }, + { "text": "Copy", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": "Export", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5ab6-ac5f-4eeb-a801-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/session-fork.frame.json b/packages/lab/catalog/public/captures/opencode/session-fork.frame.json new file mode 100644 index 00000000000..5a90b2b9722 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/session-fork.frame.json @@ -0,0 +1,550 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Drive", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Change", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "from", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "after.", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-dca9766779d4/files/fixture.txt", + "fg": [53, 53, 53, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "befo", "fg": [98, 98, 98, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "afte", "fg": [98, 98, 98, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Fork session", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 65 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "fixtur", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "Full session", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [250, 178, 131, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Si", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 33 + }, + { "text": "3:26 PM", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5ab6-ac5f-4eeb-a801-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/session-picker-populated.frame.json b/packages/lab/catalog/public/captures/opencode/session-picker-populated.frame.json new file mode 100644 index 00000000000..011761922af --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/session-picker-populated.frame.json @@ -0,0 +1,608 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 13, 13, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [103, 73, 54, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 13, 13, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [98, 98, 98, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 13, 13, 255], "attributes": 0, "width": 1 }, + { "text": "DriveCatalog", "fg": [98, 98, 98, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 13, 13, 255], "attributes": 0, "width": 1 }, + { "text": "cap", "fg": [98, 98, 98, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 3 }, + { "text": "t", "fg": [81, 81, 81, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [60, 60, 60, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [40, 40, 40, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [19, 19, 19, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [39, 39, 39, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [39, 39, 39, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-dca9766779d4/files/fixture.txt", + "fg": [39, 39, 39, 255], + "bg": [7, 7, 7, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [98, 98, 98, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [98, 98, 98, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Si", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Sessions", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 69 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "me", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "abo", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Today", "fg": [157, 124, 216, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { + "text": "OpenCode DriveCatalog capture session", + "fg": [10, 10, 10, 255], + "bg": [250, 178, 131, 255], + "attributes": 1, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [250, 178, 131, 255], + "attributes": 0, + "width": 46 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "#", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Question", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "delete", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ctrl+d", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "rename", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ctrl+r", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { "text": "all projects", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "ctrl+a", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Which", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "dire", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Keep", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "it", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "minimal", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "(Recommended)", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 82 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "Keeping", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "minimal.", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "209ms", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5ab6-ac5f-4eeb-a801-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/session-picker.frame.json b/packages/lab/catalog/public/captures/opencode/session-picker.frame.json new file mode 100644 index 00000000000..e25abc1bc96 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/session-picker.frame.json @@ -0,0 +1,578 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Sessions", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 69 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": "No sessions available", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "delete ctrl+d", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "rename ctrl+r", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { "text": "all projects", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "ctrl+a", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "\"What", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "is", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "tech", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "stack", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "of", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "this", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "project?\"", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/session-rename.frame.json b/packages/lab/catalog/public/captures/opencode/session-rename.frame.json new file mode 100644 index 00000000000..5c1d66d16ac --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/session-rename.frame.json @@ -0,0 +1,602 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 13, 13, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [103, 73, 54, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 13, 13, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [98, 98, 98, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 13, 13, 255], "attributes": 0, "width": 1 }, + { "text": "Drive", "fg": [98, 98, 98, 255], "bg": [13, 13, 13, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 13, 13, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Change", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "from", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "after.", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb-a801-dca9766779d4/files/fixture.txt", + "fg": [53, 53, 53, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [98, 98, 98, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [98, 98, 98, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Rename session", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 39 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5ab6-ac5f-4eeb-a801-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/session-tabs-idle.frame.json b/packages/lab/catalog/public/captures/opencode/session-tabs-idle.frame.json new file mode 100644 index 00000000000..eab981c85a4 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/session-tabs-idle.frame.json @@ -0,0 +1,482 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 44, 45, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [248, 187, 147, 255], "bg": [46, 45, 46, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 45, 46, 255], "attributes": 0, "width": 1 }, + { "text": "Op", "fg": [238, 238, 238, 255], "bg": [46, 45, 46, 255], "attributes": 1, "width": 2 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [42, 41, 42, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [238, 238, 238, 255], "bg": [36, 35, 36, 255], "attributes": 1, "width": 1 }, + { "text": "Code Drive", "fg": [238, 238, 238, 255], "bg": [33, 32, 33, 255], "attributes": 1, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [33, 32, 33, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 33, 34, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 34, 35, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 35, 36, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 36, 37, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 38, 39, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 39, 40, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 40, 41, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 42, 43, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 43, 44, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Audit the current tab state.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "Working on a tab audit.Tab audit complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 42 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 71 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 2.1s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...c64b-92fd-4fe6-8695-3e3425557695/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/session-tabs-running.frame.json b/packages/lab/catalog/public/captures/opencode/session-tabs-running.frame.json new file mode 100644 index 00000000000..fa8df981fee --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/session-tabs-running.frame.json @@ -0,0 +1,474 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [42, 42, 42, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Audit the current tab state.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "Working on a tab audit.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 23 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 90 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝", "fg": [40, 63, 95, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/shell-execute-failed.frame.json b/packages/lab/catalog/public/captures/opencode/shell-execute-failed.frame.json new file mode 100644 index 00000000000..44bf1aa99d6 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/shell-execute-failed.frame.json @@ -0,0 +1,557 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode ", "fg": [238, 238, 238, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 9 }, + { "text": "Dr", "fg": [238, 238, 238, 255], "bg": [38, 38, 38, 255], "attributes": 1, "width": 2 }, + { "text": "i", "fg": [238, 238, 238, 255], "bg": [39, 39, 39, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [238, 238, 238, 255], "bg": [40, 40, 40, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 44, 44, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 45, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 47, 47, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 48, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 49, 49, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [50, 50, 50, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 48, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 38, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 1.8s", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "$", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "printf catalog-shell-success", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Tool result declared output without an output schema", + "fg": [224, 108, 117, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 52 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 59 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The successful shell command completed.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 74 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 3.5s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Now run one failing foreground shell command.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⠇", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "catalog-shell-fail", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 91 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The shell lifecycle is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 32 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 81 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.5s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...d909-908e-400d-bf9d-37cac347537d/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/shell-execute-succeeded.frame.json b/packages/lab/catalog/public/captures/opencode/shell-execute-succeeded.frame.json new file mode 100644 index 00000000000..f2fcb1f4a82 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/shell-execute-succeeded.frame.json @@ -0,0 +1,520 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 48, 48, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [248, 187, 147, 255], "bg": [49, 49, 49, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 49, 49, 255], "attributes": 0, "width": 1 }, + { "text": "Op", "fg": [238, 238, 238, 255], "bg": [49, 49, 49, 255], "attributes": 1, "width": 2 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [47, 47, 47, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [238, 238, 238, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 1 }, + { "text": "ode Drive", "fg": [238, 238, 238, 255], "bg": [36, 36, 36, 255], "attributes": 1, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 36, 36, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 38, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 39, 39, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 40, 40, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 41, 41, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 44, 44, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 45, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 46, 46, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 1.8s", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "$", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "printf catalog-shell-success", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Tool result declared output without an output schema", + "fg": [224, 108, 117, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 52 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 59 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The successful shell command completed.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 74 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 3.5s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...d909-908e-400d-bf9d-37cac347537d/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/shell-input-streaming.frame.json b/packages/lab/catalog/public/captures/opencode/shell-input-streaming.frame.json new file mode 100644 index 00000000000..c5b20738a1f --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/shell-input-streaming.frame.json @@ -0,0 +1,494 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [249, 184, 143, 255], "bg": [39, 39, 39, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 40, 40, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": "enCod", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 5 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [39, 39, 39, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [33, 33, 33, 255], "attributes": 1, "width": 1 }, + { "text": "Drive", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "Thought", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 104 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "Writing command...", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 91 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝⬝⬝", "fg": [36, 57, 86, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/shell-output-streaming.frame.json b/packages/lab/catalog/public/captures/opencode/shell-output-streaming.frame.json new file mode 100644 index 00000000000..bc062d71b7b --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/shell-output-streaming.frame.json @@ -0,0 +1,492 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [248, 186, 145, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [32, 32, 32, 255], "attributes": 1, "width": 1 }, + { "text": "penCode Drive", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [31, 31, 31, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [32, 32, 32, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [33, 33, 33, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 34, 34, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 35, 35, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 38, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 39, 39, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 40, 40, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 41, 41, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 2 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 1.8s", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "printf catalog-shell-success", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝⬝⬝⬝⬝⬝⬝", "fg": [36, 57, 86, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/skill-picker.frame.json b/packages/lab/catalog/public/captures/opencode/skill-picker.frame.json new file mode 100644 index 00000000000..40fc872795b --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/skill-picker.frame.json @@ -0,0 +1,569 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Skills", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 3 }, + { + "text": "OpenCode Use this skill for any question about OpenCode itself, including how Op", + "fg": [10, 10, 10, 255], + "bg": [250, 178, 131, 255], + "attributes": 1, + "width": 80 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Report ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " Use when the user wants to report an opencode issue or bug. Collect sta", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 72 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "\"What", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "is", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "tech", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "stack", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "of", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "this", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "project?\"", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/status.frame.json b/packages/lab/catalog/public/captures/opencode/status.frame.json new file mode 100644 index 00000000000..d5426f3a3e8 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/status.frame.json @@ -0,0 +1,673 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Status", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "No MCP servers", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": "█", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [16, 16, 16, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [16, 16, 16, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀", "fg": [53, 53, 53, 255], "bg": [16, 16, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [16, 16, 16, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [28, 28, 28, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [28, 28, 28, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [28, 28, 28, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 1 }, + { "text": "▀▀▀", "fg": [98, 98, 98, 255], "bg": [28, 28, 28, 255], "attributes": 1, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": "▀▀▀▀", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "█▀▀▀", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀", "fg": [16, 16, 16, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "▀", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 1, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "\"What", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "is", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "tech", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "stack", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "of", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "this", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "project?\"", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/subagent-completed.frame.json b/packages/lab/catalog/public/captures/opencode/subagent-completed.frame.json new file mode 100644 index 00000000000..e2160d79c8e --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/subagent-completed.frame.json @@ -0,0 +1,496 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 39, 39, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 132, 255], "bg": [35, 35, 35, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 35, 35, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Dri", "fg": [238, 238, 238, 255], "bg": [35, 35, 35, 255], "attributes": 1, "width": 12 }, + { "text": "v", "fg": [238, 238, 238, 255], "bg": [36, 36, 36, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 38, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 39, 39, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 40, 40, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 42, 42, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 44, 44, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 45, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 46, 46, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 47, 47, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 46, 46, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 41, 41, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Use a subagent to inspect src/ledger.ts and calculate the total.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 64 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 55ms", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "✓", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Researcher Subagent — Inspect ledger lifecycle", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 65 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "Subagent completed the ledger lifecycle.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 73 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.8s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...8254-5264-4488-b506-66d4b3b6a763/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/subagent-running.frame.json b/packages/lab/catalog/public/captures/opencode/subagent-running.frame.json new file mode 100644 index 00000000000..6c9bc981eee --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/subagent-running.frame.json @@ -0,0 +1,480 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Use a subagent to inspect src/ledger.ts and calculate the total.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 64 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 55ms", "fg": [151, 104, 44, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Researcher Subagent — Inspect ledger lifecycle", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 65 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝", "fg": [40, 63, 95, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/subagent-session.frame.json b/packages/lab/catalog/public/captures/opencode/subagent-session.frame.json new file mode 100644 index 00000000000..7e0df21fb79 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/subagent-session.frame.json @@ -0,0 +1,506 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 49, 49, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [249, 184, 141, 255], "bg": [49, 49, 49, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 48, 48, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [45, 45, 45, 255], "attributes": 1, "width": 1 }, + { "text": "penCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 44, 44, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 45, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 46, 46, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 47, 47, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 48, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 49, 49, 255], "attributes": 0, "width": 3 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "You are a subagent spawned by another session.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 65 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Read src/ledger.ts and report its exports, values, and calculated total.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 72 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 39 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The child inspected src/ledger.ts and calculated total 42.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 55 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Researcher", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { + "text": " · Simulated Model · 1.5s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 78 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Subagents", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Shell", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 90 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " No active subagents", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 92 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "show inactive", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 13 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "ctrl+a", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "tabs", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "←/→", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [72, 72, 72, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/theme-picker.frame.json b/packages/lab/catalog/public/captures/opencode/theme-picker.frame.json new file mode 100644 index 00000000000..18721f8d711 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/theme-picker.frame.json @@ -0,0 +1,715 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Themes", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 43 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "mercury", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "monokai", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "nightowl", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "nord", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 52 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "one-dark", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 48 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [250, 178, 131, 255], "attributes": 0, "width": 1 }, + { "text": "opencode", "fg": [10, 10, 10, 255], "bg": [250, 178, 131, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [250, 178, 131, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "orng", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 52 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Buil", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "osaka-jade", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 46 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀▀▀", "fg": [12, 12, 12, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "palenight", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { "text": "▀▀▀▀▀▀▀▀", "fg": [12, 12, 12, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 22 + }, + { "text": "/privat", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "rosepine", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 48 + }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": "solarized", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/thinking-streaming.frame.json b/packages/lab/catalog/public/captures/opencode/thinking-streaming.frame.json new file mode 100644 index 00000000000..42897f80a88 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/thinking-streaming.frame.json @@ -0,0 +1,470 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "Thinking", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 103 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝", "fg": [40, 63, 95, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/toast-error.frame.json b/packages/lab/catalog/public/captures/opencode/toast-error.frame.json new file mode 100644 index 00000000000..c663da79f72 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/toast-error.frame.json @@ -0,0 +1,593 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "OpenCode DriveCatalog cap", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 1, + "width": 25 + }, + { "text": "t", "fg": [196, 196, 196, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [146, 146, 146, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [97, 97, 97, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [47, 47, 47, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [95, 95, 95, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [95, 95, 95, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-9b", + "fg": [95, 95, 95, 255], + "bg": [17, 17, 17, 255], + "attributes": 0, + "width": 49 + }, + { "text": "┃", "fg": [224, 108, 117, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 50 + }, + { "text": "┃", "fg": [224, 108, 117, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 61 + }, + { "text": "┃", "fg": [224, 108, 117, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { + "text": "Sharing is not implemented for V2 sessions yet", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 46 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [224, 108, 117, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 47 + }, + { "text": "┃", "fg": [224, 108, 117, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 50 + }, + { "text": "┃", "fg": [224, 108, 117, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [238, 238, 238, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.7s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me about the fixture direction.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "# Questions", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Which direction should the fixture take?", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Keep it minimal (Recommended)", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 82 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "Keeping the fixture minimal.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 209ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5ab6-ac5f-4eeb-a801-dca9766779d4/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/toast-info.frame.json b/packages/lab/catalog/public/captures/opencode/toast-info.frame.json new file mode 100644 index 00000000000..51b9327449c --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/toast-info.frame.json @@ -0,0 +1,674 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [103, 73, 54, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "DriveCatalog", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "cap", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 3 }, + { "text": "t", "fg": [81, 81, 81, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [60, 60, 60, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [40, 40, 40, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [19, 19, 19, 255], "bg": [12, 12, 12, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [39, 39, 39, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [39, 39, 39, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [7, 7, 7, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-9b5a5ab6-ac5f-4eeb", + "fg": [39, 39, 39, 255], + "bg": [7, 7, 7, 255], + "attributes": 0, + "width": 65 + }, + { "text": "┃", "fg": [35, 75, 80, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [35, 75, 80, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 77 + }, + { "text": "┃", "fg": [35, 75, 80, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Debug", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "info", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "copied", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "clipboard", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [35, 75, 80, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [98, 98, 98, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 63 + }, + { "text": "┃", "fg": [35, 75, 80, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [35, 75, 80, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 59, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [98, 98, 98, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Si", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Debug", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + }, + { "text": "esc", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "me", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "abo", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Version ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "local (local)", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Date ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "2026-08-12T19:26:41.411Z", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "OS ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "macOS 25.5.0 (arm64)", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 55 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Terminal ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "ghostty 1.3.1", "fg": [238, 238, 238, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "#", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Question", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Session ID", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "ses_0088f2278ffeRfOCs51KQiGzfl", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 45 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Model ", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "simulation/gpt-sim-model", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Which", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "dire", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Keep", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "it", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "mi", "fg": [98, 98, 98, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Share this when reporting an issue.", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { "text": "✓ copied", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "enter", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [4, 4, 4, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "Keeping", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "minimal.", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "209ms", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [38, 64, 101, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [98, 98, 98, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [53, 53, 53, 255], "bg": [12, 12, 12, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 12, 12, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [38, 64, 101, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [12, 12, 12, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5ab6-ac5f-4eeb-a801-dca9766779d4/files", + "fg": [53, 53, 53, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [98, 98, 98, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [53, 53, 53, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [4, 4, 4, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [4, 4, 4, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [52, 89, 59, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [53, 53, 53, 255], "bg": [8, 8, 8, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [8, 8, 8, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/toast-success.frame.json b/packages/lab/catalog/public/captures/opencode/toast-success.frame.json new file mode 100644 index 00000000000..62a758bc2be --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/toast-success.frame.json @@ -0,0 +1,593 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "OpenCode DriveCatalog cap", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 1, + "width": 25 + }, + { "text": "t", "fg": [196, 196, 196, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [146, 146, 146, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [97, 97, 97, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [47, 47, 47, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [95, 95, 95, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [95, 95, 95, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [17, 17, 17, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-9b5a5ab6-", + "fg": [95, 95, 95, 255], + "bg": [17, 17, 17, 255], + "attributes": 0, + "width": 56 + }, + { "text": "┃", "fg": [127, 216, 143, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 43 + }, + { "text": "┃", "fg": [127, 216, 143, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 68 + }, + { "text": "┃", "fg": [127, 216, 143, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { + "text": "Session transcript copied to clipboard!", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 39 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [127, 216, 143, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [238, 238, 238, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 54 + }, + { "text": "┃", "fg": [127, 216, 143, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 43 + }, + { "text": "┃", "fg": [127, 216, 143, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 143, 143, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [238, 238, 238, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.7s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me about the fixture direction.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "# Questions", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Which direction should the fixture take?", + "fg": [128, 128, 128, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Keep it minimal (Recommended)", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 82 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [10, 10, 10, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "Keeping the fixture minimal.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 209ms", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5ab6-ac5f-4eeb-a801-dca9766779d4/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/webfetch-streaming.frame.json b/packages/lab/catalog/public/captures/opencode/webfetch-streaming.frame.json new file mode 100644 index 00000000000..29b96d393d8 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/webfetch-streaming.frame.json @@ -0,0 +1,473 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [250, 178, 131, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "New session", "fg": [238, 238, 238, 255], "bg": [30, 30, 30, 255], "attributes": 1, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Fetching from the web...", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝", "fg": [30, 45, 66, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/webfetch-success.frame.json b/packages/lab/catalog/public/captures/opencode/webfetch-success.frame.json new file mode 100644 index 00000000000..13a692a2448 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/webfetch-success.frame.json @@ -0,0 +1,486 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 178, 131, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 43, 43, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 43, 43, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "%", "fg": [224, 108, 117, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "WebFetch https://example.com", + "fg": [224, 108, 117, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The web fetch is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 7.2s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5896-73f1-46ad-af77-61e6cfee80ff/files", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/websearch-failure.frame.json b/packages/lab/catalog/public/captures/opencode/websearch-failure.frame.json new file mode 100644 index 00000000000..2eeed0bb2d9 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/websearch-failure.frame.json @@ -0,0 +1,527 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [31, 31, 31, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [250, 179, 134, 255], "bg": [32, 32, 32, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [33, 33, 33, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [238, 238, 238, 255], "bg": [34, 34, 34, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [238, 238, 238, 255], "bg": [35, 35, 35, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [36, 36, 36, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [238, 238, 238, 255], "bg": [38, 38, 38, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [238, 238, 238, 255], "bg": [39, 39, 39, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [238, 238, 238, 255], "bg": [40, 40, 40, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [238, 238, 238, 255], "bg": [41, 41, 41, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": " Dri", "fg": [238, 238, 238, 255], "bg": [43, 43, 43, 255], "attributes": 1, "width": 4 }, + { "text": "v", "fg": [238, 238, 238, 255], "bg": [42, 42, 42, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [238, 238, 238, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [32, 32, 32, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 14 }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "%", "fg": [224, 108, 117, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "WebFetch https://example.com", + "fg": [224, 108, 117, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The web fetch is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 7.2s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the web for the OpenCode terminal interface.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 51 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "⠹", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Searching web...", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [97, 162, 231, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [63, 105, 163, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [45, 72, 110, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [33, 50, 75, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [25, 36, 52, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝", "fg": [59, 98, 151, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/opencode/websearch-running.frame.json b/packages/lab/catalog/public/captures/opencode/websearch-running.frame.json new file mode 100644 index 00000000000..5e846857260 --- /dev/null +++ b/packages/lab/catalog/public/captures/opencode/websearch-running.frame.json @@ -0,0 +1,517 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [197, 147, 180, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 37, 37, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [238, 238, 238, 255], "bg": [37, 37, 37, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [37, 37, 37, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "%", "fg": [224, 108, 117, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "WebFetch https://example.com", + "fg": [224, 108, 117, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": "The web fetch is complete.", + "fg": [238, 238, 238, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 7.2s", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the web for the OpenCode terminal interface.", + "fg": [238, 238, 238, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 51 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "Searching web...", + "fg": [128, 128, 128, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [92, 156, 245, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [238, 238, 238, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [128, 128, 128, 255], "bg": [30, 30, 30, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 30, 30, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [30, 30, 30, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [92, 156, 245, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝⬝", "fg": [25, 36, 52, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [238, 238, 238, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [128, 128, 128, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [10, 10, 10, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [10, 10, 10, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [127, 216, 143, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [128, 128, 128, 255], "bg": [20, 20, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [20, 20, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/agent-picker.frame.json b/packages/lab/catalog/public/captures/tokyonight/agent-picker.frame.json new file mode 100644 index 00000000000..c45cf1023e6 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/agent-picker.frame.json @@ -0,0 +1,680 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Select agent", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 37 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { + "text": "build The default agent. Executes tools based on con", + "fg": [26, 27, 38, 255], + "bg": [130, 170, 255, 255], + "attributes": 1, + "width": 52 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "plan", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " Read-only agent for exploring the codebase and ", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 48 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "reviewer", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { + "text": " Reviews deterministic UI fixtures", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 34 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/assistant-response-failed.frame.json b/packages/lab/catalog/public/captures/tokyonight/assistant-response-failed.frame.json new file mode 100644 index 00000000000..1b69666d4d7 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/assistant-response-failed.frame.json @@ -0,0 +1,517 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a successful streaming assistant response.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 64 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "This assistant response completes successfully.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 66 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 102ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a failed assistant response.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "This response starts but the simulated provider disconnects.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 53 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "Error: Decode error (200 POST https://api.openai.com/v1/chat/completions)", + "fg": [255, 117, 127, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 73 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 40 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "Build · Simulated Model · 311ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 31 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...ae99-3122-4a7a-93fb-52b7acebf43e/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [255, 117, 127, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/assistant-response-interrupted.frame.json b/packages/lab/catalog/public/captures/tokyonight/assistant-response-interrupted.frame.json new file mode 100644 index 00000000000..49c69ffaf38 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/assistant-response-interrupted.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a successful streaming assistant response.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 64 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "This assistant response completes successfully.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 66 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 102ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a failed assistant response.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "This response starts but the simulated provider disconnects.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 53 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "Error: Decode error (200 POST https://api.openai.com/v1/chat/completions)", + "fg": [255, 117, 127, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 73 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 40 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "Build · Simulated Model · 311ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 31 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Show an interrupted assistant response.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 72 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "This response remains active until the user interrupts it.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 55 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝", "fg": [66, 57, 90, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [255, 117, 127, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/assistant-response-succeeded.frame.json b/packages/lab/catalog/public/captures/tokyonight/assistant-response-succeeded.frame.json new file mode 100644 index 00000000000..043c1943b79 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/assistant-response-succeeded.frame.json @@ -0,0 +1,476 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 41, 60, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [39, 41, 60, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 41, 60, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [39, 41, 60, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [39, 41, 60, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Show a successful streaming assistant response.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 64 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "This assistant response completes successfully.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 66 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 102ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...ae99-3122-4a7a-93fb-52b7acebf43e/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/command-palette.frame.json b/packages/lab/catalog/public/captures/tokyonight/command-palette.frame.json new file mode 100644 index 00000000000..0e23e7b66b3 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/command-palette.frame.json @@ -0,0 +1,741 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Commands", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 41 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Suggested", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 3 }, + { "text": "Switch model", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [130, 170, 255, 255], + "attributes": 0, + "width": 32 + }, + { "text": "ctrl+x m", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "Connect an integration", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Open settings", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Session", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Switch session", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 30 + }, + { "text": "ctrl+x l", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Buil", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "New session", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 33 + }, + { "text": "ctrl+x n", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀▀▀", "fg": [14, 15, 22, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "Open session or project", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 23 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 23 + }, + { "text": "ctrl+o", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "▀▀▀▀▀▀▀▀", "fg": [14, 15, 22, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "/privat", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Close tab", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { "text": "ctrl+x w", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "Reopen closed tab", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 23 + }, + { "text": "ctrl+shift+t", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/debug.frame.json b/packages/lab/catalog/public/captures/tokyonight/debug.frame.json new file mode 100644 index 00000000000..cfdbf206886 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/debug.frame.json @@ -0,0 +1,627 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Debug", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Version ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "local (local)", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Date ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "2026-08-12T19:26:35.794Z", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "OS ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "macOS 25.5.0 (arm64)", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 55 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Terminal ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "ghostty 1.3.1", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Session ID", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "n/a", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 72 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Model ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "simulation/gpt-sim-model", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Share this when reporting an issue.", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 39 + }, + { "text": "copy", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "enter", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/diff-viewer.frame.json b/packages/lab/catalog/public/captures/tokyonight/diff-viewer.frame.json new file mode 100644 index 00000000000..37a8063ad0d --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/diff-viewer.frame.json @@ -0,0 +1,460 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "Diff ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "working tree", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 93 + }, + { "text": "0 files", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 } + ] + }, + { + "spans": [ + { + "text": "────────────────────────────────────────────────────────────────────────────────", + "fg": [115, 122, 162, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 80 + }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "──", "fg": [115, 122, 162, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "No changes to show", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 61 + }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { + "text": "Debug info copied to clipboard", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 30 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 80 + }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { + "text": "focus file tree", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "n ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "next file", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "] ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "next hunk", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "[ ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "previous hunk", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "previous file", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "d ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "switch source", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "m ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "mark reviewed", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "? ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "all", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/glob-empty.frame.json b/packages/lab/catalog/public/captures/tokyonight/glob-empty.frame.json new file mode 100644 index 00000000000..2208a7edc4d --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/glob-empty.frame.json @@ -0,0 +1,530 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [44, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Find the TypeScript source files.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The first glob search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 690ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Find Rust files that do not exist.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty glob search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 165ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...aabf-99f8-4b9d-9d17-28dc838b3ee5/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/glob-success.frame.json b/packages/lab/catalog/public/captures/tokyonight/glob-success.frame.json new file mode 100644 index 00000000000..7e7056108c1 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/glob-success.frame.json @@ -0,0 +1,486 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 37, 56, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [35, 37, 56, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 37, 56, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [35, 37, 56, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [35, 37, 56, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Find the TypeScript source files.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 33 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The first glob search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 690ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...aabf-99f8-4b9d-9d17-28dc838b3ee5/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/grep-empty.frame.json b/packages/lab/catalog/public/captures/tokyonight/grep-empty.frame.json new file mode 100644 index 00000000000..28e2d962d0b --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/grep-empty.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [131, 170, 254, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The grouped exploration is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 774ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for credits.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The matching grep search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 76 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 152ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for DEADBEEF.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty grep search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 116ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...aabf-99f8-4b9d-9d17-28dc838b3ee5/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [255, 117, 127, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/grep-failure.frame.json b/packages/lab/catalog/public/captures/tokyonight/grep-failure.frame.json new file mode 100644 index 00000000000..4c69eefea66 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/grep-failure.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 39, 57, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [36, 39, 57, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 39, 57, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [36, 39, 57, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [36, 39, 57, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The matching grep search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 76 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 152ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for DEADBEEF.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty grep search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 116ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Run an invalid regular expression search.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The invalid grep search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 148ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...aabf-99f8-4b9d-9d17-28dc838b3ee5/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [255, 117, 127, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/grep-success.frame.json b/packages/lab/catalog/public/captures/tokyonight/grep-success.frame.json new file mode 100644 index 00000000000..76bf144360d --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/grep-success.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 37, 55, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [168, 164, 211, 255], "bg": [35, 37, 55, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 37, 55, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [35, 37, 55, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [35, 37, 55, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty glob search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 165ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Explore TypeScript files and search them for credits together.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 62 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 2 searches", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 90 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The grouped exploration is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 774ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the source directory for credits.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The matching grep search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 76 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 152ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...aabf-99f8-4b9d-9d17-28dc838b3ee5/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [255, 117, 127, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/grouped-exploration.frame.json b/packages/lab/catalog/public/captures/tokyonight/grouped-exploration.frame.json new file mode 100644 index 00000000000..6a3f365763e --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/grouped-exploration.frame.json @@ -0,0 +1,547 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The first glob search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 690ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Find Rust files that do not exist.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 search", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The empty glob search is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 34 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 165ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Explore TypeScript files and search them for credits together.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 62 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 49 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 2 searches", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 90 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The grouped exploration is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 36 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 77 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 774ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...aabf-99f8-4b9d-9d17-28dc838b3ee5/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "● UI", "fg": [255, 117, 127, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/help.frame.json b/packages/lab/catalog/public/captures/tokyonight/help.frame.json new file mode 100644 index 00000000000..4ad08cf4235 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/help.frame.json @@ -0,0 +1,678 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Help", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": "esc/enter", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Press ctrl+p to see all available actions and commands ", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 55 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "in any context.", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 3 }, + { "text": "ok", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/home.frame.json b/packages/lab/catalog/public/captures/tokyonight/home.frame.json new file mode 100644 index 00000000000..93baa756c4a --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/home.frame.json @@ -0,0 +1,616 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "New session", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ▄ ", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 1, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 40 + }, + { + "text": "█▀▀█ █▀▀█ █▀▀█ █▀▀▄", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "█▀▀▀ █▀▀█ █▀▀█ █▀▀█", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 1, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 40 + }, + { "text": "█", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [130, 139, 184, 255], "bg": [52, 55, 74, 255], "attributes": 0, "width": 2 }, + { "text": "█ █", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [130, 139, 184, 255], "bg": [52, 55, 74, 255], "attributes": 0, "width": 2 }, + { "text": "█ █", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "▀▀▀", "fg": [130, 139, 184, 255], "bg": [52, 55, 74, 255], "attributes": 0, "width": 3 }, + { "text": " █", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [130, 139, 184, 255], "bg": [52, 55, 74, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [70, 73, 90, 255], "attributes": 1, "width": 3 }, + { "text": " █", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 1, "width": 2 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [70, 73, 90, 255], "attributes": 1, "width": 2 }, + { "text": "█ █", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [70, 73, 90, 255], "attributes": 1, "width": 2 }, + { "text": "█ █", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 1, "width": 3 }, + { "text": "▀▀▀", "fg": [200, 211, 245, 255], "bg": [70, 73, 90, 255], "attributes": 1, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 40 + }, + { + "text": "▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 16 + }, + { "text": "▀▀", "fg": [52, 55, 74, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "▀", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 1, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask anything... \"Fix a TODO in the codebase\"", + "fg": [130, 139, 184, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-580163831713/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/integration-picker.frame.json b/packages/lab/catalog/public/captures/tokyonight/integration-picker.frame.json new file mode 100644 index 00000000000..c58f65caa04 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/integration-picker.frame.json @@ -0,0 +1,729 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "Connect an integration", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 1, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 27 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Popular", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 3 }, + { "text": "OpenCode", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [130, 170, 255, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "openai", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "github-copilot", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 42 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Services", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 48 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "azure", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Buil", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "cloudflare-ai-gateway", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀▀▀", "fg": [14, 15, 22, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "cloudflare-workers-ai", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { "text": "▀▀▀▀▀▀▀▀", "fg": [14, 15, 22, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "/privat", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Exa", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 53 + }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Firecrawl", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/mcp-list.frame.json b/packages/lab/catalog/public/captures/tokyonight/mcp-list.frame.json new file mode 100644 index 00000000000..3cb22305226 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/mcp-list.frame.json @@ -0,0 +1,676 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "MCP servers", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 38 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "No items available", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "connect space", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/model-picker.frame.json b/packages/lab/catalog/public/captures/tokyonight/model-picker.frame.json new file mode 100644 index 00000000000..e20a123ef8a --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/model-picker.frame.json @@ -0,0 +1,687 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Select model", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 37 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [26, 27, 38, 255], + "bg": [130, 170, 255, 255], + "attributes": 1, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [130, 170, 255, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "View all integrations", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ctrl+a", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/pair.frame.json b/packages/lab/catalog/public/captures/tokyonight/pair.frame.json new file mode 100644 index 00000000000..005a1b20c44 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/pair.frame.json @@ -0,0 +1,813 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Pair", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 77 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "This device", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 30 + }, + { + "text": "█▀▀▀▀▀▀▀████▀██▀█▀██▀▀▀█▀██▀████▀██▀▀▀▀▀▀▀█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "http://localhost:60112", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 19 + }, + { + "text": "█ █▀▀▀█ █▄▀▄ ██▀▄██▄▀ ▀▀▀▀▄▄▄▀▄ █▄█ █▀▀▀█ █", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █ █ █▄▀▀▀ █▀ ▀█▄▄▀▀▄██▄▄▄▀█▀█ █ █ █ █", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "URLs", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 37 + }, + { + "text": "█ ▀▀▀▀▀ █ ▄ █▀█▀█▀█ ▄▀▄ █▀█▀▄ ▄ █ █ ▀▀▀▀▀ █", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "http://127.0.0.1:60112", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 19 + }, + { + "text": "█▀▀▀▀▀█▀▀▀ ▀ █▀▀█▄▀▄ ▄▄ █▀█▄▀▀ █ ▀█▀█▀█▀██", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█▀██ ▀▄▀█ ▄▄▄█ ▀▀█ ▄▄▄ ▄▄█▀ ▀█▀▀▄▀ ▄▄▄ █▄▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Username", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 33 + }, + { + "text": "█▀▀ ▄▄█▀▄ ▀ ▀▄▄▀▄ ▄▄▄█▄ █▀▀ █▀█▄ ▄▄▄█ ▀▄▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "opencode", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 33 + }, + { + "text": "█▀ ▀▄▄█▀ ▄▀██▄██ ▀█▄█▀▄█████ ▄▀█▄▄▀ ▄▄ ██▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "██▄█▀ █▀ ████ ▀ █▀█▀▄▄▀▀▄▀▄▄▀▀▀█▄▄██▄ █ ▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Password", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 33 + }, + { + "text": "█▀▀▄ ▄▀▀▀█ ▄ █▄▀██ ▄███▄▀▄ ▀▀▀▄▄▀▀ ▀▄█▀▀▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "************", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 29 + }, + { + "text": "█ ▄▄▄██▀█▀▄▀█▀█▄▀██▀ ▀▄▀▄ ▀ █▀▄ ▄█▀▄▀ ▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█▀█▄█▄ ▀▄██▄▀▀▀▄▄▄ █▄▄█▀███▄ █▄▄█▄▄▄█▄ ▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Run `opencode service set ", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 15 + }, + { + "text": "█ ▀▀██▀▀▄▀ ▄ ▀▀ █▄▀▄▄▀▄▀▄▀▀▄▀▀▀ ██▄█ ▀▀ █", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "hostname 0.0.0.0` to access ", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 28 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 13 }, + { + "text": "█▄ ▄ ▀ ▀▀▀▄█▄▀ ▀▀ ▄▄██▀▄ █▄▀█▀█▄█▀▄▄▄▄▄ ▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "the service remotely.", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 20 + }, + { + "text": "█▄ ▀█▄ ▀▄▀ █▄▄▄▀ ▄▄▄█▄ ▀█▀ █▄█▄ ▀██▀█ ▀ █", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ ▄ █▀▀▀▀█ █▄▀█ ▀▀ ▄▀ ▄▄█▀▄▀▄█ █▄▄▄█ █▀█▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ ███ █▀ ▀▀█▄▀ █▀██▄▄ ▄▀▀███▀ █▀ ▀ ▀ ▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█▀▀▀▀▀▀▀█ █ ▄██▄▀▄█ ▄▀▄█▄▄██▀█▀▄ █▀█ ▀▀▀▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █▀▀▀█ █▀ █ ▀█▄ ▄█▀█▄▄ ▀▀▀ ▀███ ▀▀▀ █▀ ▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { + "text": "█ █ █ █ ▀▀▀ ▄▄ ██ ▀ ▄█▀▄▀▄ ▄███▀▄▀▄▀█▄█", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/patch-created.frame.json b/packages/lab/catalog/public/captures/tokyonight/patch-created.frame.json new file mode 100644 index 00000000000..3d25c714e49 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/patch-created.frame.json @@ -0,0 +1,499 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [131, 171, 255, 255], "bg": [40, 42, 60, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 41, 59, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [39, 41, 59, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [39, 41, 59, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "# Created", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-262c4985-eb22-4331-8a12-5d0624455d3f/files/patched.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "created by patch", + "fg": [200, 211, 245, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "⬝", "fg": [116, 95, 155, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [56, 50, 77, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [72, 62, 98, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [96, 80, 130, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [134, 109, 179, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "⬝", "fg": [116, 95, 155, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/patch-deleted.frame.json b/packages/lab/catalog/public/captures/tokyonight/patch-deleted.frame.json new file mode 100644 index 00000000000..2520ffa35eb --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/patch-deleted.frame.json @@ -0,0 +1,557 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 48, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [133, 172, 255, 255], "bg": [41, 44, 63, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 41, 59, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [37, 40, 58, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [37, 40, 58, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "# Created", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-262c4985-eb22-4331-8a12-5d0624455d3f/files/patched.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "created by patch", + "fg": [200, 211, 245, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-262c4985-eb22-4331-8a12-5d0624455d3f/files/fixture.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "updated by patch", + "fg": [200, 211, 245, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "# Deleted", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-262c4985-eb22-4331-8a12-5d0624455d3f/files/patched.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "-1 line", "fg": [197, 59, 83, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [126, 103, 168, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [56, 50, 77, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [72, 62, 98, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [96, 80, 130, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [134, 109, 179, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/patch-failed.frame.json b/packages/lab/catalog/public/captures/tokyonight/patch-failed.frame.json new file mode 100644 index 00000000000..754d7201809 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/patch-failed.frame.json @@ -0,0 +1,577 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 49, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [133, 172, 255, 255], "bg": [47, 50, 69, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 51, 69, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [200, 211, 245, 255], "bg": [49, 51, 70, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [200, 211, 245, 255], "bg": [50, 52, 72, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [51, 53, 73, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [200, 211, 245, 255], "bg": [52, 54, 74, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [200, 211, 245, 255], "bg": [52, 55, 75, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [200, 211, 245, 255], "bg": [52, 56, 76, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [200, 211, 245, 255], "bg": [53, 56, 76, 255], "attributes": 1, "width": 1 }, + { "text": "e Dr", "fg": [200, 211, 245, 255], "bg": [53, 57, 77, 255], "attributes": 1, "width": 4 }, + { "text": "i", "fg": [200, 211, 245, 255], "bg": [51, 54, 73, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [200, 211, 245, 255], "bg": [47, 50, 69, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [44, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [29, 31, 45, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-262c4985-eb22-4331-8a12-5d0624455d3f/files/fixture.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "updated by patch", + "fg": [200, 211, 245, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "# Deleted", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-262c4985-eb22-4331-8a12-5d0624455d3f/files/patched.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "-1 line", "fg": [197, 59, 83, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "# Patch failed", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 14 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "missing-patch.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "patch verification failed: Failed to read file to update /private/var/folders/dd/", + "fg": [255, 117, 127, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 81 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 30 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-262c4985-eb22-4331-8a12-5d0624455d3f/files/missing-patch.", + "fg": [255, 117, 127, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 109 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "txt: file does not exist", + "fg": [255, 117, 127, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 87 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The patch file-change lifecycle is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 69 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 3.1s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...4985-eb22-4331-8a12-5d0624455d3f/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/patch-input-streaming.frame.json b/packages/lab/catalog/public/captures/tokyonight/patch-input-streaming.frame.json new file mode 100644 index 00000000000..bf40f52e3f7 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/patch-input-streaming.frame.json @@ -0,0 +1,481 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 50, 70, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [131, 171, 255, 255], "bg": [44, 47, 65, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 45, 64, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [42, 45, 64, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [42, 45, 64, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⠸", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [126, 103, 168, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [56, 50, 77, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [72, 62, 98, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [96, 80, 130, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [134, 109, 179, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/patch-success.frame.json b/packages/lab/catalog/public/captures/tokyonight/patch-success.frame.json new file mode 100644 index 00000000000..4b1621e2fbf --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/patch-success.frame.json @@ -0,0 +1,509 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 37, 55, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [35, 37, 55, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 37, 55, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [35, 37, 55, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [35, 37, 55, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-580163831713/files/fixture.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [200, 211, 245, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.7s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...f34a-2a28-4fe7-8255-580163831713/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/patch-updated.frame.json b/packages/lab/catalog/public/captures/tokyonight/patch-updated.frame.json new file mode 100644 index 00000000000..9f9f1dd3b4c --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/patch-updated.frame.json @@ -0,0 +1,537 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 48, 67, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [132, 171, 255, 255], "bg": [42, 44, 63, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 42, 61, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [40, 42, 61, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [40, 42, 61, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 21 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "# Created", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-262c4985-eb22-4331-8a12-5d0624455d3f/files/patched.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "created by patch", + "fg": [200, 211, 245, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-262c4985-eb22-4331-8a12-5d0624455d3f/files/fixture.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { + "text": "updated by patch", + "fg": [200, 211, 245, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [126, 103, 168, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [56, 50, 77, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [72, 62, 98, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [96, 80, 130, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [134, 109, 179, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/permission-always-confirmation.frame.json b/packages/lab/catalog/public/captures/tokyonight/permission-always-confirmation.frame.json new file mode 100644 index 00000000000..a58cab9ff69 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/permission-always-confirmation.frame.json @@ -0,0 +1,495 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": "pe", "fg": [200, 211, 245, 255], "bg": [46, 48, 67, 255], "attributes": 1, "width": 2 }, + { "text": "n", "fg": [200, 211, 245, 255], "bg": [47, 49, 68, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [200, 211, 245, 255], "bg": [47, 50, 69, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [200, 211, 245, 255], "bg": [48, 51, 70, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [200, 211, 245, 255], "bg": [49, 52, 71, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [50, 53, 72, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [51, 54, 74, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [200, 211, 245, 255], "bg": [52, 55, 74, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [200, 211, 245, 255], "bg": [52, 55, 75, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [200, 211, 245, 255], "bg": [53, 56, 75, 255], "attributes": 1, "width": 1 }, + { "text": "ve", "fg": [200, 211, 245, 255], "bg": [54, 56, 76, 255], "attributes": 1, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 57, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 57, 77, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 56, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 55, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 50, 69, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 10 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⠙", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Always allow", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 97 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "This will allow edit until OpenCode is restarted.", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "Confirm", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Cancel", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 68 + }, + { "text": "⇆ ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/permission-always-selected.frame.json b/packages/lab/catalog/public/captures/tokyonight/permission-always-selected.frame.json new file mode 100644 index 00000000000..7f3d7e25cf4 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/permission-always-selected.frame.json @@ -0,0 +1,546 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [200, 211, 245, 255], "bg": [45, 48, 67, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [45, 48, 68, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [200, 211, 245, 255], "bg": [46, 49, 68, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [200, 211, 245, 255], "bg": [47, 50, 69, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [200, 211, 245, 255], "bg": [48, 51, 71, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [200, 211, 245, 255], "bg": [49, 52, 72, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [50, 53, 72, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [51, 54, 73, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [200, 211, 245, 255], "bg": [52, 55, 74, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [200, 211, 245, 255], "bg": [53, 55, 75, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [200, 211, 245, 255], "bg": [53, 56, 76, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [200, 211, 245, 255], "bg": [54, 56, 76, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [54, 57, 77, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 57, 77, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 56, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 53, 72, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 48, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 10 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": "580163831713/files/fixture.txt", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [200, 211, 245, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": "Allow once", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "Allow always", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Reject", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/permission-fullscreen.frame.json b/packages/lab/catalog/public/captures/tokyonight/permission-fullscreen.frame.json new file mode 100644 index 00000000000..a260bea32a8 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/permission-fullscreen.frame.json @@ -0,0 +1,556 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [43, 46, 65, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCod", "fg": [200, 211, 245, 255], "bg": [43, 46, 65, 255], "attributes": 1, "width": 7 }, + { "text": "e D", "fg": [200, 211, 245, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 3 }, + { "text": "ri", "fg": [200, 211, 245, 255], "bg": [45, 48, 67, 255], "attributes": 1, "width": 2 }, + { "text": "ve", "fg": [200, 211, 245, 255], "bg": [46, 49, 68, 255], "attributes": 1, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 49, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 50, 68, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 50, 69, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 50, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 48, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 46, 65, 255], "attributes": 0, "width": 6 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": "580163831713/files/fixture.txt", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [200, 211, 245, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": "Allow once", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": "Allow always", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "Reject", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 32 + }, + { "text": "ctrl+f ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": "minimize", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/permission-prompt.frame.json b/packages/lab/catalog/public/captures/tokyonight/permission-prompt.frame.json new file mode 100644 index 00000000000..ab59c5ab2af --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/permission-prompt.frame.json @@ -0,0 +1,545 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [44, 46, 65, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [200, 211, 245, 255], "bg": [44, 46, 65, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [46, 48, 67, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [200, 211, 245, 255], "bg": [46, 48, 68, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [200, 211, 245, 255], "bg": [46, 49, 69, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [200, 211, 245, 255], "bg": [47, 51, 70, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [200, 211, 245, 255], "bg": [48, 52, 71, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [49, 53, 72, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [50, 54, 73, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [200, 211, 245, 255], "bg": [51, 54, 74, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [200, 211, 245, 255], "bg": [52, 55, 74, 255], "attributes": 1, "width": 1 }, + { "text": "i", "fg": [200, 211, 245, 255], "bg": [53, 55, 75, 255], "attributes": 1, "width": 1 }, + { "text": "ve", "fg": [200, 211, 245, 255], "bg": [53, 56, 76, 255], "attributes": 1, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 56, 76, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 54, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 51, 70, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 46, 65, 255], "attributes": 0, "width": 10 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": "580163831713/files/fixture.txt", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [200, 211, 245, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "Allow once", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Allow always", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": "Reject", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/permission-reject-selected.frame.json b/packages/lab/catalog/public/captures/tokyonight/permission-reject-selected.frame.json new file mode 100644 index 00000000000..2350c3b6539 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/permission-reject-selected.frame.json @@ -0,0 +1,543 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "Op", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 2 }, + { "text": "en", "fg": [200, 211, 245, 255], "bg": [46, 48, 67, 255], "attributes": 1, "width": 2 }, + { "text": "C", "fg": [200, 211, 245, 255], "bg": [47, 49, 68, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [200, 211, 245, 255], "bg": [47, 50, 69, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [200, 211, 245, 255], "bg": [48, 51, 70, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [49, 52, 71, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [50, 53, 73, 255], "attributes": 1, "width": 1 }, + { "text": "D", "fg": [200, 211, 245, 255], "bg": [51, 54, 74, 255], "attributes": 1, "width": 1 }, + { "text": "ri", "fg": [200, 211, 245, 255], "bg": [52, 55, 74, 255], "attributes": 1, "width": 2 }, + { "text": "v", "fg": [200, 211, 245, 255], "bg": [53, 55, 75, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [53, 56, 76, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 56, 76, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 55, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 53, 72, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 48, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 9 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⠙", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Patching", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Edit private/var/folders/dd/5fz89drs5p9_r0fk7rwqqnbr0000gn/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": "580163831713/files/fixture.txt", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 98 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [200, 211, 245, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": "Allow once", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": "Allow always", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "Reject", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 30 + }, + { "text": "ctrl+f ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/question-awaiting-form.frame.json b/packages/lab/catalog/public/captures/tokyonight/question-awaiting-form.frame.json new file mode 100644 index 00000000000..e79e8698e4a --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/question-awaiting-form.frame.json @@ -0,0 +1,539 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 2 questions", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Runtime", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": "Validation", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": "Confirm", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "1.", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Bun", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 105 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the repository's configured runtime.", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 68 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "2.", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Node", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the Node.js compatibility runtime.", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "3.", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Type your own answer", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "tab", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/question-denied.frame.json b/packages/lab/catalog/public/captures/tokyonight/question-denied.frame.json new file mode 100644 index 00000000000..78fc1b4a0c8 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/question-denied.frame.json @@ -0,0 +1,582 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [29, 31, 45, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Bun", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 108 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Which validation should run?", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Focused", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The catalog answers were submitted.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 78 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 7.5s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask one more runtime question that I will dismiss.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 61 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 1 question", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "1.", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Bun", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 105 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the repository's configured runtime.", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 68 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "2.", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Node", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { + "text": "Use the Node.js compatibility runtime.", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 70 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "3.", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Type your own answer", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 75 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/question-input-streaming.frame.json b/packages/lab/catalog/public/captures/tokyonight/question-input-streaming.frame.json new file mode 100644 index 00000000000..3ffe249b86b --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/question-input-streaming.frame.json @@ -0,0 +1,478 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 50, 69, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [131, 170, 255, 255], "bg": [44, 46, 65, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 45, 64, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [43, 45, 64, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [43, 45, 64, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "⠸", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Asking questions...", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 92 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝", "fg": [126, 103, 168, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "■", "fg": [56, 50, 77, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [72, 62, 98, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [96, 80, 130, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [134, 109, 179, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/question-prompt.frame.json b/packages/lab/catalog/public/captures/tokyonight/question-prompt.frame.json new file mode 100644 index 00000000000..6303e38a30c --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/question-prompt.frame.json @@ -0,0 +1,586 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "← Patched", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-580163831713/files/fixture.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [200, 211, 245, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.7s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me about the fixture direction.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 1 question", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Which direction should the fixture take?", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "1.", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Keep it minimal (Recommended)", + "fg": [130, 170, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { + "text": "Small deterministic fixture", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "2.", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Expand coverage", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 93 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { + "text": "Add more scripted states", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 84 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "3.", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Type your own answer", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 75 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/question-review.frame.json b/packages/lab/catalog/public/captures/tokyonight/question-review.frame.json new file mode 100644 index 00000000000..13393129221 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/question-review.frame.json @@ -0,0 +1,498 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Asked 2 questions", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Questions", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 102 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Runtime", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": "Validation", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": "Confirm", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Review", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 105 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Runtime:", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Bun", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Validation:", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "Focused", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 92 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "tab", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "↑↓ ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": "scroll", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "dismiss", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 68 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/question-succeeded.frame.json b/packages/lab/catalog/public/captures/tokyonight/question-succeeded.frame.json new file mode 100644 index 00000000000..99b72a2f337 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/question-succeeded.frame.json @@ -0,0 +1,525 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [44, 46, 65, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [44, 46, 65, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [44, 46, 65, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me which runtime and validation mode to use.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "# Questions", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Which runtime should the catalog fixture use?", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Bun", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 108 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Which validation should run?", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Focused", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 104 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The catalog answers were submitted.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 78 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 7.5s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...b9ae-f3d0-427c-b8f1-b81bab991fbe/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/read-denied.frame.json b/packages/lab/catalog/public/captures/tokyonight/read-denied.frame.json new file mode 100644 index 00000000000..46e6cc818ec --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/read-denied.frame.json @@ -0,0 +1,575 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [44, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [101, 108, 143, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "Explored", "fg": [101, 108, 143, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "—", "fg": [101, 108, 143, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [101, 108, 143, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "read", "fg": [101, 108, 143, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture read succeeded.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 502ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Now try to read a missing file.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 31 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 80 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 read", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The missing-file read failed as expected.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 41 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 72 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 161ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Now read the ledger file.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [255, 150, 108, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Read src/ledger.ts", + "fg": [255, 150, 108, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 93 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Read src/ledger.ts", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Path: src/ledger.ts", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 92 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "Allow once", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Allow always", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": "Reject", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/read-input-streaming.frame.json b/packages/lab/catalog/public/captures/tokyonight/read-input-streaming.frame.json new file mode 100644 index 00000000000..6a321b9782a --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/read-input-streaming.frame.json @@ -0,0 +1,477 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [44, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Read the fixture file.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "⠹", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Exploring — 1 read", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 93 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [72, 62, 98, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [96, 80, 130, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [134, 109, 179, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝", "fg": [96, 80, 129, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/read-permission.frame.json b/packages/lab/catalog/public/captures/tokyonight/read-permission.frame.json new file mode 100644 index 00000000000..ce4769a9e06 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/read-permission.frame.json @@ -0,0 +1,504 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 49, 68, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [255, 150, 108, 255], "bg": [43, 47, 65, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 45, 63, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [42, 45, 63, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [42, 45, 63, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Read the fixture file.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [255, 150, 108, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Read fixture.txt", + "fg": [255, 150, 108, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "△", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Permission required", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 19 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Read fixture.txt", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 91 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Path: fixture.txt", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 94 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "Allow once", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Allow always", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": "Reject", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 31 + }, + { "text": "ctrl+f ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": "fullscreen", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "⇆ ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "select", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 6 }, + { "text": "confirm", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/read-succeeded.frame.json b/packages/lab/catalog/public/captures/tokyonight/read-succeeded.frame.json new file mode 100644 index 00000000000..0f6a4ae4bd5 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/read-succeeded.frame.json @@ -0,0 +1,486 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 41, 59, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [40, 41, 59, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 41, 59, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [40, 41, 59, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [40, 41, 59, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Read the fixture file.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 22 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 89 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "→", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Explored — 1 read", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 17 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 94 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture read succeeded.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 502ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...89bd-2d74-404f-a1f2-8caf05c0ce33/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/session-export.frame.json b/packages/lab/catalog/public/captures/tokyonight/session-export.frame.json new file mode 100644 index 00000000000..b89e58ce4cf --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/session-export.frame.json @@ -0,0 +1,647 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Drive", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Change", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "from", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "after.", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-580163831713/files/fixture.txt", + "fg": [54, 57, 76, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [82, 87, 101, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [82, 87, 101, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Export session", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 39 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Export as:", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "◉ Markdown", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": "○ JSON", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 27 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "[x]", "fg": [130, 170, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Include thinking", + "fg": [130, 170, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 31 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 4 }, + { "text": "Copy", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": "Export", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...f34a-2a28-4fe7-8255-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/session-fork.frame.json b/packages/lab/catalog/public/captures/tokyonight/session-fork.frame.json new file mode 100644 index 00000000000..1aa1ae4707f --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/session-fork.frame.json @@ -0,0 +1,574 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Drive", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Change", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "from", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "after.", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-580163831713/files/fixture.txt", + "fg": [54, 57, 76, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "befo", "fg": [82, 87, 101, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "afte", "fg": [82, 87, 101, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Fork session", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 65 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "fixtur", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "Full session", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 1, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [130, 170, 255, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Si", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "Change fixture.txt from before to after.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 33 + }, + { "text": "3:26 PM", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...f34a-2a28-4fe7-8255-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/session-picker-populated.frame.json b/packages/lab/catalog/public/captures/tokyonight/session-picker-populated.frame.json new file mode 100644 index 00000000000..9f47c30e76a --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/session-picker-populated.frame.json @@ -0,0 +1,620 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 23, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [54, 70, 105, 255], "bg": [14, 15, 23, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 23, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [82, 87, 101, 255], "bg": [14, 15, 23, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 23, 255], "attributes": 0, "width": 1 }, + { "text": "DriveCatalog", "fg": [82, 87, 101, 255], "bg": [14, 15, 23, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 23, 255], "attributes": 0, "width": 1 }, + { "text": "cap", "fg": [82, 87, 101, 255], "bg": [14, 15, 23, 255], "attributes": 1, "width": 3 }, + { "text": "t", "fg": [69, 72, 85, 255], "bg": [14, 15, 23, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [52, 55, 66, 255], "bg": [14, 15, 23, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [36, 38, 47, 255], "bg": [14, 15, 23, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [19, 21, 28, 255], "bg": [14, 15, 23, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [42, 44, 59, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [42, 44, 59, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-580163831713/files/fixture.txt", + "fg": [42, 44, 59, 255], + "bg": [12, 13, 19, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [82, 87, 101, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 99 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [82, 87, 101, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Si", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Sessions", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 69 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "me", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "abo", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Today", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { + "text": "OpenCode DriveCatalog capture session", + "fg": [26, 27, 38, 255], + "bg": [130, 170, 255, 255], + "attributes": 1, + "width": 37 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [130, 170, 255, 255], + "attributes": 0, + "width": 46 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "#", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Question", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "delete", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ctrl+d", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "rename", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ctrl+r", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { "text": "all projects", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "ctrl+a", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Which", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "dire", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Keep", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "it", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "minimal", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "(Recommended)", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 82 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "Keeping", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "minimal.", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "160ms", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...f34a-2a28-4fe7-8255-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/session-picker.frame.json b/packages/lab/catalog/public/captures/tokyonight/session-picker.frame.json new file mode 100644 index 00000000000..4e399edd377 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/session-picker.frame.json @@ -0,0 +1,628 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Sessions", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 69 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": "No sessions available", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 21 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 63 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "delete ctrl+d", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "rename ctrl+r", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { "text": "all projects", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "ctrl+a", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/session-rename.frame.json b/packages/lab/catalog/public/captures/tokyonight/session-rename.frame.json new file mode 100644 index 00000000000..1568636c4e3 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/session-rename.frame.json @@ -0,0 +1,602 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Drive", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Change", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "fixture.txt", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "from", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "after.", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-62cbf34a-2a28-4fe7-8255-580163831713/files/fixture.txt", + "fg": [54, 57, 76, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 101 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [82, 87, 101, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [82, 87, 101, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Rename session", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 39 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 27 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "enter ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": "submit", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...f34a-2a28-4fe7-8255-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/session-tabs-idle.frame.json b/packages/lab/catalog/public/captures/tokyonight/session-tabs-idle.frame.json new file mode 100644 index 00000000000..2e89dc9d891 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/session-tabs-idle.frame.json @@ -0,0 +1,483 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 49, 67, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [140, 176, 254, 255], "bg": [46, 49, 67, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 49, 67, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [200, 211, 245, 255], "bg": [46, 49, 67, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [200, 211, 245, 255], "bg": [44, 46, 64, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [39, 41, 59, 255], "attributes": 1, "width": 1 }, + { "text": "nCode Drive", "fg": [200, 211, 245, 255], "bg": [36, 38, 56, 255], "attributes": 1, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 38, 56, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 39, 57, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 40, 58, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 41, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 42, 60, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 43, 61, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 44, 63, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 45, 63, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 46, 64, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 65, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 48, 66, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Audit the current tab state.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "Working on a tab audit.Tab audit complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 42 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 71 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 2.1s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...5aaf-e995-4d1c-bbeb-d28362c9f873/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/session-tabs-running.frame.json b/packages/lab/catalog/public/captures/tokyonight/session-tabs-running.frame.json new file mode 100644 index 00000000000..57c9ea94a8d --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/session-tabs-running.frame.json @@ -0,0 +1,472 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 39, 58, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [37, 39, 58, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 39, 58, 255], "attributes": 0, "width": 1 }, + { "text": "New session", "fg": [200, 211, 245, 255], "bg": [37, 39, 58, 255], "attributes": 1, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [37, 39, 58, 255], + "attributes": 0, + "width": 18 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Audit the current tab state.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 83 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "Working on a tab audit.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 23 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 90 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝", "fg": [66, 57, 90, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/shell-execute-failed.frame.json b/packages/lab/catalog/public/captures/tokyonight/shell-execute-failed.frame.json new file mode 100644 index 00000000000..817f411261b --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/shell-execute-failed.frame.json @@ -0,0 +1,557 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 48, 67, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Dr", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 11 }, + { "text": "i", "fg": [200, 211, 245, 255], "bg": [46, 48, 67, 255], "attributes": 1, "width": 1 }, + { "text": "v", "fg": [200, 211, 245, 255], "bg": [47, 49, 68, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [47, 49, 69, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 50, 70, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 51, 71, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 53, 72, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [50, 54, 73, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 55, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 55, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 55, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 56, 76, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 57, 77, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 55, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 51, 71, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 48, 67, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 1.7s", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "$", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "printf catalog-shell-success", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Tool result declared output without an output schema", + "fg": [255, 117, 127, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 52 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 59 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The successful shell command completed.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 74 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 3.3s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Now run one failing foreground shell command.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 45 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 66 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⠇", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "catalog-shell-fail", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 91 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The shell lifecycle is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 32 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 81 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.6s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...2983-4a56-4ccd-b10f-a3917c28b89f/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/shell-execute-succeeded.frame.json b/packages/lab/catalog/public/captures/tokyonight/shell-execute-succeeded.frame.json new file mode 100644 index 00000000000..7401b47bc00 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/shell-execute-succeeded.frame.json @@ -0,0 +1,520 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [75, 67, 80, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [226, 162, 154, 255], "bg": [75, 67, 80, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [75, 66, 79, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [200, 211, 245, 255], "bg": [71, 63, 77, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [200, 211, 245, 255], "bg": [68, 59, 72, 255], "attributes": 1, "width": 1 }, + { "text": "enCode Drive", "fg": [200, 211, 245, 255], "bg": [67, 58, 70, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [67, 58, 70, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [68, 58, 71, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [68, 59, 72, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [68, 60, 73, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [69, 61, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [70, 62, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [71, 63, 77, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [72, 64, 77, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [73, 65, 77, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [74, 65, 78, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [74, 66, 79, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [75, 66, 79, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 1.7s", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "$", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "printf catalog-shell-success", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Tool result declared output without an output schema", + "fg": [255, 117, 127, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 52 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 59 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The successful shell command completed.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 39 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 74 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 3.3s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...2983-4a56-4ccd-b10f-a3917c28b89f/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/shell-input-streaming.frame.json b/packages/lab/catalog/public/captures/tokyonight/shell-input-streaming.frame.json new file mode 100644 index 00000000000..a02d2eddd90 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/shell-input-streaming.frame.json @@ -0,0 +1,488 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [140, 176, 254, 255], "bg": [45, 48, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 48, 67, 255], "attributes": 0, "width": 1 }, + { "text": "Ope", "fg": [200, 211, 245, 255], "bg": [45, 48, 67, 255], "attributes": 1, "width": 3 }, + { "text": "n", "fg": [200, 211, 245, 255], "bg": [42, 45, 63, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [200, 211, 245, 255], "bg": [37, 40, 58, 255], "attributes": 1, "width": 1 }, + { "text": "ode Drive", "fg": [200, 211, 245, 255], "bg": [35, 37, 55, 255], "attributes": 1, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [35, 37, 55, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "Thought", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 104 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "Writing command...", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 91 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝⬝⬝⬝⬝⬝⬝", "fg": [79, 68, 108, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/shell-output-streaming.frame.json b/packages/lab/catalog/public/captures/tokyonight/shell-output-streaming.frame.json new file mode 100644 index 00000000000..869574dbc80 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/shell-output-streaming.frame.json @@ -0,0 +1,491 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 43, 61, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [132, 171, 255, 255], "bg": [36, 38, 56, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Driv", "fg": [200, 211, 245, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 13 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [35, 37, 55, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 37, 55, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 38, 56, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [37, 39, 57, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [38, 40, 59, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 41, 60, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [40, 42, 61, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [41, 44, 62, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 45, 63, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 45, 64, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 66, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 1.7s", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⠋", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "printf catalog-shell-success", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "⬝⬝⬝⬝⬝⬝⬝⬝", "fg": [88, 74, 120, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/skill-picker.frame.json b/packages/lab/catalog/public/captures/tokyonight/skill-picker.frame.json new file mode 100644 index 00000000000..b4939d5b792 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/skill-picker.frame.json @@ -0,0 +1,619 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Skills", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 78 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 3 }, + { + "text": "OpenCode Use this skill for any question about OpenCode itself, including how Op", + "fg": [26, 27, 38, 255], + "bg": [130, 170, 255, 255], + "attributes": 1, + "width": 80 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Report ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { + "text": " Use when the user wants to report an opencode issue or bug. Collect sta", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 72 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/status.frame.json b/packages/lab/catalog/public/captures/tokyonight/status.frame.json new file mode 100644 index 00000000000..eca0531871f --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/status.frame.json @@ -0,0 +1,669 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Status", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "No MCP servers", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": "█", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 23, 30, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 23, 30, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀", "fg": [54, 57, 76, 255], "bg": [21, 23, 30, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [21, 23, 30, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [29, 30, 37, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [29, 30, 37, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [29, 30, 37, 255], "attributes": 0, "width": 2 }, + { "text": "█", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "█", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 1 }, + { "text": "▀▀▀", "fg": [82, 87, 101, 255], "bg": [29, 30, 37, 255], "attributes": 1, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": "▀▀▀▀", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "█▀▀▀", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀", "fg": [21, 23, 30, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "▀", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 1, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 39 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "anything...", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 11 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "\"Fix", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "a", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "TODO", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "in", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "codebase\"", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 38 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 74 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { + "text": "/private/var/folde...-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 40 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/subagent-completed.frame.json b/packages/lab/catalog/public/captures/tokyonight/subagent-completed.frame.json new file mode 100644 index 00000000000..bdd92a8f1ad --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/subagent-completed.frame.json @@ -0,0 +1,497 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 56, 76, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [136, 173, 254, 255], "bg": [50, 53, 72, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 49, 68, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 48, 67, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 49, 68, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [46, 50, 69, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [47, 51, 70, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [48, 52, 71, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [49, 53, 72, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [50, 53, 72, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [51, 54, 74, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [52, 55, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [53, 56, 75, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 56, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 57, 76, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [54, 57, 77, 255], "attributes": 0, "width": 2 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Use a subagent to inspect src/ledger.ts and calculate the total.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 64 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 82ms", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "✓", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Researcher Subagent — Inspect ledger lifecycle", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 65 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "Subagent completed the ledger lifecycle.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 73 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.8s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...c9ea-4f57-405e-99e8-3bba18b82b9a/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/subagent-running.frame.json b/packages/lab/catalog/public/captures/tokyonight/subagent-running.frame.json new file mode 100644 index 00000000000..0765c23d0e4 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/subagent-running.frame.json @@ -0,0 +1,481 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Use a subagent to inspect src/ledger.ts and calculate the total.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 64 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "+", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "Thought · 82ms", "fg": [163, 101, 80, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 97 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Researcher Subagent — Inspect ledger lifecycle", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 65 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [72, 62, 98, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [96, 80, 130, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [134, 109, 179, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝", "fg": [96, 80, 129, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/subagent-session.frame.json b/packages/lab/catalog/public/captures/tokyonight/subagent-session.frame.json new file mode 100644 index 00000000000..6d6272ea355 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/subagent-session.frame.json @@ -0,0 +1,506 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 65, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [132, 171, 255, 255], "bg": [44, 47, 65, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 65, 255], "attributes": 0, "width": 1 }, + { "text": "Ope", "fg": [200, 211, 245, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 3 }, + { "text": "n", "fg": [200, 211, 245, 255], "bg": [44, 47, 65, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [200, 211, 245, 255], "bg": [43, 46, 64, 255], "attributes": 1, "width": 1 }, + { "text": "ode Drive", "fg": [200, 211, 245, 255], "bg": [42, 45, 63, 255], "attributes": 1, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 45, 63, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 46, 64, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 46, 64, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [43, 46, 65, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [44, 47, 65, 255], "attributes": 0, "width": 1 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "You are a subagent spawned by another session.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 65 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Read src/ledger.ts and report its exports, values, and calculated total.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 72 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 39 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [255, 150, 108, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The child inspected src/ledger.ts and calculated total 42.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 55 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Researcher", "fg": [255, 150, 108, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { + "text": " · Simulated Model · 1.5s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 78 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Subagents", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Shell", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 90 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " No active subagents", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 92 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "show inactive", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 13 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "ctrl+a", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "tabs", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 4 }, + { "text": " ", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "←/→", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 81 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [115, 122, 162, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/theme-picker.frame.json b/packages/lab/catalog/public/captures/tokyonight/theme-picker.frame.json new file mode 100644 index 00000000000..573811af335 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/theme-picker.frame.json @@ -0,0 +1,715 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "New", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "session", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 18 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 86 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Themes", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 43 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "Search", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "opencode", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 48 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "orng", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 52 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "osaka-jade", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 46 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "palenight", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "rosepine", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 48 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "solarized", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 47 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "synthwave84", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 45 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Buil", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "●", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [130, 170, 255, 255], "attributes": 0, "width": 1 }, + { "text": "tokyonight", "fg": [26, 27, 38, 255], "bg": [130, 170, 255, 255], "attributes": 1, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [130, 170, 255, 255], + "attributes": 0, + "width": 45 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "▀▀▀▀▀▀", "fg": [14, 15, 22, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "vercel", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { "text": "▀▀▀▀▀▀▀▀", "fg": [14, 15, 22, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 22 + }, + { "text": "/privat", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "vesper", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 50 + }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 21 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": "zenburn", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 49 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 29 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 111 + }, + { "text": "local", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "○", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/thinking-streaming.frame.json b/packages/lab/catalog/public/captures/tokyonight/thinking-streaming.frame.json new file mode 100644 index 00000000000..0b85615a404 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/thinking-streaming.frame.json @@ -0,0 +1,469 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Run one successful foreground shell command.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 44 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 67 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "⠙", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "Thinking", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 103 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [134, 109, 179, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝", "fg": [76, 65, 104, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/toast-error.frame.json b/packages/lab/catalog/public/captures/tokyonight/toast-error.frame.json new file mode 100644 index 00000000000..87063a53a06 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/toast-error.frame.json @@ -0,0 +1,593 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "OpenCode DriveCatalog cap", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 1, + "width": 25 + }, + { "text": "t", "fg": [167, 176, 207, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [127, 134, 161, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [87, 92, 115, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [47, 50, 69, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [101, 108, 143, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [101, 108, 143, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-62", + "fg": [101, 108, 143, 255], + "bg": [29, 31, 45, 255], + "attributes": 0, + "width": 49 + }, + { "text": "┃", "fg": [255, 117, 127, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 50 + }, + { "text": "┃", "fg": [255, 117, 127, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 61 + }, + { "text": "┃", "fg": [255, 117, 127, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { + "text": "Sharing is not implemented for V2 sessions yet", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 46 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [255, 117, 127, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 47 + }, + { "text": "┃", "fg": [255, 117, 127, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 50 + }, + { "text": "┃", "fg": [255, 117, 127, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [200, 211, 245, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.7s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me about the fixture direction.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "# Questions", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Which direction should the fixture take?", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Keep it minimal (Recommended)", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 82 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "Keeping the fixture minimal.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 160ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...f34a-2a28-4fe7-8255-580163831713/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/toast-info.frame.json b/packages/lab/catalog/public/captures/tokyonight/toast-info.frame.json new file mode 100644 index 00000000000..42f40b97f30 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/toast-info.frame.json @@ -0,0 +1,686 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "DriveCatalog", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "cap", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 3 }, + { "text": "t", "fg": [69, 72, 85, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [52, 55, 66, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [36, 38, 47, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [19, 21, 28, 255], "bg": [14, 15, 22, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 84 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [42, 44, 59, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [42, 44, 59, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 19, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-62cbf34a-2a28-4fe7", + "fg": [42, 44, 59, 255], + "bg": [12, 13, 19, 255], + "attributes": 0, + "width": 65 + }, + { "text": "┃", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 77 + }, + { "text": "┃", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Debug", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "info", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "copied", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "to", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "clipboard", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "-", "fg": [93, 44, 48, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [19, 13, 16, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [82, 87, 101, 255], "bg": [23, 14, 18, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [23, 14, 18, 255], + "attributes": 0, + "width": 63 + }, + { "text": "┃", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 34 + }, + { "text": "┃", "fg": [54, 70, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [59, 59, 63, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "+", "fg": [76, 90, 56, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 18, 21, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [82, 87, 101, 255], "bg": [13, 20, 24, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [13, 20, 24, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "The", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "was", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "updated.", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Si", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Debug", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + }, + { "text": "esc", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Ask", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "me", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "abo", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Version ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "local (local)", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Date ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "2026-08-12T19:26:41.269Z", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "OS ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "macOS 25.5.0 (arm64)", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 20 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 55 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 15 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Terminal ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "ghostty 1.3.1", "fg": [200, 211, 245, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 13 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 62 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "#", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Question", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Session ID", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "ses_0088f22f2ffeo7Bdik3tyBSRP6", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 30 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 45 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Model ", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 10 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": "simulation/gpt-sim-model", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 51 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Which", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "dire", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 4 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Keep", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "it", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "mi", "fg": [82, 87, 101, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Share this when reporting an issue.", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { "text": "✓ copied", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 1, "width": 8 }, + { "text": " ", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "enter", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [11, 11, 16, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 12 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 88 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 13 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "Keeping", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "the", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "fixture", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "minimal.", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "160ms", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [79, 63, 105, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulated", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Model", "fg": [82, 87, 101, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [54, 57, 76, 255], "bg": [14, 15, 22, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [14, 15, 22, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [79, 63, 105, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [14, 15, 22, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...f34a-2a28-4fe7-8255-580163831713/files", + "fg": [54, 57, 76, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 9 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "agents", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p", "fg": [82, 87, 101, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 1 }, + { "text": "commands", "fg": [54, 57, 76, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [11, 11, 16, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [11, 11, 16, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [80, 96, 58, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "Server", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "⦿", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 1 }, + { "text": "UI", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [54, 57, 76, 255], "bg": [12, 13, 20, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [12, 13, 20, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/toast-success.frame.json b/packages/lab/catalog/public/captures/tokyonight/toast-success.frame.json new file mode 100644 index 00000000000..667c814ab91 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/toast-success.frame.json @@ -0,0 +1,593 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "OpenCode DriveCatalog cap", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 1, + "width": 25 + }, + { "text": "t", "fg": [167, 176, 207, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": "u", "fg": [127, 134, 161, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": "r", "fg": [87, 92, 115, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [47, 50, 69, 255], "bg": [34, 36, 54, 255], "attributes": 1, "width": 1 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 2 }, + { "text": "←", "fg": [101, 108, 143, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { "text": "Patched", "fg": [101, 108, 143, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [29, 31, 45, 255], "attributes": 0, "width": 1 }, + { + "text": "…/5fz89drs5p9_r0fk7rwqqn…/T/opencode-drive/run-62cbf34a-", + "fg": [101, 108, 143, 255], + "bg": [29, 31, 45, 255], + "attributes": 0, + "width": 56 + }, + { "text": "┃", "fg": [195, 232, 141, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 43 + }, + { "text": "┃", "fg": [195, 232, 141, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 68 + }, + { "text": "┃", "fg": [195, 232, 141, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { + "text": "Session transcript copied to clipboard!", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 39 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [195, 232, 141, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": " -", "fg": [226, 106, 117, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 31, 38, 255], "attributes": 0, "width": 1 }, + { "text": "before", "fg": [200, 211, 245, 255], "bg": [55, 34, 44, 255], "attributes": 0, "width": 6 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [55, 34, 44, 255], + "attributes": 0, + "width": 54 + }, + { "text": "┃", "fg": [195, 232, 141, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 43 + }, + { "text": "┃", "fg": [195, 232, 141, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 3 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [143, 144, 154, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": " +", "fg": [184, 219, 135, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [27, 43, 52, 255], "attributes": 0, "width": 1 }, + { "text": "after", "fg": [200, 211, 245, 255], "bg": [32, 48, 59, 255], "attributes": 0, "width": 5 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [32, 48, 59, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The fixture was updated.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 89 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 1.7s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Ask me about the fixture direction.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 35 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "# Questions", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 100 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Which direction should the fixture take?", + "fg": [130, 139, 184, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 40 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 71 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Keep it minimal (Recommended)", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 29 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 82 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [26, 27, 38, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "Keeping the fixture minimal.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 85 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 160ms", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 82 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...f34a-2a28-4fe7-8255-580163831713/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/webfetch-streaming.frame.json b/packages/lab/catalog/public/captures/tokyonight/webfetch-streaming.frame.json new file mode 100644 index 00000000000..a416dd96657 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/webfetch-streaming.frame.json @@ -0,0 +1,474 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 45, 63, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [42, 45, 63, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [42, 45, 63, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [42, 45, 63, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [42, 45, 63, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Fetching from the web...", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 24 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝", "fg": [66, 57, 90, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/webfetch-success.frame.json b/packages/lab/catalog/public/captures/tokyonight/webfetch-success.frame.json new file mode 100644 index 00000000000..a3d16f25a10 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/webfetch-success.frame.json @@ -0,0 +1,486 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [130, 170, 255, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [45, 47, 66, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [45, 47, 66, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [45, 47, 66, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "%", "fg": [255, 117, 127, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "WebFetch https://example.com", + "fg": [255, 117, 127, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The web fetch is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 7.2s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { + "text": "/private/var/folders/dd/5fz89drs5p9_r0...4b48-a447-484a-aeaf-1776abbaaa0e/files", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 79 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/websearch-failure.frame.json b/packages/lab/catalog/public/captures/tokyonight/websearch-failure.frame.json new file mode 100644 index 00000000000..d5bd9061395 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/websearch-failure.frame.json @@ -0,0 +1,527 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [35, 37, 55, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [131, 171, 255, 255], "bg": [35, 37, 56, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 38, 56, 255], "attributes": 0, "width": 1 }, + { "text": "O", "fg": [200, 211, 245, 255], "bg": [37, 39, 57, 255], "attributes": 1, "width": 1 }, + { "text": "p", "fg": [200, 211, 245, 255], "bg": [38, 40, 59, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [39, 41, 60, 255], "attributes": 1, "width": 1 }, + { "text": "n", "fg": [200, 211, 245, 255], "bg": [40, 43, 61, 255], "attributes": 1, "width": 1 }, + { "text": "C", "fg": [200, 211, 245, 255], "bg": [41, 44, 62, 255], "attributes": 1, "width": 1 }, + { "text": "o", "fg": [200, 211, 245, 255], "bg": [42, 45, 63, 255], "attributes": 1, "width": 1 }, + { "text": "d", "fg": [200, 211, 245, 255], "bg": [43, 45, 64, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [44, 46, 65, 255], "attributes": 1, "width": 1 }, + { "text": " Dri", "fg": [200, 211, 245, 255], "bg": [44, 47, 66, 255], "attributes": 1, "width": 4 }, + { "text": "v", "fg": [200, 211, 245, 255], "bg": [44, 46, 65, 255], "attributes": 1, "width": 1 }, + { "text": "e", "fg": [200, 211, 245, 255], "bg": [40, 42, 61, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [36, 38, 56, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 14 }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "%", "fg": [255, 117, 127, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "WebFetch https://example.com", + "fg": [255, 117, 127, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The web fetch is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 7.2s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the web for the OpenCode terminal interface.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 51 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "⠹", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Searching web...", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [202, 161, 234, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [134, 109, 179, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [96, 80, 130, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [72, 62, 98, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "■", "fg": [56, 50, 77, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝", "fg": [126, 103, 168, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "⦿ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/captures/tokyonight/websearch-running.frame.json b/packages/lab/catalog/public/captures/tokyonight/websearch-running.frame.json new file mode 100644 index 00000000000..75ffde00649 --- /dev/null +++ b/packages/lab/catalog/public/captures/tokyonight/websearch-running.frame.json @@ -0,0 +1,517 @@ +{ + "format": "opencode-terminal-frame-v1", + "cols": 118, + "rows": 34, + "cursor": [0, 0], + "lines": [ + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 41, 60, 255], "attributes": 0, "width": 1 }, + { "text": "1", "fg": [194, 160, 179, 255], "bg": [39, 41, 60, 255], "attributes": 1, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [39, 41, 60, 255], "attributes": 0, "width": 1 }, + { "text": "OpenCode Drive", "fg": [200, 211, 245, 255], "bg": [39, 41, 60, 255], "attributes": 1, "width": 14 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [39, 41, 60, 255], + "attributes": 0, + "width": 15 + }, + { "text": " + ", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Fetch the Example Domain.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 86 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "%", "fg": [255, 117, 127, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "WebFetch https://example.com", + "fg": [255, 117, 127, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 28 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": "The web fetch is complete.", + "fg": [200, 211, 245, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 26 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 87 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { + "text": " · Simulated Model · 7.2s", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 25 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 83 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { + "text": "Search the web for the OpenCode terminal interface.", + "fg": [200, 211, 245, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 51 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 60 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 5 }, + { "text": "⠋", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "Searching web...", + "fg": [130, 139, 184, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 16 + }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 95 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "┃", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 2 }, + { "text": "Build", "fg": [192, 153, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "·", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { + "text": "Simulated Model", + "fg": [200, 211, 245, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 15 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 1 }, + { "text": "Simulation", "fg": [130, 139, 184, 255], "bg": [34, 36, 54, 255], "attributes": 0, "width": 10 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [34, 36, 54, 255], + "attributes": 0, + "width": 77 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "╹", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { + "text": "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", + "fg": [34, 36, 54, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 113 + }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 3 }, + { "text": "■", "fg": [192, 153, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "⬝⬝⬝⬝⬝⬝⬝", "fg": [56, 50, 77, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 1 }, + { "text": "esc ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 4 }, + { "text": "interrupt", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 9 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 58 + }, + { "text": "shift+tab ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 10 }, + { "text": "agents", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 6 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 }, + { "text": "ctrl+p ", "fg": [200, 211, 245, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 7 }, + { "text": "commands", "fg": [130, 139, 184, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 8 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [26, 27, 38, 255], "attributes": 0, "width": 2 } + ] + }, + { + "spans": [ + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [26, 27, 38, 255], + "attributes": 0, + "width": 118 + } + ] + }, + { + "spans": [ + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": "✓", "fg": [195, 232, 141, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 1 }, + { "text": " Server", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 7 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "○ UI", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 4 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Theme", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Tools", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 5 }, + { "text": " ", "fg": [255, 255, 255, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 2 }, + { "text": "Experiments", "fg": [130, 139, 184, 255], "bg": [30, 32, 48, 255], "attributes": 0, "width": 11 }, + { + "text": " ", + "fg": [255, 255, 255, 255], + "bg": [30, 32, 48, 255], + "attributes": 0, + "width": 76 + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/catalog.json b/packages/lab/catalog/public/catalog.json new file mode 100644 index 00000000000..fa04d9fcc4d --- /dev/null +++ b/packages/lab/catalog/public/catalog.json @@ -0,0 +1,4075 @@ +{ + "format": "opencode-terminal-catalog-v3", + "generatedBy": "scripts/capture-opencode-drive.ts", + "variants": [ + { + "id": "opencode", + "label": "Opencode", + "source": "opencode", + "revision": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "ref": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "committedAt": "2026-08-12T12:45:43-04:00", + "theme": "opencode" + }, + { + "id": "tokyonight", + "label": "Tokyo Night", + "source": "opencode", + "revision": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "ref": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "committedAt": "2026-08-12T12:45:43-04:00", + "theme": "tokyonight" + }, + { + "id": "everforest", + "label": "Everforest", + "source": "opencode", + "revision": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "ref": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "committedAt": "2026-08-12T12:45:43-04:00", + "theme": "everforest" + } + ], + "screenTaxonomy": [ + { + "id": "getting-started", + "label": "Getting started", + "items": [ + { + "id": "start-screen", + "label": "Start screen" + }, + { + "id": "new-session", + "label": "New session" + } + ] + }, + { + "id": "conversation", + "label": "Conversation", + "items": [ + { + "id": "composer", + "label": "Composer" + }, + { + "id": "question-response", + "label": "Question response" + }, + { + "id": "tool-execution", + "label": "Tool execution" + }, + { + "id": "diff-review", + "label": "Diff review" + }, + { + "id": "subagent-activity", + "label": "Subagent activity" + }, + { + "id": "shell-activity", + "label": "Shell activity" + } + ] + }, + { + "id": "session-management", + "label": "Session management", + "items": [ + { + "id": "session-list", + "label": "Session list" + }, + { + "id": "rename-session", + "label": "Rename session" + }, + { + "id": "fork-session", + "label": "Fork session" + }, + { + "id": "export-session", + "label": "Export session" + } + ] + }, + { + "id": "notifications", + "label": "Notifications", + "items": [ + { + "id": "toast-info", + "label": "Info toast" + }, + { + "id": "toast-success", + "label": "Success toast" + }, + { + "id": "toast-error", + "label": "Error toast" + } + ] + }, + { + "id": "models-and-agents", + "label": "Models & agents", + "items": [ + { + "id": "model-selection", + "label": "Model selection" + }, + { + "id": "agent-selection", + "label": "Agent selection" + }, + { + "id": "skill-selection", + "label": "Skill selection" + } + ] + }, + { + "id": "configuration", + "label": "Configuration", + "items": [ + { + "id": "integration-setup", + "label": "Integration setup" + }, + { + "id": "mcp-management", + "label": "MCP management" + }, + { + "id": "theme-selection", + "label": "Theme selection" + }, + { + "id": "device-pairing", + "label": "Device pairing" + } + ] + }, + { + "id": "system", + "label": "System", + "items": [ + { + "id": "command-navigation", + "label": "Command navigation" + }, + { + "id": "system-status", + "label": "System status" + }, + { + "id": "help-reference", + "label": "Help & reference" + }, + { + "id": "debugging", + "label": "Debugging" + }, + { + "id": "error-recovery", + "label": "Error recovery" + } + ] + } + ], + "uiElementTaxonomy": [ + { + "id": "navigation", + "label": "Navigation", + "items": [ + { + "id": "command-palette", + "label": "Command palette" + }, + { + "id": "tabs", + "label": "Tabs" + }, + { + "id": "keyboard-hints", + "label": "Keyboard hints" + }, + { + "id": "shortcut-list", + "label": "Shortcut list" + } + ] + }, + { + "id": "selection", + "label": "Selection", + "items": [ + { + "id": "picker", + "label": "Picker" + }, + { + "id": "search-field", + "label": "Search field" + }, + { + "id": "single-select", + "label": "Single select" + }, + { + "id": "list", + "label": "List" + } + ] + }, + { + "id": "input", + "label": "Input", + "items": [ + { + "id": "text-input", + "label": "Text input" + }, + { + "id": "form", + "label": "Form" + }, + { + "id": "composer", + "label": "Composer" + }, + { + "id": "question-prompt", + "label": "Question prompt" + } + ] + }, + { + "id": "actions", + "label": "Actions", + "items": [ + { + "id": "button-group", + "label": "Button group" + }, + { + "id": "approval-actions", + "label": "Approval actions" + }, + { + "id": "destructive-action", + "label": "Destructive action" + } + ] + }, + { + "id": "feedback", + "label": "Feedback", + "items": [ + { + "id": "empty-state", + "label": "Empty state" + }, + { + "id": "status-indicator", + "label": "Status indicator" + }, + { + "id": "toast", + "label": "Toast" + }, + { + "id": "confirmation", + "label": "Confirmation" + }, + { + "id": "error-report", + "label": "Error report" + } + ] + }, + { + "id": "content", + "label": "Content", + "items": [ + { + "id": "terminal-output", + "label": "Terminal output" + }, + { + "id": "transcript", + "label": "Transcript" + }, + { + "id": "tool-card", + "label": "Tool card" + }, + { + "id": "qr-code", + "label": "QR code" + }, + { + "id": "debug-information", + "label": "Debug information" + } + ] + }, + { + "id": "containers", + "label": "Containers", + "items": [ + { + "id": "dialog", + "label": "Dialog" + }, + { + "id": "inline-prompt", + "label": "Inline prompt" + }, + { + "id": "panel", + "label": "Panel" + }, + { + "id": "full-screen-view", + "label": "Full-screen view" + } + ] + } + ], + "surfaces": ["full-screen", "inline", "modal", "panel", "toast"], + "patterns": [ + "approval", + "error-report", + "form", + "info", + "landing", + "list", + "navigation", + "notification", + "pairing", + "palette", + "picker", + "status", + "terminal" + ], + "features": [ + "agent", + "assistant", + "commands", + "debug", + "device", + "diff", + "export", + "help", + "integration", + "mcp", + "model", + "navigation", + "notification", + "patch", + "permission", + "question", + "read", + "response", + "search", + "session", + "shell", + "shortcuts", + "skill", + "subagent", + "system", + "tabs", + "theme", + "thinking", + "tool", + "web" + ], + "states": [ + "confirmation", + "default", + "empty", + "error", + "expanded", + "idle", + "pending", + "populated", + "running", + "selected", + "streaming", + "success" + ], + "screens": [ + { + "id": "home", + "title": "Home", + "category": "system", + "summary": "", + "tags": [ + "start-screen", + "new-session", + "composer", + "composer", + "keyboard-hints", + "full-screen-view", + "empty-state", + "full-screen", + "landing", + "system", + "session", + "empty" + ], + "screenLabels": ["start-screen", "new-session", "composer"], + "uiElements": ["composer", "keyboard-hints", "full-screen-view", "empty-state"], + "surfaces": ["full-screen"], + "patterns": ["landing"], + "features": ["system", "session"], + "states": ["empty"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/home.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/home.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/home.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "command-palette", + "title": "Command palette", + "category": "navigation", + "summary": "", + "tags": [ + "command-navigation", + "command-palette", + "search-field", + "list", + "keyboard-hints", + "dialog", + "modal", + "palette", + "commands", + "navigation", + "default" + ], + "screenLabels": ["command-navigation"], + "uiElements": ["command-palette", "search-field", "list", "keyboard-hints", "dialog"], + "surfaces": ["modal"], + "patterns": ["palette"], + "features": ["commands", "navigation"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/command-palette.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/command-palette.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/command-palette.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "model-picker", + "title": "Model picker", + "category": "picker", + "summary": "", + "tags": [ + "model-selection", + "picker", + "search-field", + "single-select", + "list", + "dialog", + "keyboard-hints", + "modal", + "picker", + "model", + "default" + ], + "screenLabels": ["model-selection"], + "uiElements": ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints"], + "surfaces": ["modal"], + "patterns": ["picker"], + "features": ["model"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/model-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/model-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/model-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "agent-picker", + "title": "Agent picker", + "category": "picker", + "summary": "", + "tags": [ + "agent-selection", + "picker", + "search-field", + "single-select", + "list", + "dialog", + "keyboard-hints", + "modal", + "picker", + "agent", + "default" + ], + "screenLabels": ["agent-selection"], + "uiElements": ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints"], + "surfaces": ["modal"], + "patterns": ["picker"], + "features": ["agent"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/agent-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/agent-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/agent-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "integration-picker", + "title": "Integrations", + "category": "picker", + "summary": "", + "tags": [ + "integration-setup", + "picker", + "single-select", + "list", + "dialog", + "modal", + "picker", + "integration", + "default" + ], + "screenLabels": ["integration-setup"], + "uiElements": ["picker", "single-select", "list", "dialog"], + "surfaces": ["modal"], + "patterns": ["picker"], + "features": ["integration"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/integration-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/integration-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/integration-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "theme-picker", + "title": "Theme picker", + "category": "picker", + "summary": "", + "tags": ["theme-selection", "picker", "single-select", "list", "dialog", "modal", "picker", "theme", "default"], + "screenLabels": ["theme-selection"], + "uiElements": ["picker", "single-select", "list", "dialog"], + "surfaces": ["modal"], + "patterns": ["picker"], + "features": ["theme"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/theme-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/theme-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/theme-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "mcp-list", + "title": "MCPs", + "category": "status", + "summary": "", + "tags": ["mcp-management", "list", "dialog", "empty-state", "modal", "list", "mcp", "empty"], + "screenLabels": ["mcp-management"], + "uiElements": ["list", "dialog", "empty-state"], + "surfaces": ["modal"], + "patterns": ["list"], + "features": ["mcp"], + "states": ["empty"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/mcp-list.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/mcp-list.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/mcp-list.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "status", + "title": "Status", + "category": "status", + "summary": "", + "tags": [ + "system-status", + "mcp-management", + "status-indicator", + "list", + "dialog", + "empty-state", + "modal", + "status", + "system", + "mcp", + "empty" + ], + "screenLabels": ["system-status", "mcp-management"], + "uiElements": ["status-indicator", "list", "dialog", "empty-state"], + "surfaces": ["modal"], + "patterns": ["status"], + "features": ["system", "mcp"], + "states": ["empty"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/status.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/status.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/status.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "debug", + "title": "Debug", + "category": "information", + "summary": "", + "tags": [ + "debugging", + "system-status", + "debug-information", + "dialog", + "modal", + "info", + "debug", + "system", + "default" + ], + "screenLabels": ["debugging", "system-status"], + "uiElements": ["debug-information", "dialog"], + "surfaces": ["modal"], + "patterns": ["info"], + "features": ["debug", "system"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/debug.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/debug.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/debug.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "help", + "title": "Help", + "category": "information", + "summary": "", + "tags": [ + "help-reference", + "command-navigation", + "shortcut-list", + "keyboard-hints", + "dialog", + "list", + "modal", + "info", + "help", + "shortcuts", + "default" + ], + "screenLabels": ["help-reference", "command-navigation"], + "uiElements": ["shortcut-list", "keyboard-hints", "dialog", "list"], + "surfaces": ["modal"], + "patterns": ["info"], + "features": ["help", "shortcuts"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/help.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/help.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/help.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "pair", + "title": "Pair device", + "category": "information", + "summary": "", + "tags": ["device-pairing", "integration-setup", "qr-code", "dialog", "modal", "pairing", "device", "default"], + "screenLabels": ["device-pairing", "integration-setup"], + "uiElements": ["qr-code", "dialog"], + "surfaces": ["modal"], + "patterns": ["pairing"], + "features": ["device"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/pair.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/pair.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/pair.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-picker", + "title": "Session picker", + "category": "session", + "summary": "", + "tags": [ + "session-list", + "picker", + "search-field", + "single-select", + "list", + "dialog", + "keyboard-hints", + "empty-state", + "modal", + "picker", + "session", + "empty" + ], + "screenLabels": ["session-list"], + "uiElements": ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints", "empty-state"], + "surfaces": ["modal"], + "patterns": ["picker"], + "features": ["session"], + "states": ["empty"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "skill-picker", + "title": "Skill picker", + "category": "session", + "summary": "", + "tags": [ + "skill-selection", + "picker", + "search-field", + "single-select", + "list", + "dialog", + "keyboard-hints", + "modal", + "picker", + "skill", + "default" + ], + "screenLabels": ["skill-selection"], + "uiElements": ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints"], + "surfaces": ["modal"], + "patterns": ["picker"], + "features": ["skill"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/skill-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/skill-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/skill-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-input-streaming", + "title": "Patch input streaming", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "patch", + "streaming" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "patch"], + "states": ["streaming"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-input-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-prompt", + "title": "Permission prompt", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "confirmation", + "destructive-action", + "inline", + "approval", + "permission", + "tool", + "patch", + "confirmation" + ], + "screenLabels": ["tool-execution"], + "uiElements": [ + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "confirmation", + "destructive-action" + ], + "surfaces": ["inline"], + "patterns": ["approval"], + "features": ["permission", "tool", "patch"], + "states": ["confirmation"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-prompt.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-prompt.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-prompt.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-always-selected", + "title": "Permission prompt (always selected)", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "confirmation", + "inline", + "approval", + "permission", + "tool", + "patch", + "selected" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["inline-prompt", "approval-actions", "button-group", "keyboard-hints", "confirmation"], + "surfaces": ["inline"], + "patterns": ["approval"], + "features": ["permission", "tool", "patch"], + "states": ["selected"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-always-selected.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-always-selected.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-always-selected.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-always-confirmation", + "title": "Always allow confirmation", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "confirmation", + "inline", + "approval", + "permission", + "tool", + "patch", + "confirmation" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["inline-prompt", "approval-actions", "button-group", "keyboard-hints", "confirmation"], + "surfaces": ["inline"], + "patterns": ["approval"], + "features": ["permission", "tool", "patch"], + "states": ["confirmation"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-always-confirmation.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-always-confirmation.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-always-confirmation.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-reject-selected", + "title": "Permission prompt (reject selected)", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "destructive-action", + "inline", + "approval", + "permission", + "tool", + "patch", + "selected" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["inline-prompt", "approval-actions", "button-group", "keyboard-hints", "destructive-action"], + "surfaces": ["inline"], + "patterns": ["approval"], + "features": ["permission", "tool", "patch"], + "states": ["selected"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-reject-selected.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-reject-selected.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-reject-selected.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-fullscreen", + "title": "Permission prompt (fullscreen)", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "confirmation", + "full-screen-view", + "full-screen", + "approval", + "permission", + "tool", + "patch", + "expanded" + ], + "screenLabels": ["tool-execution"], + "uiElements": [ + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "confirmation", + "full-screen-view" + ], + "surfaces": ["full-screen"], + "patterns": ["approval"], + "features": ["permission", "tool", "patch"], + "states": ["expanded"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-fullscreen.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-fullscreen.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-fullscreen.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-success", + "title": "Patch succeeded", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "confirmation", + "inline", + "status", + "tool", + "patch", + "success" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "confirmation"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "patch"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-rename", + "title": "Rename session", + "category": "session", + "summary": "", + "tags": ["rename-session", "dialog", "form", "text-input", "modal", "form", "session", "default"], + "screenLabels": ["rename-session"], + "uiElements": ["dialog", "form", "text-input"], + "surfaces": ["modal"], + "patterns": ["form"], + "features": ["session"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-rename.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-rename.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-rename.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-fork", + "title": "Fork session", + "category": "session", + "summary": "", + "tags": ["fork-session", "dialog", "picker", "single-select", "list", "modal", "picker", "session", "default"], + "screenLabels": ["fork-session"], + "uiElements": ["dialog", "picker", "single-select", "list"], + "surfaces": ["modal"], + "patterns": ["picker"], + "features": ["session"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-fork.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-fork.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-fork.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-export", + "title": "Export session", + "category": "session", + "summary": "", + "tags": [ + "export-session", + "dialog", + "form", + "single-select", + "button-group", + "modal", + "form", + "session", + "export", + "default" + ], + "screenLabels": ["export-session"], + "uiElements": ["dialog", "form", "single-select", "button-group"], + "surfaces": ["modal"], + "patterns": ["form"], + "features": ["session", "export"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-export.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-export.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-export.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-prompt", + "title": "Question prompt", + "category": "session", + "summary": "", + "tags": [ + "question-response", + "tool-execution", + "inline-prompt", + "question-prompt", + "form", + "single-select", + "button-group", + "confirmation", + "inline", + "form", + "question", + "tool", + "confirmation" + ], + "screenLabels": ["question-response", "tool-execution"], + "uiElements": ["inline-prompt", "question-prompt", "form", "single-select", "button-group", "confirmation"], + "surfaces": ["inline"], + "patterns": ["form"], + "features": ["question", "tool"], + "states": ["confirmation"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-prompt.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-prompt.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-prompt.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-picker-populated", + "title": "Session picker (populated)", + "category": "session", + "summary": "", + "tags": [ + "session-list", + "picker", + "search-field", + "single-select", + "list", + "dialog", + "keyboard-hints", + "modal", + "picker", + "session", + "populated" + ], + "screenLabels": ["session-list"], + "uiElements": ["picker", "search-field", "single-select", "list", "dialog", "keyboard-hints"], + "surfaces": ["modal"], + "patterns": ["picker"], + "features": ["session"], + "states": ["populated"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-picker-populated.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-picker-populated.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-picker-populated.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "toast-success", + "title": "Success toast", + "category": "system", + "summary": "", + "tags": [ + "export-session", + "toast-success", + "toast", + "confirmation", + "transcript", + "toast", + "notification", + "session", + "export", + "notification", + "success" + ], + "screenLabels": ["export-session", "toast-success"], + "uiElements": ["toast", "confirmation", "transcript"], + "surfaces": ["toast"], + "patterns": ["notification"], + "features": ["session", "export", "notification"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/toast-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/toast-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/toast-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "toast-error", + "title": "Error toast", + "category": "system", + "summary": "", + "tags": [ + "error-recovery", + "toast-error", + "toast", + "error-report", + "toast", + "notification", + "notification", + "error" + ], + "screenLabels": ["error-recovery", "toast-error"], + "uiElements": ["toast", "error-report"], + "surfaces": ["toast"], + "patterns": ["notification"], + "features": ["notification"], + "states": ["error"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/toast-error.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/toast-error.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/toast-error.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "toast-info", + "title": "Info toast", + "category": "system", + "summary": "", + "tags": [ + "debugging", + "toast-info", + "toast", + "confirmation", + "toast", + "notification", + "debug", + "notification", + "default" + ], + "screenLabels": ["debugging", "toast-info"], + "uiElements": ["toast", "confirmation"], + "surfaces": ["toast"], + "patterns": ["notification"], + "features": ["debug", "notification"], + "states": ["default"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/toast-info.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/toast-info.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/toast-info.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "diff-viewer", + "title": "Diff viewer", + "category": "session", + "summary": "", + "tags": [ + "diff-review", + "full-screen-view", + "list", + "keyboard-hints", + "empty-state", + "full-screen", + "list", + "diff", + "session", + "empty" + ], + "screenLabels": ["diff-review"], + "uiElements": ["full-screen-view", "list", "keyboard-hints", "empty-state"], + "surfaces": ["full-screen"], + "patterns": ["list"], + "features": ["diff", "session"], + "states": ["empty"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/diff-viewer.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/diff-viewer.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/diff-viewer.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "thinking-streaming", + "title": "Thinking streaming", + "category": "session", + "summary": "", + "tags": [ + "shell-activity", + "transcript", + "status-indicator", + "inline", + "status", + "thinking", + "shell", + "streaming" + ], + "screenLabels": ["shell-activity"], + "uiElements": ["transcript", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["thinking", "shell"], + "states": ["streaming"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/thinking-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/thinking-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/thinking-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "shell-input-streaming", + "title": "Shell input streaming", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "shell-activity", + "transcript", + "tool-card", + "terminal-output", + "status-indicator", + "inline", + "terminal", + "tool", + "shell", + "streaming" + ], + "screenLabels": ["tool-execution", "shell-activity"], + "uiElements": ["transcript", "tool-card", "terminal-output", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["terminal"], + "features": ["tool", "shell"], + "states": ["streaming"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/shell-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/shell-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/shell-input-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "shell-output-streaming", + "title": "Shell output streaming", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "shell-activity", + "transcript", + "tool-card", + "terminal-output", + "status-indicator", + "inline", + "terminal", + "tool", + "shell", + "running", + "streaming" + ], + "screenLabels": ["tool-execution", "shell-activity"], + "uiElements": ["transcript", "tool-card", "terminal-output", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["terminal"], + "features": ["tool", "shell"], + "states": ["running", "streaming"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/shell-output-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/shell-output-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/shell-output-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "shell-execute-succeeded", + "title": "Shell execution succeeded", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "shell-activity", + "transcript", + "tool-card", + "terminal-output", + "confirmation", + "inline", + "terminal", + "tool", + "shell", + "success" + ], + "screenLabels": ["tool-execution", "shell-activity"], + "uiElements": ["transcript", "tool-card", "terminal-output", "confirmation"], + "surfaces": ["inline"], + "patterns": ["terminal"], + "features": ["tool", "shell"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/shell-execute-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/shell-execute-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/shell-execute-succeeded.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "shell-execute-failed", + "title": "Shell execution failed", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "shell-activity", + "error-recovery", + "transcript", + "tool-card", + "terminal-output", + "error-report", + "inline", + "terminal", + "error-report", + "tool", + "shell", + "error" + ], + "screenLabels": ["tool-execution", "shell-activity", "error-recovery"], + "uiElements": ["transcript", "tool-card", "terminal-output", "error-report"], + "surfaces": ["inline"], + "patterns": ["terminal", "error-report"], + "features": ["tool", "shell"], + "states": ["error"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/shell-execute-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/shell-execute-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/shell-execute-failed.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "glob-success", + "title": "Glob finds files", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "search", + "success" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "search"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/glob-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/glob-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/glob-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "glob-empty", + "title": "Glob finds no files", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "empty-state", + "inline", + "status", + "tool", + "search", + "empty" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "empty-state"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "search"], + "states": ["empty"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/glob-empty.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/glob-empty.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/glob-empty.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "grouped-exploration", + "title": "Grouped project exploration", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "search", + "running" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "search"], + "states": ["running"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/grouped-exploration.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/grouped-exploration.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/grouped-exploration.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "grep-success", + "title": "Grep finds matches", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "search", + "success" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "search"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/grep-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/grep-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/grep-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "grep-empty", + "title": "Grep finds no matches", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "empty-state", + "inline", + "status", + "tool", + "search", + "empty" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "empty-state"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "search"], + "states": ["empty"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/grep-empty.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/grep-empty.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/grep-empty.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "grep-failure", + "title": "Grep pattern fails", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "error-recovery", + "transcript", + "tool-card", + "error-report", + "inline", + "error-report", + "tool", + "search", + "error" + ], + "screenLabels": ["tool-execution", "error-recovery"], + "uiElements": ["transcript", "tool-card", "error-report"], + "surfaces": ["inline"], + "patterns": ["error-report"], + "features": ["tool", "search"], + "states": ["error"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/grep-failure.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/grep-failure.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/grep-failure.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "webfetch-streaming", + "title": "WebFetch streaming", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "web", + "streaming" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "web"], + "states": ["streaming"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/webfetch-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/webfetch-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/webfetch-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "webfetch-success", + "title": "WebFetch succeeds", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "confirmation", + "inline", + "status", + "tool", + "web", + "success" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "confirmation"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "web"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/webfetch-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/webfetch-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/webfetch-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "websearch-running", + "title": "WebSearch running", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "web", + "search", + "running" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "web", "search"], + "states": ["running"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/websearch-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/websearch-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/websearch-running.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "websearch-failure", + "title": "WebSearch fails", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "error-recovery", + "transcript", + "tool-card", + "error-report", + "inline", + "error-report", + "tool", + "web", + "search", + "error" + ], + "screenLabels": ["tool-execution", "error-recovery"], + "uiElements": ["transcript", "tool-card", "error-report"], + "surfaces": ["inline"], + "patterns": ["error-report"], + "features": ["tool", "web", "search"], + "states": ["error"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/websearch-failure.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/websearch-failure.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/websearch-failure.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "assistant-response-succeeded", + "title": "Assistant response succeeded", + "category": "session", + "summary": "", + "tags": [ + "question-response", + "transcript", + "confirmation", + "inline", + "status", + "assistant", + "response", + "success" + ], + "screenLabels": ["question-response"], + "uiElements": ["transcript", "confirmation"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["assistant", "response"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/assistant-response-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/assistant-response-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/assistant-response-succeeded.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "assistant-response-failed", + "title": "Assistant response failed", + "category": "session", + "summary": "", + "tags": [ + "question-response", + "error-recovery", + "transcript", + "error-report", + "inline", + "error-report", + "assistant", + "response", + "error" + ], + "screenLabels": ["question-response", "error-recovery"], + "uiElements": ["transcript", "error-report"], + "surfaces": ["inline"], + "patterns": ["error-report"], + "features": ["assistant", "response"], + "states": ["error"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/assistant-response-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/assistant-response-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/assistant-response-failed.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "assistant-response-interrupted", + "title": "Assistant response interrupted", + "category": "session", + "summary": "", + "tags": [ + "question-response", + "error-recovery", + "transcript", + "status-indicator", + "inline", + "status", + "assistant", + "response", + "error" + ], + "screenLabels": ["question-response", "error-recovery"], + "uiElements": ["transcript", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["assistant", "response"], + "states": ["error"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/assistant-response-interrupted.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/assistant-response-interrupted.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/assistant-response-interrupted.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-input-streaming", + "title": "Question input streaming", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "question", + "streaming" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "question"], + "states": ["streaming"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-input-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-awaiting-form", + "title": "Question awaiting form", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "question-response", + "question-prompt", + "button-group", + "keyboard-hints", + "inline", + "form", + "tool", + "question", + "pending" + ], + "screenLabels": ["tool-execution", "question-response"], + "uiElements": ["question-prompt", "button-group", "keyboard-hints"], + "surfaces": ["inline"], + "patterns": ["form"], + "features": ["tool", "question"], + "states": ["pending"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-awaiting-form.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-awaiting-form.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-awaiting-form.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-review", + "title": "Question review", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "question-response", + "question-prompt", + "confirmation", + "keyboard-hints", + "inline", + "form", + "tool", + "question", + "confirmation" + ], + "screenLabels": ["tool-execution", "question-response"], + "uiElements": ["question-prompt", "confirmation", "keyboard-hints"], + "surfaces": ["inline"], + "patterns": ["form"], + "features": ["tool", "question"], + "states": ["confirmation"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-review.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-review.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-review.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-succeeded", + "title": "Question succeeded", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "confirmation", + "inline", + "status", + "tool", + "question", + "success" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "confirmation"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "question"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-succeeded.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-denied", + "title": "Question denied", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "error-recovery", + "transcript", + "tool-card", + "destructive-action", + "inline", + "status", + "tool", + "question", + "error" + ], + "screenLabels": ["tool-execution", "error-recovery"], + "uiElements": ["transcript", "tool-card", "destructive-action"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "question"], + "states": ["error"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-denied.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-denied.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-denied.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "read-input-streaming", + "title": "Read input streaming", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "read", + "streaming" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "read"], + "states": ["streaming"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/read-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/read-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/read-input-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "read-permission", + "title": "Read permission", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "confirmation", + "inline", + "approval", + "tool", + "read", + "confirmation" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["inline-prompt", "approval-actions", "button-group", "keyboard-hints", "confirmation"], + "surfaces": ["inline"], + "patterns": ["approval"], + "features": ["tool", "read"], + "states": ["confirmation"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/read-permission.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/read-permission.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/read-permission.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "read-succeeded", + "title": "Read succeeded", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "read", + "success" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "read"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/read-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/read-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/read-succeeded.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "read-denied", + "title": "Read denied", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "error-recovery", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "tool", + "read", + "error" + ], + "screenLabels": ["tool-execution", "error-recovery"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "read"], + "states": ["error"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/read-denied.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/read-denied.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/read-denied.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-created", + "title": "Patch created file", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "confirmation", + "inline", + "status", + "tool", + "patch", + "success" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "confirmation"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "patch"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-created.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-created.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-created.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-updated", + "title": "Patch updated file", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "confirmation", + "inline", + "status", + "tool", + "patch", + "success" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "confirmation"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "patch"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-updated.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-updated.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-updated.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-deleted", + "title": "Patch deleted file", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "transcript", + "tool-card", + "confirmation", + "inline", + "status", + "tool", + "patch", + "success" + ], + "screenLabels": ["tool-execution"], + "uiElements": ["transcript", "tool-card", "confirmation"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["tool", "patch"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-deleted.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-deleted.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-deleted.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-failed", + "title": "Patch failed", + "category": "session", + "summary": "", + "tags": [ + "tool-execution", + "error-recovery", + "transcript", + "tool-card", + "error-report", + "inline", + "error-report", + "tool", + "patch", + "error" + ], + "screenLabels": ["tool-execution", "error-recovery"], + "uiElements": ["transcript", "tool-card", "error-report"], + "surfaces": ["inline"], + "patterns": ["error-report"], + "features": ["tool", "patch"], + "states": ["error"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-failed.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-tabs-running", + "title": "Session tabs (running)", + "category": "session", + "summary": "", + "tags": [ + "session-list", + "tabs", + "full-screen-view", + "status-indicator", + "keyboard-hints", + "transcript", + "full-screen", + "navigation", + "session", + "tabs", + "running" + ], + "screenLabels": ["session-list"], + "uiElements": ["tabs", "full-screen-view", "status-indicator", "keyboard-hints", "transcript"], + "surfaces": ["full-screen"], + "patterns": ["navigation"], + "features": ["session", "tabs"], + "states": ["running"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-tabs-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-tabs-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-tabs-running.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-tabs-idle", + "title": "Session tabs (idle)", + "category": "session", + "summary": "", + "tags": [ + "session-list", + "tabs", + "full-screen-view", + "status-indicator", + "keyboard-hints", + "full-screen", + "navigation", + "session", + "tabs", + "idle" + ], + "screenLabels": ["session-list"], + "uiElements": ["tabs", "full-screen-view", "status-indicator", "keyboard-hints"], + "surfaces": ["full-screen"], + "patterns": ["navigation"], + "features": ["session", "tabs"], + "states": ["idle"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-tabs-idle.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-tabs-idle.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-tabs-idle.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "subagent-running", + "title": "Subagent running", + "category": "session", + "summary": "", + "tags": [ + "subagent-activity", + "transcript", + "tool-card", + "status-indicator", + "inline", + "status", + "agent", + "subagent", + "running" + ], + "screenLabels": ["subagent-activity"], + "uiElements": ["transcript", "tool-card", "status-indicator"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["agent", "subagent"], + "states": ["running"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/subagent-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/subagent-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/subagent-running.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "subagent-completed", + "title": "Subagent completed", + "category": "session", + "summary": "", + "tags": [ + "subagent-activity", + "transcript", + "tool-card", + "confirmation", + "inline", + "status", + "agent", + "subagent", + "success" + ], + "screenLabels": ["subagent-activity"], + "uiElements": ["transcript", "tool-card", "confirmation"], + "surfaces": ["inline"], + "patterns": ["status"], + "features": ["agent", "subagent"], + "states": ["success"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/subagent-completed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/subagent-completed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/subagent-completed.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "subagent-session", + "title": "Subagent session", + "category": "session", + "summary": "", + "tags": [ + "subagent-activity", + "session-list", + "transcript", + "panel", + "status-indicator", + "full-screen", + "panel", + "status", + "agent", + "subagent", + "session", + "populated" + ], + "screenLabels": ["subagent-activity", "session-list"], + "uiElements": ["transcript", "panel", "status-indicator"], + "surfaces": ["full-screen", "panel"], + "patterns": ["status"], + "features": ["agent", "subagent", "session"], + "states": ["populated"], + "dimensions": [], + "viewport": { + "cols": 118, + "rows": 34 + }, + "variations": [], + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/subagent-session.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/subagent-session.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/subagent-session.frame.json", + "cols": 118, + "rows": 34 + } + ] + } + ], + "flows": [ + { + "id": "starting-a-session", + "title": "Starting a session", + "group": "Getting started", + "description": "Begin from the OpenCode start screen and prepare a new conversation.", + "replayable": false, + "steps": [ + { + "screenId": "home", + "title": "Start a new conversation", + "trigger": "Open OpenCode" + }, + { + "screenId": "model-picker", + "title": "Choose a model", + "trigger": "Open the model picker" + }, + { + "screenId": "agent-picker", + "title": "Choose an agent", + "trigger": "Open the agent picker" + } + ] + }, + { + "id": "session-tabs-lifecycle", + "title": "Monitoring session tabs", + "group": "Session management", + "description": "Compare an idle session strip with a session actively running work.", + "replayable": true, + "steps": [ + { + "screenId": "session-tabs-running", + "title": "Review a running tab", + "trigger": "Start the selected session" + }, + { + "screenId": "session-tabs-idle", + "title": "Review idle tabs" + } + ] + }, + { + "id": "switching-sessions", + "title": "Switching sessions", + "group": "Session management", + "description": "Find an existing conversation and resume it from the session picker.", + "replayable": false, + "steps": [ + { + "screenId": "command-palette", + "title": "Open session navigation", + "trigger": "Open the command palette" + }, + { + "screenId": "session-picker", + "title": "Open the session picker", + "trigger": "Run Switch session" + }, + { + "screenId": "session-picker-populated", + "title": "Select a session", + "trigger": "Search, then press Enter" + } + ] + }, + { + "id": "renaming-a-session", + "title": "Renaming a session", + "group": "Session management", + "description": "Give the current conversation a recognizable name.", + "replayable": false, + "steps": [ + { + "screenId": "session-picker-populated", + "title": "Identify the current session" + }, + { + "screenId": "session-rename", + "title": "Enter the new name", + "trigger": "Run /rename" + } + ] + }, + { + "id": "forking-a-session", + "title": "Forking a session", + "group": "Session management", + "description": "Branch an existing conversation from a selected message.", + "replayable": false, + "steps": [ + { + "screenId": "session-picker-populated", + "title": "Open the source session" + }, + { + "screenId": "session-fork", + "title": "Choose the fork point", + "trigger": "Run /fork" + } + ] + }, + { + "id": "exporting-a-session", + "title": "Exporting a session", + "group": "Session management", + "description": "Choose an export format and confirm the transcript was copied.", + "replayable": false, + "steps": [ + { + "screenId": "session-export", + "title": "Choose an export format", + "trigger": "Run /export" + }, + { + "screenId": "toast-success", + "title": "Confirm the export", + "trigger": "Complete the export action" + } + ] + }, + { + "id": "patch-success-lifecycle", + "title": "Patch succeeds", + "group": "Tool use", + "description": "Watch a patch stream its input, request permission, and complete successfully.", + "replayable": true, + "steps": [ + { + "screenId": "patch-input-streaming", + "title": "Input streams" + }, + { + "screenId": "permission-prompt", + "title": "Permission is requested" + }, + { + "screenId": "permission-always-selected", + "title": "Persistent permission is selected", + "trigger": "Choose Allow always" + }, + { + "screenId": "permission-always-confirmation", + "title": "Persistent permission is confirmed", + "trigger": "Confirm Allow always" + }, + { + "screenId": "permission-reject-selected", + "title": "Rejection is selected", + "trigger": "Select Reject" + }, + { + "screenId": "permission-fullscreen", + "title": "Permission is inspected fullscreen", + "trigger": "Toggle fullscreen" + }, + { + "screenId": "patch-success", + "title": "Patch succeeds" + } + ] + }, + { + "id": "shell-lifecycle", + "title": "Foreground shell lifecycle", + "group": "Tool use", + "description": "Watch thinking and shell input stream before foreground commands succeed and fail.", + "replayable": true, + "steps": [ + { + "screenId": "thinking-streaming", + "title": "Thinking streams" + }, + { + "screenId": "shell-input-streaming", + "title": "Command input streams" + }, + { + "screenId": "shell-output-streaming", + "title": "Command output streams" + }, + { + "screenId": "shell-execute-succeeded", + "title": "Command succeeds" + }, + { + "screenId": "shell-execute-failed", + "title": "Command fails" + } + ] + }, + { + "id": "search-lifecycle", + "title": "Project search lifecycle", + "group": "Tool use", + "description": "Run built-in glob and grep tools through distinct streaming, grouped, success, empty, and failure states.", + "replayable": true, + "steps": [ + { + "screenId": "glob-success", + "title": "Glob succeeds" + }, + { + "screenId": "glob-empty", + "title": "Glob is empty" + }, + { + "screenId": "grouped-exploration", + "title": "Glob and grep run together" + }, + { + "screenId": "grep-success", + "title": "Grep succeeds" + }, + { + "screenId": "grep-empty", + "title": "Grep is empty" + }, + { + "screenId": "grep-failure", + "title": "Grep fails" + } + ] + }, + { + "id": "web-lifecycle", + "title": "Web tool lifecycle", + "group": "Tool use", + "description": "Run the v2 WebFetch and WebSearch renderers with real tool calls.", + "replayable": true, + "steps": [ + { + "screenId": "webfetch-streaming", + "title": "WebFetch input streams" + }, + { + "screenId": "webfetch-success", + "title": "WebFetch succeeds" + }, + { + "screenId": "websearch-running", + "title": "WebSearch runs" + }, + { + "screenId": "websearch-failure", + "title": "WebSearch reports provider failure" + } + ] + }, + { + "id": "question-lifecycle", + "title": "Question lifecycle", + "group": "Tool use", + "description": "Stream a question call, answer its form, review it, submit it, and deny a second call.", + "replayable": true, + "steps": [ + { + "screenId": "question-input-streaming", + "title": "Question input streams" + }, + { + "screenId": "question-awaiting-form", + "title": "Question awaits an answer" + }, + { + "screenId": "question-review", + "title": "Answers are reviewed" + }, + { + "screenId": "question-succeeded", + "title": "Answers are submitted" + }, + { + "screenId": "question-denied", + "title": "Question is denied" + } + ] + }, + { + "id": "read-file-lifecycle", + "title": "Read file lifecycle", + "group": "Tool use", + "description": "Stream a read call, approve it, then observe success and denial.", + "replayable": true, + "steps": [ + { + "screenId": "read-input-streaming", + "title": "Input streams" + }, + { + "screenId": "read-permission", + "title": "Permission is requested" + }, + { + "screenId": "read-succeeded", + "title": "Read succeeds" + }, + { + "screenId": "read-denied", + "title": "Read is denied" + } + ] + }, + { + "id": "patch-file-changes", + "title": "Patch file changes", + "group": "Tool use", + "description": "Apply real patches that create, update, and delete files, then show verification failure.", + "replayable": true, + "steps": [ + { + "screenId": "patch-created", + "title": "Patch creates a file" + }, + { + "screenId": "patch-updated", + "title": "Patch updates a file" + }, + { + "screenId": "patch-deleted", + "title": "Patch deletes a file" + }, + { + "screenId": "patch-failed", + "title": "Patch fails verification" + } + ] + }, + { + "id": "answering-a-question", + "title": "Answering an agent question", + "group": "Tool use", + "description": "Respond to a structured question without leaving the conversation.", + "replayable": false, + "steps": [ + { + "screenId": "question-prompt", + "title": "Choose or enter an answer", + "trigger": "Submit the question form" + } + ] + }, + { + "id": "subagent-lifecycle", + "title": "Subagent lifecycle", + "group": "Subagents", + "description": "Delegate work, observe its completion, and open the child session.", + "replayable": true, + "steps": [ + { + "screenId": "subagent-running", + "title": "Subagent runs" + }, + { + "screenId": "subagent-completed", + "title": "Subagent completes" + }, + { + "screenId": "subagent-session", + "title": "Open the subagent session" + } + ] + }, + { + "id": "assistant-lifecycle", + "title": "Assistant response lifecycle", + "group": "Responses", + "description": "Observe assistant text while it streams, succeeds, fails, and is interrupted.", + "replayable": true, + "steps": [ + { + "screenId": "assistant-response-succeeded", + "title": "Response succeeds" + }, + { + "screenId": "assistant-response-failed", + "title": "Response fails" + }, + { + "screenId": "assistant-response-interrupted", + "title": "Response is interrupted" + } + ] + }, + { + "id": "connecting-an-integration", + "title": "Connecting an integration", + "group": "Configuration", + "description": "Choose an integration and verify its connection state.", + "replayable": false, + "steps": [ + { + "screenId": "integration-picker", + "title": "Choose an integration" + }, + { + "screenId": "status", + "title": "Check the connection status" + } + ] + }, + { + "id": "managing-mcp-servers", + "title": "Managing MCP servers", + "group": "Configuration", + "description": "Inspect configured MCP servers and their runtime status.", + "replayable": false, + "steps": [ + { + "screenId": "mcp-list", + "title": "Open MCP management" + }, + { + "screenId": "status", + "title": "Inspect MCP status" + } + ] + }, + { + "id": "pairing-a-device", + "title": "Pairing a device", + "group": "Configuration", + "description": "Open the pairing code used to connect another device.", + "replayable": false, + "steps": [ + { + "screenId": "pair", + "title": "Scan the pairing code" + } + ] + }, + { + "id": "reviewing-a-diff", + "title": "Reviewing a diff", + "group": "Review", + "description": "Inspect the working tree and verify whether files have changed.", + "replayable": false, + "steps": [ + { + "screenId": "diff-viewer", + "title": "Open the diff viewer", + "trigger": "Run /diff" + } + ] + } + ] +} diff --git a/packages/lab/catalog/public/drive-captures.json b/packages/lab/catalog/public/drive-captures.json new file mode 100644 index 00000000000..abf58a206b6 --- /dev/null +++ b/packages/lab/catalog/public/drive-captures.json @@ -0,0 +1,1660 @@ +{ + "format": "opencode-terminal-frame-captures-v1", + "generatedBy": "scripts/capture-opencode-drive.ts", + "variants": [ + { + "id": "opencode", + "label": "Opencode", + "source": "opencode", + "revision": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "ref": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "committedAt": "2026-08-12T12:45:43-04:00", + "theme": "opencode" + }, + { + "id": "tokyonight", + "label": "Tokyo Night", + "source": "opencode", + "revision": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "ref": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "committedAt": "2026-08-12T12:45:43-04:00", + "theme": "tokyonight" + }, + { + "id": "everforest", + "label": "Everforest", + "source": "opencode", + "revision": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "ref": "2a0ccdbfd4589ba2181624f25c55ed4ac0546b2d", + "committedAt": "2026-08-12T12:45:43-04:00", + "theme": "everforest" + } + ], + "captures": [ + { + "id": "home", + "title": "Home", + "category": "system", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/home.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/home.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/home.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "command-palette", + "title": "Command palette", + "category": "navigation", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/command-palette.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/command-palette.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/command-palette.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "model-picker", + "title": "Model picker", + "category": "picker", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/model-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/model-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/model-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "agent-picker", + "title": "Agent picker", + "category": "picker", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/agent-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/agent-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/agent-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "integration-picker", + "title": "Integrations", + "category": "picker", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/integration-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/integration-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/integration-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "theme-picker", + "title": "Theme picker", + "category": "picker", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/theme-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/theme-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/theme-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "mcp-list", + "title": "MCPs", + "category": "status", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/mcp-list.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/mcp-list.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/mcp-list.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "status", + "title": "Status", + "category": "status", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/status.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/status.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/status.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "debug", + "title": "Debug", + "category": "information", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/debug.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/debug.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/debug.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "help", + "title": "Help", + "category": "information", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/help.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/help.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/help.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "pair", + "title": "Pair device", + "category": "information", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/pair.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/pair.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/pair.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-picker", + "title": "Session picker", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "skill-picker", + "title": "Skill picker", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/skill-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/skill-picker.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/skill-picker.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-input-streaming", + "title": "Patch input streaming", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-input-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-prompt", + "title": "Permission prompt", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-prompt.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-prompt.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-prompt.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-always-selected", + "title": "Permission prompt (always selected)", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-always-selected.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-always-selected.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-always-selected.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-always-confirmation", + "title": "Always allow confirmation", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-always-confirmation.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-always-confirmation.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-always-confirmation.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-reject-selected", + "title": "Permission prompt (reject selected)", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-reject-selected.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-reject-selected.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-reject-selected.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "permission-fullscreen", + "title": "Permission prompt (fullscreen)", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/permission-fullscreen.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/permission-fullscreen.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/permission-fullscreen.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-success", + "title": "Patch succeeded", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-rename", + "title": "Rename session", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-rename.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-rename.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-rename.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-fork", + "title": "Fork session", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-fork.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-fork.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-fork.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-export", + "title": "Export session", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-export.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-export.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-export.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-prompt", + "title": "Question prompt", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-prompt.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-prompt.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-prompt.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-picker-populated", + "title": "Session picker (populated)", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-picker-populated.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-picker-populated.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-picker-populated.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "toast-success", + "title": "Success toast", + "category": "system", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/toast-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/toast-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/toast-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "toast-error", + "title": "Error toast", + "category": "system", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/toast-error.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/toast-error.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/toast-error.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "toast-info", + "title": "Info toast", + "category": "system", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/toast-info.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/toast-info.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/toast-info.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "diff-viewer", + "title": "Diff viewer", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/diff-viewer.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/diff-viewer.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/diff-viewer.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "thinking-streaming", + "title": "Thinking streaming", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/thinking-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/thinking-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/thinking-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "shell-input-streaming", + "title": "Shell input streaming", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/shell-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/shell-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/shell-input-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "shell-output-streaming", + "title": "Shell output streaming", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/shell-output-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/shell-output-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/shell-output-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "shell-execute-succeeded", + "title": "Shell execution succeeded", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/shell-execute-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/shell-execute-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/shell-execute-succeeded.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "shell-execute-failed", + "title": "Shell execution failed", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/shell-execute-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/shell-execute-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/shell-execute-failed.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "glob-success", + "title": "Glob finds files", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/glob-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/glob-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/glob-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "glob-empty", + "title": "Glob finds no files", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/glob-empty.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/glob-empty.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/glob-empty.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "grouped-exploration", + "title": "Grouped project exploration", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/grouped-exploration.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/grouped-exploration.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/grouped-exploration.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "grep-success", + "title": "Grep finds matches", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/grep-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/grep-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/grep-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "grep-empty", + "title": "Grep finds no matches", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/grep-empty.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/grep-empty.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/grep-empty.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "grep-failure", + "title": "Grep pattern fails", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/grep-failure.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/grep-failure.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/grep-failure.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "webfetch-streaming", + "title": "WebFetch streaming", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/webfetch-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/webfetch-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/webfetch-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "webfetch-success", + "title": "WebFetch succeeds", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/webfetch-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/webfetch-success.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/webfetch-success.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "websearch-running", + "title": "WebSearch running", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/websearch-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/websearch-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/websearch-running.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "websearch-failure", + "title": "WebSearch fails", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/websearch-failure.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/websearch-failure.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/websearch-failure.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "assistant-response-succeeded", + "title": "Assistant response succeeded", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/assistant-response-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/assistant-response-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/assistant-response-succeeded.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "assistant-response-failed", + "title": "Assistant response failed", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/assistant-response-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/assistant-response-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/assistant-response-failed.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "assistant-response-interrupted", + "title": "Assistant response interrupted", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/assistant-response-interrupted.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/assistant-response-interrupted.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/assistant-response-interrupted.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-input-streaming", + "title": "Question input streaming", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-input-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-awaiting-form", + "title": "Question awaiting form", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-awaiting-form.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-awaiting-form.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-awaiting-form.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-review", + "title": "Question review", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-review.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-review.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-review.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-succeeded", + "title": "Question succeeded", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-succeeded.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "question-denied", + "title": "Question denied", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/question-denied.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/question-denied.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/question-denied.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "read-input-streaming", + "title": "Read input streaming", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/read-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/read-input-streaming.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/read-input-streaming.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "read-permission", + "title": "Read permission", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/read-permission.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/read-permission.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/read-permission.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "read-succeeded", + "title": "Read succeeded", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/read-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/read-succeeded.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/read-succeeded.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "read-denied", + "title": "Read denied", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/read-denied.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/read-denied.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/read-denied.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-created", + "title": "Patch created file", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-created.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-created.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-created.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-updated", + "title": "Patch updated file", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-updated.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-updated.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-updated.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-deleted", + "title": "Patch deleted file", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-deleted.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-deleted.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-deleted.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "patch-failed", + "title": "Patch failed", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/patch-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/patch-failed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/patch-failed.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-tabs-running", + "title": "Session tabs (running)", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-tabs-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-tabs-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-tabs-running.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "session-tabs-idle", + "title": "Session tabs (idle)", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/session-tabs-idle.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/session-tabs-idle.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/session-tabs-idle.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "subagent-running", + "title": "Subagent running", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/subagent-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/subagent-running.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/subagent-running.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "subagent-completed", + "title": "Subagent completed", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/subagent-completed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/subagent-completed.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/subagent-completed.frame.json", + "cols": 118, + "rows": 34 + } + ] + }, + { + "id": "subagent-session", + "title": "Subagent session", + "category": "session", + "frames": [ + { + "variantId": "opencode", + "src": "captures/opencode/subagent-session.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "tokyonight", + "src": "captures/tokyonight/subagent-session.frame.json", + "cols": 118, + "rows": 34 + }, + { + "variantId": "everforest", + "src": "captures/everforest/subagent-session.frame.json", + "cols": 118, + "rows": 34 + } + ] + } + ] +} diff --git a/packages/lab/catalog/scenarios/index.ts b/packages/lab/catalog/scenarios/index.ts new file mode 100644 index 00000000000..2c22e876312 --- /dev/null +++ b/packages/lab/catalog/scenarios/index.ts @@ -0,0 +1,77 @@ +import type * as Effect from "effect/Effect" +import type { Driver } from "opencode-drive/driver" +import { executableScenario } from "../catalog/flow" +import { patchSuccessFlow } from "./tools/patch-success" +import { shellLifecycleFlow } from "./tools/shell-lifecycle" +import { subagentLifecycleFlow } from "./subagents/subagent-lifecycle" +import { searchLifecycleFlow } from "./tools/search-lifecycle" +import { webLifecycleFlow } from "./tools/web-lifecycle" +import { assistantLifecycleFlow } from "./responses/assistant-lifecycle" +import { questionLifecycleFlow } from "./tools/question-lifecycle" +import { readLifecycleFlow } from "./tools/read-lifecycle" +import { patchFileChangesFlow } from "./tools/patch-file-changes" +import { sessionTabsFlow } from "./session-tabs" + +export const executableScenarios = [ + executableScenario(patchSuccessFlow), + executableScenario(shellLifecycleFlow), + executableScenario(subagentLifecycleFlow, { llmMode: "serve" }), + executableScenario(searchLifecycleFlow), + executableScenario(webLifecycleFlow), + executableScenario(assistantLifecycleFlow, { clientIsolation: "isolated" }), + executableScenario(questionLifecycleFlow, { clientIsolation: "isolated" }), + executableScenario(readLifecycleFlow, { clientIsolation: "isolated" }), + executableScenario(patchFileChangesFlow), + executableScenario(sessionTabsFlow, { clientIsolation: "isolated" }), +] as const + +export const executableFlows = executableScenarios.map((scenario) => scenario.flow) + +type RegisteredFlow = (typeof executableFlows)[number] +type RegisteredState = RegisteredFlow["states"][number] +type StateStep = { + readonly capture: State["id"] +} & State["metadata"]["step"] +type FlowSteps = Flow["states"] extends readonly [ + infer First extends RegisteredState, + ...infer Rest extends ReadonlyArray, +] + ? readonly [StateStep, ...{ readonly [Index in keyof Rest]: StateStep }] + : never + +export const executableScreens = Object.fromEntries( + executableFlows.flatMap((flow) => flow.states.map((state) => [state.id, state.metadata.screen] as const)), +) as { + readonly [State in RegisteredState as State["id"]]: State["metadata"]["screen"] +} + +export function executableFlowDefinitions(groupId: GroupId) { + return Object.fromEntries( + executableFlows + .filter((flow) => flow.group.id === groupId) + .map((flow) => [ + flow.id, + { + title: flow.title, + description: flow.description, + replayable: true as const, + steps: flow.states.map((state) => ({ capture: state.id, ...state.metadata.step })), + }, + ]), + ) as unknown as { + readonly [Flow in RegisteredFlow as Flow["group"]["id"] extends GroupId ? Flow["id"] : never]: { + readonly title: Flow["title"] + readonly description: Flow["description"] + readonly replayable: true + readonly steps: FlowSteps + } + } +} + +export const executableStates = executableScenarios.flatMap((scenario) => + scenario.states.map((state) => ({ + address: state.address, + run: (driver: Driver, capture: () => Effect.Effect) => + scenario.run({ driver, through: state.id, capture }), + })), +) diff --git a/packages/lab/catalog/scenarios/responses/assistant-lifecycle.ts b/packages/lab/catalog/scenarios/responses/assistant-lifecycle.ts new file mode 100644 index 00000000000..095f52d7243 --- /dev/null +++ b/packages/lab/catalog/scenarios/responses/assistant-lifecycle.ts @@ -0,0 +1,84 @@ +import { Effect } from "effect" +import * as Llm from "opencode-drive/llm" +import { defineExecutableFlow } from "../../catalog/flow" +import { taxonomies } from "../../catalog/authored/taxonomies" + +export const assistantLifecycleFlow = defineExecutableFlow( + taxonomies, + { + id: "assistant-lifecycle", + title: "Assistant response lifecycle", + group: { id: "responses", label: "Responses" }, + description: "Observe assistant text while it streams, succeeds, fails, and is interrupted.", + }, + ({ state, program }) => { + const succeeded = state("assistant-response-succeeded", { + screen: { + title: "Assistant response succeeded", + category: "session", + screenLabels: ["question-response"], + uiElements: ["transcript", "confirmation"], + surfaces: "inline", + patterns: "status", + features: ["assistant", "response"], + states: "success", + }, + step: { title: "Response succeeds" }, + }) + const failed = state("assistant-response-failed", { + screen: { + title: "Assistant response failed", + category: "session", + screenLabels: ["question-response", "error-recovery"], + uiElements: ["transcript", "error-report"], + surfaces: "inline", + patterns: "error-report", + features: ["assistant", "response"], + states: "error", + }, + step: { title: "Response fails" }, + }) + const interrupted = state("assistant-response-interrupted", { + screen: { + title: "Assistant response interrupted", + category: "session", + screenLabels: ["question-response", "error-recovery"], + uiElements: ["transcript", "status-indicator"], + surfaces: "inline", + patterns: "status", + features: ["assistant", "response"], + states: "error", + }, + step: { title: "Response is interrupted" }, + }) + + return program([succeeded, failed, interrupted], ({ driver, checkpoint }) => + Effect.gen(function* () { + yield* driver.llm.queue(Llm.text("This assistant response completes successfully.")) + yield* driver.ui.submit("Show a successful streaming assistant response.") + yield* driver.ui.waitFor("completes successfully.", { timeout: 15_000 }) + yield* checkpoint(succeeded) + + yield* driver.llm.queue( + Llm.text("This response starts but the simulated provider disconnects.", { delay: 40, chunkSize: 8 }), + Llm.disconnect(), + ) + yield* driver.ui.submit("Show a failed assistant response.") + yield* driver.ui.waitFor("simulated provider disconnects", { timeout: 15_000 }) + yield* Effect.sleep(1_000) + yield* checkpoint(failed) + + yield* driver.llm.queue( + Llm.text("This response remains active until the user interrupts it."), + Llm.pause(30_000), + ) + yield* driver.ui.submit("Show an interrupted assistant response.") + yield* driver.ui.waitFor("remains active until", { timeout: 15_000 }) + yield* driver.ui.press("escape") + yield* driver.ui.press("escape") + yield* driver.ui.waitFor("interrupted", { timeout: 15_000 }) + yield* checkpoint(interrupted) + }), + ) + }, +) diff --git a/packages/lab/catalog/scenarios/runtime.ts b/packages/lab/catalog/scenarios/runtime.ts new file mode 100644 index 00000000000..160f1c1e2c7 --- /dev/null +++ b/packages/lab/catalog/scenarios/runtime.ts @@ -0,0 +1,55 @@ +import { Effect } from "effect" +import { Tool } from "opencode-drive" +import type { Options } from "opencode-drive/driver" + +export const catalogViewport = { cols: 118, rows: 34 } as const + +export function catalogScenarioRuntime(options: { readonly opencode: string; readonly theme?: string }): Options { + return { + project: { + files: { + "fixture.txt": "before\n", + "src/ledger.ts": [ + "export const credits = [8, 13, 21]", + "export const total = credits.reduce((sum, value) => sum + value, 0)", + "", + ].join("\n"), + }, + }, + config: { + autoupdate: false, + permissions: [ + { action: "*", resource: "*", effect: "ask" }, + { action: "shell", resource: "*", effect: "allow" }, + { action: "subagent", resource: "*", effect: "allow" }, + ], + agents: { + reviewer: { description: "Reviews deterministic UI fixtures", mode: "primary" }, + researcher: { description: "Explores fixture source code", mode: "subagent" }, + }, + }, + tools: (tools) => { + tools.handle("shell", ({ input, progress }) => + Effect.gen(function* () { + yield* progress(`streamed output: ${input.command}\n`) + yield* Effect.sleep(1_500) + if (input.command.includes("fail")) { + return yield* new Tool.Failure({ message: "catalog shell failure" }) + } + return { output: "catalog shell success\n", exit: 0 } + }), + ) + tools.handle("websearch", () => Effect.fail(new Tool.Failure({ message: "catalog web search provider failure" }))) + }, + setup: + options.theme === undefined + ? undefined + : ({ fs }) => + fs.writeFile( + ".opencode/tui.json", + `${JSON.stringify({ $schema: "https://opencode.ai/tui.json", theme: options.theme }, undefined, 2)}\n`, + ), + tui: { viewport: catalogViewport }, + opencode: { dev: options.opencode }, + } +} diff --git a/packages/lab/catalog/scenarios/session-tabs.ts b/packages/lab/catalog/scenarios/session-tabs.ts new file mode 100644 index 00000000000..d42e84c2522 --- /dev/null +++ b/packages/lab/catalog/scenarios/session-tabs.ts @@ -0,0 +1,53 @@ +import { Effect } from "effect" +import * as Llm from "opencode-drive/llm" +import { defineExecutableFlow } from "../catalog/flow" +import { taxonomies } from "../catalog/authored/taxonomies" + +export const sessionTabsFlow = defineExecutableFlow( + taxonomies, + { + id: "session-tabs-lifecycle", + title: "Monitoring session tabs", + group: { id: "session-management", label: "Session management" }, + description: "Compare an idle session strip with a session actively running work.", + }, + ({ state, program }) => { + const running = state("session-tabs-running", { + screen: { + title: "Session tabs (running)", + category: "session", + screenLabels: ["session-list"], + uiElements: ["tabs", "full-screen-view", "status-indicator", "keyboard-hints", "transcript"], + surfaces: "full-screen", + patterns: "navigation", + features: ["session", "tabs"], + states: "running", + }, + step: { title: "Review a running tab", trigger: "Start the selected session" }, + }) + const idle = state("session-tabs-idle", { + screen: { + title: "Session tabs (idle)", + category: "session", + screenLabels: ["session-list"], + uiElements: ["tabs", "full-screen-view", "status-indicator", "keyboard-hints"], + surfaces: "full-screen", + patterns: "navigation", + features: ["session", "tabs"], + states: "idle", + }, + step: { title: "Review idle tabs" }, + }) + + return program([running, idle], ({ driver, checkpoint }) => + Effect.gen(function* () { + yield* driver.llm.queue(Llm.text("Working on a tab audit."), Llm.pause(2_000), Llm.text("Tab audit complete.")) + yield* driver.ui.submit("Audit the current tab state.") + yield* driver.ui.waitFor("Working on a tab audit.", { timeout: 15_000 }) + yield* checkpoint(running) + yield* driver.ui.waitFor("Tab audit complete.", { timeout: 15_000 }) + yield* checkpoint(idle) + }), + ) + }, +) diff --git a/packages/lab/catalog/scenarios/subagents/subagent-lifecycle.ts b/packages/lab/catalog/scenarios/subagents/subagent-lifecycle.ts new file mode 100644 index 00000000000..622b5234831 --- /dev/null +++ b/packages/lab/catalog/scenarios/subagents/subagent-lifecycle.ts @@ -0,0 +1,131 @@ +import { Effect, Stream } from "effect" +import { Llm, type JsonValue } from "opencode-drive" +import { defineExecutableFlow } from "../../catalog/flow" +import { taxonomies } from "../../catalog/authored/taxonomies" + +export const subagentLifecycleFlow = defineExecutableFlow( + taxonomies, + { + id: "subagent-lifecycle", + title: "Subagent lifecycle", + group: { id: "subagents", label: "Subagents" }, + description: "Delegate work, observe its completion, and open the child session.", + }, + ({ state, program }) => { + const running = state("subagent-running", { + screen: { + title: "Subagent running", + category: "session", + screenLabels: ["subagent-activity"], + uiElements: ["transcript", "tool-card", "status-indicator"], + surfaces: "inline", + patterns: "status", + features: ["agent", "subagent"], + states: "running", + }, + step: { title: "Subagent runs" }, + }) + const completed = state("subagent-completed", { + screen: { + title: "Subagent completed", + category: "session", + screenLabels: ["subagent-activity"], + uiElements: ["transcript", "tool-card", "confirmation"], + surfaces: "inline", + patterns: "status", + features: ["agent", "subagent"], + states: "success", + }, + step: { title: "Subagent completes" }, + }) + const session = state("subagent-session", { + screen: { + title: "Subagent session", + category: "session", + screenLabels: ["subagent-activity", "session-list"], + uiElements: ["transcript", "panel", "status-indicator"], + surfaces: ["full-screen", "panel"], + patterns: "status", + features: ["agent", "subagent", "session"], + states: "populated", + }, + step: { title: "Open the subagent session" }, + }) + + return program([running, completed, session], ({ driver, checkpoint }) => + Effect.gen(function* () { + let phase = 0 + yield* driver.llm.serve((request) => { + if (JSON.stringify(request.body).includes("title generator")) { + return Stream.make(Llm.text("Delegating ledger lifecycle")) + } + if (phase === 0) { + phase++ + const tool = subagentTool(request.body) + return Stream.make( + Llm.reasoning("I will delegate the ledger inspection."), + Llm.toolCall({ + index: 0, + id: "call_catalog_subagent", + name: tool, + input: subagentInput(tool), + }), + Llm.finish("tool-calls"), + ) + } + if (phase === 1) { + phase++ + return Stream.make(Llm.pause(1_500), Llm.text("The child inspected src/ledger.ts and calculated total 42.")) + } + phase++ + return Stream.make(Llm.text("Subagent completed the ledger lifecycle.")) + }) + + yield* driver.ui.submit("Use a subagent to inspect src/ledger.ts and calculate the total.") + yield* driver.ui.waitFor("Inspect ledger lifecycle", { timeout: 15_000 }) + yield* checkpoint(running) + yield* driver.ui.waitFor("Subagent completed the ledger lifecycle.", { timeout: 30_000 }) + yield* checkpoint(completed) + yield* driver.ui.press("p", { ctrl: true }) + yield* driver.ui.waitFor("Commands") + yield* driver.ui.type("Toggle subagent picker") + yield* driver.ui.waitFor("Toggle subagent picker") + yield* driver.ui.enter() + yield* driver.ui.waitFor("Subagents") + yield* driver.ui.press("a", { ctrl: true }) + yield* driver.ui.waitFor("Inspect ledger lifecycle") + yield* driver.ui.enter() + yield* driver.ui.waitFor("calculated total 42", { timeout: 15_000 }) + yield* checkpoint(session) + }), + ) + }, +) + +function subagentTool(body: JsonValue) { + const names = offeredTools(body) + if (names.includes("subagent")) return "subagent" + if (names.includes("task")) return "task" + throw new Error(`OpenCode did not offer a subagent tool: ${names.join(", ")}`) +} + +function subagentInput(tool: string): JsonValue { + const input = { + description: "Inspect ledger lifecycle", + prompt: "Read src/ledger.ts and report its exports, values, and calculated total.", + } + if (tool === "subagent") return { ...input, agent: "researcher" } + return { ...input, subagent_type: "researcher" } +} + +function offeredTools(body: JsonValue) { + if (!isJsonObject(body) || !Array.isArray(body.tools)) return [] + return body.tools.flatMap((tool) => { + if (!isJsonObject(tool) || !isJsonObject(tool.function)) return [] + return typeof tool.function.name === "string" ? [tool.function.name] : [] + }) +} + +function isJsonObject(value: JsonValue | undefined): value is { readonly [key: string]: JsonValue } { + return typeof value === "object" && value !== null && !Array.isArray(value) +} diff --git a/packages/lab/catalog/scenarios/tools/patch-file-changes.ts b/packages/lab/catalog/scenarios/tools/patch-file-changes.ts new file mode 100644 index 00000000000..83f6fbff8e2 --- /dev/null +++ b/packages/lab/catalog/scenarios/tools/patch-file-changes.ts @@ -0,0 +1,107 @@ +import { Effect } from "effect" +import * as Llm from "opencode-drive/llm" +import { defineExecutableFlow } from "../../catalog/flow" +import { taxonomies } from "../../catalog/authored/taxonomies" + +const patch = (...lines: ReadonlyArray) => ["*** Begin Patch", ...lines, "*** End Patch"].join("\n") +const screen = (title: string, states: "success" | "error") => ({ + title, + category: "session" as const, + screenLabels: states === "error" ? (["tool-execution", "error-recovery"] as const) : (["tool-execution"] as const), + uiElements: + states === "error" + ? (["transcript", "tool-card", "error-report"] as const) + : (["transcript", "tool-card", "confirmation"] as const), + surfaces: "inline" as const, + patterns: states === "error" ? ("error-report" as const) : ("status" as const), + features: ["tool", "patch"] as const, + states, +}) + +export const patchFileChangesFlow = defineExecutableFlow( + taxonomies, + { + id: "patch-file-changes", + title: "Patch file changes", + group: { id: "tool-use", label: "Tool use" }, + description: "Apply real patches that create, update, and delete files, then show verification failure.", + }, + ({ state, program }) => { + const created = state("patch-created", { + screen: screen("Patch created file", "success"), + step: { title: "Patch creates a file" }, + }) + const updated = state("patch-updated", { + screen: screen("Patch updated file", "success"), + step: { title: "Patch updates a file" }, + }) + const deleted = state("patch-deleted", { + screen: screen("Patch deleted file", "success"), + step: { title: "Patch deletes a file" }, + }) + const failed = state("patch-failed", { + screen: screen("Patch failed", "error"), + step: { title: "Patch fails verification" }, + }) + + return program([created, updated, deleted, failed], ({ driver, checkpoint }) => + Effect.gen(function* () { + yield* driver.llm.queue( + Llm.toolCall({ + index: 0, + id: "call_patch_create", + name: "patch", + input: { patchText: patch("*** Add File: patched.txt", "+created by patch") }, + }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue( + Llm.pause(800), + Llm.toolCall({ + index: 0, + id: "call_patch_update", + name: "patch", + input: { patchText: patch("*** Update File: fixture.txt", "@@", "-before", "+updated by patch") }, + }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue( + Llm.pause(800), + Llm.toolCall({ + index: 0, + id: "call_patch_delete", + name: "patch", + input: { patchText: patch("*** Delete File: patched.txt") }, + }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue( + Llm.pause(800), + Llm.toolCall({ + index: 0, + id: "call_patch_failure", + name: "patch", + input: { patchText: patch("*** Update File: missing-patch.txt", "@@", "-missing", "+still missing") }, + }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The patch file-change lifecycle is complete.")) + + yield* driver.ui.submit( + "Create a file, update the fixture, delete the created file, then attempt an invalid patch.", + ) + yield* driver.ui.getNode("session.permission.action.once").pipe(Effect.flatMap(driver.ui.click)) + yield* Effect.sleep(300) + yield* checkpoint(created) + yield* driver.ui.getNode("session.permission.action.once").pipe(Effect.flatMap(driver.ui.click)) + yield* Effect.sleep(300) + yield* checkpoint(updated) + yield* driver.ui.getNode("session.permission.action.once").pipe(Effect.flatMap(driver.ui.click)) + yield* Effect.sleep(300) + yield* checkpoint(deleted) + yield* driver.ui.waitFor("The patch file-change lifecycle is complete.", { timeout: 15_000 }) + yield* checkpoint(failed) + }), + ) + }, +) diff --git a/packages/lab/catalog/scenarios/tools/patch-success.ts b/packages/lab/catalog/scenarios/tools/patch-success.ts new file mode 100644 index 00000000000..3d2731479f9 --- /dev/null +++ b/packages/lab/catalog/scenarios/tools/patch-success.ts @@ -0,0 +1,181 @@ +import { Effect } from "effect" +import * as Llm from "opencode-drive/llm" +import { defineExecutableFlow } from "../../catalog/flow" +import { taxonomies } from "../../catalog/authored/taxonomies" + +export const patchSuccessFlow = defineExecutableFlow( + taxonomies, + { + id: "patch-success-lifecycle", + title: "Patch succeeds", + group: { id: "tool-use", label: "Tool use" }, + description: "Watch a patch stream its input, request permission, and complete successfully.", + }, + ({ state, program }) => { + const inputStreaming = state("patch-input-streaming", { + screen: { + title: "Patch input streaming", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["transcript", "tool-card", "status-indicator"], + surfaces: "inline", + patterns: "status", + features: ["tool", "patch"], + states: "streaming", + }, + step: { title: "Input streams" }, + }) + const permissionPrompt = state("permission-prompt", { + screen: { + title: "Permission prompt", + category: "session", + screenLabels: ["tool-execution"], + uiElements: [ + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "confirmation", + "destructive-action", + ], + surfaces: "inline", + patterns: "approval", + features: ["permission", "tool", "patch"], + states: "confirmation", + }, + step: { title: "Permission is requested" }, + }) + const alwaysSelected = state("permission-always-selected", { + screen: { + title: "Permission prompt (always selected)", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["inline-prompt", "approval-actions", "button-group", "keyboard-hints", "confirmation"], + surfaces: "inline", + patterns: "approval", + features: ["permission", "tool", "patch"], + states: "selected", + }, + step: { title: "Persistent permission is selected", trigger: "Choose Allow always" }, + }) + const alwaysConfirmation = state("permission-always-confirmation", { + screen: { + title: "Always allow confirmation", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["inline-prompt", "approval-actions", "button-group", "keyboard-hints", "confirmation"], + surfaces: "inline", + patterns: "approval", + features: ["permission", "tool", "patch"], + states: "confirmation", + }, + step: { title: "Persistent permission is confirmed", trigger: "Confirm Allow always" }, + }) + const rejectSelected = state("permission-reject-selected", { + screen: { + title: "Permission prompt (reject selected)", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["inline-prompt", "approval-actions", "button-group", "keyboard-hints", "destructive-action"], + surfaces: "inline", + patterns: "approval", + features: ["permission", "tool", "patch"], + states: "selected", + }, + step: { title: "Rejection is selected", trigger: "Select Reject" }, + }) + const permissionFullscreen = state("permission-fullscreen", { + screen: { + title: "Permission prompt (fullscreen)", + category: "session", + screenLabels: ["tool-execution"], + uiElements: [ + "inline-prompt", + "approval-actions", + "button-group", + "keyboard-hints", + "confirmation", + "full-screen-view", + ], + surfaces: "full-screen", + patterns: "approval", + features: ["permission", "tool", "patch"], + states: "expanded", + }, + step: { title: "Permission is inspected fullscreen", trigger: "Toggle fullscreen" }, + }) + const success = state("patch-success", { + screen: { + title: "Patch succeeded", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["transcript", "tool-card", "confirmation"], + surfaces: "inline", + patterns: "status", + features: ["tool", "patch"], + states: "success", + }, + step: { title: "Patch succeeds" }, + }) + + return program( + [ + inputStreaming, + permissionPrompt, + alwaysSelected, + alwaysConfirmation, + rejectSelected, + permissionFullscreen, + success, + ], + ({ driver, checkpoint }) => + Effect.gen(function* () { + yield* driver.llm.queue( + Llm.toolCall( + { + index: 0, + id: "call_patch_success", + name: "patch", + input: { + patchText: [ + "*** Begin Patch", + "*** Update File: fixture.txt", + "@@", + "-before", + "+after", + "*** End Patch", + ].join("\n"), + }, + }, + { delay: 90, chunkSize: 8 }, + ), + Llm.finish("tool-calls"), + ) + yield* driver.ui.submit("Change fixture.txt from before to after.") + yield* Effect.sleep(450) + yield* checkpoint(inputStreaming) + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* checkpoint(permissionPrompt) + yield* driver.ui.arrow("right") + yield* checkpoint(alwaysSelected) + yield* driver.ui.enter() + yield* driver.ui.waitFor("Always allow") + yield* checkpoint(alwaysConfirmation) + yield* driver.ui.press("escape") + yield* driver.ui.waitFor("Permission required") + yield* driver.ui.arrow("right") + yield* driver.ui.arrow("right") + yield* checkpoint(rejectSelected) + yield* driver.ui.press("f", { ctrl: true }) + yield* Effect.sleep(150) + yield* checkpoint(permissionFullscreen) + yield* driver.ui.press("f", { ctrl: true }) + yield* Effect.sleep(150) + yield* driver.llm.queue(Llm.text("The fixture was updated.")) + yield* driver.ui.getNode("session.permission.action.once").pipe(Effect.flatMap(driver.ui.click)) + yield* driver.ui.waitFor("The fixture was updated.", { timeout: 15_000 }) + yield* checkpoint(success) + }), + ) + }, +) diff --git a/packages/lab/catalog/scenarios/tools/question-lifecycle.ts b/packages/lab/catalog/scenarios/tools/question-lifecycle.ts new file mode 100644 index 00000000000..3187ee295d4 --- /dev/null +++ b/packages/lab/catalog/scenarios/tools/question-lifecycle.ts @@ -0,0 +1,144 @@ +import { Effect } from "effect" +import * as Llm from "opencode-drive/llm" +import { defineExecutableFlow } from "../../catalog/flow" +import { taxonomies } from "../../catalog/authored/taxonomies" + +const questions = [ + { + header: "Runtime", + question: "Which runtime should the catalog fixture use?", + options: [ + { label: "Bun", description: "Use the repository's configured runtime." }, + { label: "Node", description: "Use the Node.js compatibility runtime." }, + ], + }, + { + header: "Validation", + question: "Which validation should run?", + options: [ + { label: "Focused", description: "Run only the focused scenario tests." }, + { label: "Full", description: "Run the complete validation suite." }, + ], + }, +] as const + +export const questionLifecycleFlow = defineExecutableFlow( + taxonomies, + { + id: "question-lifecycle", + title: "Question lifecycle", + group: { id: "tool-use", label: "Tool use" }, + description: "Stream a question call, answer its form, review it, submit it, and deny a second call.", + }, + ({ state, program }) => { + const inputStreaming = state("question-input-streaming", { + screen: { + title: "Question input streaming", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["transcript", "tool-card", "status-indicator"], + surfaces: "inline", + patterns: "status", + features: ["tool", "question"], + states: "streaming", + }, + step: { title: "Question input streams" }, + }) + const awaiting = state("question-awaiting-form", { + screen: { + title: "Question awaiting form", + category: "session", + screenLabels: ["tool-execution", "question-response"], + uiElements: ["question-prompt", "button-group", "keyboard-hints"], + surfaces: "inline", + patterns: "form", + features: ["tool", "question"], + states: "pending", + }, + step: { title: "Question awaits an answer" }, + }) + const review = state("question-review", { + screen: { + title: "Question review", + category: "session", + screenLabels: ["tool-execution", "question-response"], + uiElements: ["question-prompt", "confirmation", "keyboard-hints"], + surfaces: "inline", + patterns: "form", + features: ["tool", "question"], + states: "confirmation", + }, + step: { title: "Answers are reviewed" }, + }) + const succeeded = state("question-succeeded", { + screen: { + title: "Question succeeded", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["transcript", "tool-card", "confirmation"], + surfaces: "inline", + patterns: "status", + features: ["tool", "question"], + states: "success", + }, + step: { title: "Answers are submitted" }, + }) + const denied = state("question-denied", { + screen: { + title: "Question denied", + category: "session", + screenLabels: ["tool-execution", "error-recovery"], + uiElements: ["transcript", "tool-card", "destructive-action"], + surfaces: "inline", + patterns: "status", + features: ["tool", "question"], + states: "error", + }, + step: { title: "Question is denied" }, + }) + + return program([inputStreaming, awaiting, review, succeeded, denied], ({ driver, checkpoint }) => + Effect.gen(function* () { + yield* driver.llm.queue( + Llm.toolCall( + { index: 0, id: "call_catalog_question", name: "question", input: { questions } }, + { delay: 100, chunkSize: 7 }, + ), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The catalog answers were submitted.")) + yield* driver.ui.submit("Ask me which runtime and validation mode to use.") + yield* Effect.sleep(450) + yield* checkpoint(inputStreaming) + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("Which runtime should", { timeout: 15_000 }) + yield* checkpoint(awaiting) + yield* driver.ui.enter() + yield* driver.ui.enter() + yield* driver.ui.waitFor("Review", { timeout: 5_000 }) + yield* checkpoint(review) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The catalog answers were submitted.", { timeout: 15_000 }) + yield* checkpoint(succeeded) + + yield* driver.llm.queue( + Llm.toolCall({ + index: 0, + id: "call_catalog_question_denied", + name: "question", + input: { questions: [questions[0]] }, + }), + Llm.finish("tool-calls"), + ) + yield* driver.ui.submit("Ask one more runtime question that I will dismiss.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("Which runtime should", { timeout: 15_000 }) + yield* driver.ui.press("escape") + yield* Effect.sleep(500) + yield* checkpoint(denied) + }), + ) + }, +) diff --git a/packages/lab/catalog/scenarios/tools/read-lifecycle.ts b/packages/lab/catalog/scenarios/tools/read-lifecycle.ts new file mode 100644 index 00000000000..c242e7f22dd --- /dev/null +++ b/packages/lab/catalog/scenarios/tools/read-lifecycle.ts @@ -0,0 +1,83 @@ +import { Effect } from "effect" +import * as Llm from "opencode-drive/llm" +import { defineExecutableFlow } from "../../catalog/flow" +import { taxonomies } from "../../catalog/authored/taxonomies" + +const screen = (title: string, states: "streaming" | "running" | "success" | "error" | "confirmation") => ({ + title, + category: "session" as const, + screenLabels: states === "error" ? (["tool-execution", "error-recovery"] as const) : (["tool-execution"] as const), + uiElements: + states === "confirmation" + ? (["inline-prompt", "approval-actions", "button-group", "keyboard-hints", "confirmation"] as const) + : (["transcript", "tool-card", "status-indicator"] as const), + surfaces: "inline" as const, + patterns: states === "confirmation" ? ("approval" as const) : ("status" as const), + features: ["tool", "read"] as const, + states, +}) + +export const readLifecycleFlow = defineExecutableFlow( + taxonomies, + { + id: "read-file-lifecycle", + title: "Read file lifecycle", + group: { id: "tool-use", label: "Tool use" }, + description: "Stream a read call, approve it, then observe success and denial.", + }, + ({ state, program }) => { + const input = state("read-input-streaming", { + screen: screen("Read input streaming", "streaming"), + step: { title: "Input streams" }, + }) + const permission = state("read-permission", { + screen: screen("Read permission", "confirmation"), + step: { title: "Permission is requested" }, + }) + const succeeded = state("read-succeeded", { + screen: screen("Read succeeded", "success"), + step: { title: "Read succeeds" }, + }) + const denied = state("read-denied", { screen: screen("Read denied", "error"), step: { title: "Read is denied" } }) + + return program([input, permission, succeeded, denied], ({ driver, checkpoint }) => + Effect.gen(function* () { + yield* driver.llm.queue( + Llm.toolCall( + { index: 0, id: "call_read_success", name: "read", input: { path: "fixture.txt" } }, + { delay: 100, chunkSize: 4 }, + ), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The fixture read succeeded.")) + yield* driver.ui.submit("Read the fixture file.") + yield* Effect.sleep(350) + yield* checkpoint(input) + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* checkpoint(permission) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The fixture read succeeded.", { timeout: 15_000 }) + yield* checkpoint(succeeded) + + yield* driver.llm.queue( + Llm.toolCall({ index: 0, id: "call_read_failure", name: "read", input: { path: "missing-fixture.txt" } }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The missing-file read failed as expected.")) + yield* driver.ui.submit("Now try to read a missing file.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The missing-file read failed as expected.", { timeout: 15_000 }) + yield* driver.llm.queue( + Llm.toolCall({ index: 0, id: "call_read_denied", name: "read", input: { path: "src/ledger.ts" } }), + Llm.finish("tool-calls"), + ) + yield* driver.ui.submit("Now read the ledger file.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.press("escape") + yield* driver.ui.waitFor("src/ledger.ts", { timeout: 15_000 }) + yield* checkpoint(denied) + }), + ) + }, +) diff --git a/packages/lab/catalog/scenarios/tools/search-lifecycle.ts b/packages/lab/catalog/scenarios/tools/search-lifecycle.ts new file mode 100644 index 00000000000..7de6309584b --- /dev/null +++ b/packages/lab/catalog/scenarios/tools/search-lifecycle.ts @@ -0,0 +1,147 @@ +import { Effect } from "effect" +import * as Llm from "opencode-drive/llm" +import { defineExecutableFlow } from "../../catalog/flow" +import { taxonomies } from "../../catalog/authored/taxonomies" + +const screen = (title: string, states: "streaming" | "running" | "success" | "empty" | "error") => ({ + title, + category: "session" as const, + screenLabels: states === "error" ? (["tool-execution", "error-recovery"] as const) : (["tool-execution"] as const), + uiElements: + states === "error" + ? (["transcript", "tool-card", "error-report"] as const) + : states === "empty" + ? (["transcript", "tool-card", "empty-state"] as const) + : (["transcript", "tool-card", "status-indicator"] as const), + surfaces: "inline" as const, + patterns: states === "error" ? ("error-report" as const) : ("status" as const), + features: ["tool", "search"] as const, + states, +}) + +export const searchLifecycleFlow = defineExecutableFlow( + taxonomies, + { + id: "search-lifecycle", + title: "Project search lifecycle", + group: { id: "tool-use", label: "Tool use" }, + description: + "Run built-in glob and grep tools through distinct streaming, grouped, success, empty, and failure states.", + }, + ({ state, program }) => { + const globSuccess = state("glob-success", { + screen: screen("Glob finds files", "success"), + step: { title: "Glob succeeds" }, + }) + const globEmpty = state("glob-empty", { + screen: screen("Glob finds no files", "empty"), + step: { title: "Glob is empty" }, + }) + const groupedExploration = state("grouped-exploration", { + screen: screen("Grouped project exploration", "running"), + step: { title: "Glob and grep run together" }, + }) + const grepSuccess = state("grep-success", { + screen: screen("Grep finds matches", "success"), + step: { title: "Grep succeeds" }, + }) + const grepEmpty = state("grep-empty", { + screen: screen("Grep finds no matches", "empty"), + step: { title: "Grep is empty" }, + }) + const grepFailure = state("grep-failure", { + screen: screen("Grep pattern fails", "error"), + step: { title: "Grep fails" }, + }) + + return program( + [globSuccess, globEmpty, groupedExploration, grepSuccess, grepEmpty, grepFailure], + ({ driver, checkpoint }) => + Effect.gen(function* () { + yield* driver.llm.queue( + Llm.toolCall( + { index: 0, id: "call_glob_success", name: "glob", input: { pattern: "src/**/*.ts" } }, + { delay: 100, chunkSize: 4 }, + ), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The first glob search is complete.")) + yield* driver.llm.queue( + Llm.toolCall({ index: 0, id: "call_glob_empty", name: "glob", input: { pattern: "missing/**/*.rs" } }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The empty glob search is complete.")) + yield* driver.llm.queue( + Llm.toolCall({ index: 0, id: "call_group_glob", name: "glob", input: { pattern: "**/*.ts" } }), + Llm.toolCall({ index: 1, id: "call_group_grep", name: "grep", input: { pattern: "credits", path: "src" } }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The grouped exploration is complete.")) + yield* driver.llm.queue( + Llm.toolCall({ + index: 0, + id: "call_grep_success", + name: "grep", + input: { pattern: "credits", path: "src" }, + }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The matching grep search is complete.")) + yield* driver.llm.queue( + Llm.toolCall({ + index: 0, + id: "call_grep_empty", + name: "grep", + input: { pattern: "DEADBEEF", path: "src" }, + }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The empty grep search is complete.")) + yield* driver.llm.queue( + Llm.toolCall({ index: 0, id: "call_grep_failure", name: "grep", input: { pattern: "[", path: "src" } }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The invalid grep search is complete.")) + + yield* driver.ui.submit("Find the TypeScript source files.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The first glob search is complete.", { timeout: 15_000 }) + yield* checkpoint(globSuccess) + + yield* driver.ui.submit("Find Rust files that do not exist.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The empty glob search is complete.", { timeout: 15_000 }) + yield* checkpoint(globEmpty) + + yield* driver.ui.submit("Explore TypeScript files and search them for credits together.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* Effect.sleep(500) + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The grouped exploration is complete.", { timeout: 15_000 }) + yield* checkpoint(groupedExploration) + + yield* driver.ui.submit("Search the source directory for credits.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The matching grep search is complete.", { timeout: 15_000 }) + yield* checkpoint(grepSuccess) + + yield* driver.ui.submit("Search the source directory for DEADBEEF.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The empty grep search is complete.", { timeout: 15_000 }) + yield* checkpoint(grepEmpty) + + yield* driver.ui.submit("Run an invalid regular expression search.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The invalid grep search is complete.", { timeout: 15_000 }) + yield* checkpoint(grepFailure) + }), + ) + }, +) diff --git a/packages/lab/catalog/scenarios/tools/shell-lifecycle.ts b/packages/lab/catalog/scenarios/tools/shell-lifecycle.ts new file mode 100644 index 00000000000..949c87711fd --- /dev/null +++ b/packages/lab/catalog/scenarios/tools/shell-lifecycle.ts @@ -0,0 +1,127 @@ +import { Effect } from "effect" +import * as Llm from "opencode-drive/llm" +import { defineExecutableFlow } from "../../catalog/flow" +import { taxonomies } from "../../catalog/authored/taxonomies" + +export const shellLifecycleFlow = defineExecutableFlow( + taxonomies, + { + id: "shell-lifecycle", + title: "Foreground shell lifecycle", + group: { id: "tool-use", label: "Tool use" }, + description: "Watch thinking and shell input stream before foreground commands succeed and fail.", + }, + ({ state, program }) => { + const thinkingStreaming = state("thinking-streaming", { + screen: { + title: "Thinking streaming", + category: "session", + screenLabels: ["shell-activity"], + uiElements: ["transcript", "status-indicator"], + surfaces: "inline", + patterns: "status", + features: ["thinking", "shell"], + states: "streaming", + }, + step: { title: "Thinking streams" }, + }) + const inputStreaming = state("shell-input-streaming", { + screen: { + title: "Shell input streaming", + category: "session", + screenLabels: ["tool-execution", "shell-activity"], + uiElements: ["transcript", "tool-card", "terminal-output", "status-indicator"], + surfaces: "inline", + patterns: "terminal", + features: ["tool", "shell"], + states: "streaming", + }, + step: { title: "Command input streams" }, + }) + const outputStreaming = state("shell-output-streaming", { + screen: { + title: "Shell output streaming", + category: "session", + screenLabels: ["tool-execution", "shell-activity"], + uiElements: ["transcript", "tool-card", "terminal-output", "status-indicator"], + surfaces: "inline", + patterns: "terminal", + features: ["tool", "shell"], + states: ["running", "streaming"], + }, + step: { title: "Command output streams" }, + }) + const succeeded = state("shell-execute-succeeded", { + screen: { + title: "Shell execution succeeded", + category: "session", + screenLabels: ["tool-execution", "shell-activity"], + uiElements: ["transcript", "tool-card", "terminal-output", "confirmation"], + surfaces: "inline", + patterns: "terminal", + features: ["tool", "shell"], + states: "success", + }, + step: { title: "Command succeeds" }, + }) + const failed = state("shell-execute-failed", { + screen: { + title: "Shell execution failed", + category: "session", + screenLabels: ["tool-execution", "shell-activity", "error-recovery"], + uiElements: ["transcript", "tool-card", "terminal-output", "error-report"], + surfaces: "inline", + patterns: ["terminal", "error-report"], + features: ["tool", "shell"], + states: "error", + }, + step: { title: "Command fails" }, + }) + + return program([thinkingStreaming, inputStreaming, outputStreaming, succeeded, failed], ({ driver, checkpoint }) => + Effect.gen(function* () { + yield* driver.llm.queue( + Llm.reasoning("I will inspect the foreground shell lifecycle before running the command.", { + delay: 70, + chunkSize: 7, + }), + Llm.toolCall( + { + index: 0, + id: "call_catalog_shell_success", + name: "shell", + input: { command: "printf catalog-shell-success" }, + }, + { delay: 90, chunkSize: 5 }, + ), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The successful shell command completed.")) + + yield* driver.ui.submit("Run one successful foreground shell command.") + yield* Effect.sleep(250) + yield* checkpoint(thinkingStreaming) + yield* driver.ui.waitFor("Writing command...", { timeout: 15_000 }) + yield* checkpoint(inputStreaming) + yield* driver.ui.waitFor("printf catalog-shell-success", { timeout: 15_000 }) + yield* checkpoint(outputStreaming) + yield* driver.ui.waitFor("The successful shell command completed.", { timeout: 15_000 }) + yield* checkpoint(succeeded) + + yield* driver.llm.queue( + Llm.toolCall({ + index: 0, + id: "call_catalog_shell_failure", + name: "shell", + input: { command: "catalog-shell-fail" }, + }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The shell lifecycle is complete.")) + yield* driver.ui.submit("Now run one failing foreground shell command.") + yield* driver.ui.waitFor("The shell lifecycle is complete.", { timeout: 15_000 }) + yield* checkpoint(failed) + }), + ) + }, +) diff --git a/packages/lab/catalog/scenarios/tools/web-lifecycle.ts b/packages/lab/catalog/scenarios/tools/web-lifecycle.ts new file mode 100644 index 00000000000..0b44b40087e --- /dev/null +++ b/packages/lab/catalog/scenarios/tools/web-lifecycle.ts @@ -0,0 +1,112 @@ +import { Effect } from "effect" +import * as Llm from "opencode-drive/llm" +import { defineExecutableFlow } from "../../catalog/flow" +import { taxonomies } from "../../catalog/authored/taxonomies" + +export const webLifecycleFlow = defineExecutableFlow( + taxonomies, + { + id: "web-lifecycle", + title: "Web tool lifecycle", + group: { id: "tool-use", label: "Tool use" }, + description: "Run the v2 WebFetch and WebSearch renderers with real tool calls.", + }, + ({ state, program }) => { + const webfetchStreaming = state("webfetch-streaming", { + screen: { + title: "WebFetch streaming", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["transcript", "tool-card", "status-indicator"], + surfaces: "inline", + patterns: "status", + features: ["tool", "web"], + states: "streaming", + }, + step: { title: "WebFetch input streams" }, + }) + const webfetchSuccess = state("webfetch-success", { + screen: { + title: "WebFetch succeeds", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["transcript", "tool-card", "confirmation"], + surfaces: "inline", + patterns: "status", + features: ["tool", "web"], + states: "success", + }, + step: { title: "WebFetch succeeds" }, + }) + const websearchRunning = state("websearch-running", { + screen: { + title: "WebSearch running", + category: "session", + screenLabels: ["tool-execution"], + uiElements: ["transcript", "tool-card", "status-indicator"], + surfaces: "inline", + patterns: "status", + features: ["tool", "web", "search"], + states: "running", + }, + step: { title: "WebSearch runs" }, + }) + const websearchFailure = state("websearch-failure", { + screen: { + title: "WebSearch fails", + category: "session", + screenLabels: ["tool-execution", "error-recovery"], + uiElements: ["transcript", "tool-card", "error-report"], + surfaces: "inline", + patterns: "error-report", + features: ["tool", "web", "search"], + states: "error", + }, + step: { title: "WebSearch reports provider failure" }, + }) + + return program([webfetchStreaming, webfetchSuccess, websearchRunning, websearchFailure], ({ driver, checkpoint }) => + Effect.gen(function* () { + yield* driver.llm.queue( + Llm.toolCall( + { + index: 0, + id: "call_webfetch_success", + name: "webfetch", + input: { url: "https://example.com", format: "text" }, + }, + { delay: 300, chunkSize: 1 }, + ), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("The web fetch is complete.")) + yield* driver.llm.queue( + Llm.toolCall( + { + index: 0, + id: "call_websearch_failure", + name: "websearch", + input: { query: "opencode terminal interface", numResults: 3 }, + }, + { delay: 300, chunkSize: 1 }, + ), + Llm.finish("tool-calls"), + ) + + yield* driver.ui.submit("Fetch the Example Domain.") + yield* driver.ui.waitFor("Fetching from the web...", { timeout: 30_000 }) + yield* checkpoint(webfetchStreaming) + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("The web fetch is complete.", { timeout: 30_000 }) + yield* checkpoint(webfetchSuccess) + + yield* driver.ui.submit("Search the web for the OpenCode terminal interface.") + yield* driver.ui.waitFor("Searching web...", { timeout: 30_000 }) + yield* checkpoint(websearchRunning) + yield* Effect.sleep(1_000) + yield* checkpoint(websearchFailure) + }), + ) + }, +) diff --git a/packages/lab/catalog/scripts/bench-capture-flow.ts b/packages/lab/catalog/scripts/bench-capture-flow.ts new file mode 100644 index 00000000000..e0d81257d4f --- /dev/null +++ b/packages/lab/catalog/scripts/bench-capture-flow.ts @@ -0,0 +1,51 @@ +const flow = process.argv[2] ?? "search-lifecycle" +const revision = process.argv[3] ?? "HEAD" +const opencode = process.argv[4] ?? new URL("../../../../", import.meta.url).pathname +const runs = 8 +const measured: Array<{ prepare: number; total: number }> = [] + +for (let index = 0; index < runs; index++) { + const child = Bun.spawn( + [ + process.execPath, + "./scripts/capture-opencode-drive.ts", + "--opencode", + opencode, + "--revision", + revision, + "--flow", + flow, + ], + { cwd: import.meta.dir + "/..", stdout: "pipe", stderr: "pipe" }, + ) + const [stdout, stderr, exit] = await Promise.all([ + new Response(child.stdout).text(), + new Response(child.stderr).text(), + child.exited, + ]) + if (exit !== 0) throw new Error(`Capture benchmark failed:\n${stdout}\n${stderr}`) + const prepare = metric(stdout, "capture_prepare_ms") + const total = metric(stdout, "capture_total_ms") + console.log(`${index === 0 ? "warmup" : `run ${index}`}: prepare=${prepare}ms total=${total}ms`) + if (index > 0) measured.push({ prepare, total }) +} + +const prepare = measured.map((run) => run.prepare) +const total = measured.map((run) => run.total) +console.log(`METRIC capture_flow_prepare_median_ms=${median(prepare)}`) +console.log(`METRIC capture_flow_total_median_ms=${median(total)}`) +console.log(`METRIC capture_flow_total_mad_ms=${median(total.map((value) => Math.abs(value - median(total))))}`) +console.log(`METRIC capture_flow_total_best_ms=${Math.min(...total)}`) +console.log(`METRIC capture_flow_total_worst_ms=${Math.max(...total)}`) + +function metric(output: string, name: string) { + const match = output.match(new RegExp(`^METRIC ${name}=(\\d+)$`, "m")) + if (!match?.[1]) throw new Error(`Missing ${name} in capture output`) + return Number(match[1]) +} + +function median(values: ReadonlyArray) { + const sorted = [...values].sort((left, right) => left - right) + const middle = Math.floor(sorted.length / 2) + return sorted.length % 2 === 0 ? Math.round((sorted[middle - 1]! + sorted[middle]!) / 2) : sorted[middle]! +} diff --git a/packages/lab/catalog/scripts/bench-capture-matrix.ts b/packages/lab/catalog/scripts/bench-capture-matrix.ts new file mode 100644 index 00000000000..acec51cf5b0 --- /dev/null +++ b/packages/lab/catalog/scripts/bench-capture-matrix.ts @@ -0,0 +1,25 @@ +const revision = process.argv[2] ?? "HEAD" +const opencode = process.argv[3] ?? new URL("../../../../", import.meta.url).pathname +const startedAt = performance.now() +const child = Bun.spawn( + [ + process.execPath, + "./scripts/capture-opencode-drive.ts", + "--opencode", + opencode, + "--revision", + revision, + "--theme", + "opencode", + "--theme", + "tokyonight", + "--theme", + "everforest", + "--jobs", + "3", + ], + { cwd: import.meta.dir + "/..", stdout: "inherit", stderr: "inherit" }, +) + +if ((await child.exited) !== 0) throw new Error("Capture matrix benchmark failed") +console.log(`METRIC capture_matrix_total_ms=${Math.round(performance.now() - startedAt)}`) diff --git a/packages/lab/catalog/scripts/capture-opencode-drive.ts b/packages/lab/catalog/scripts/capture-opencode-drive.ts new file mode 100644 index 00000000000..160e85356d8 --- /dev/null +++ b/packages/lab/catalog/scripts/capture-opencode-drive.ts @@ -0,0 +1,525 @@ +import { mkdir, rename, rm } from "node:fs/promises" +import { dirname, join } from "node:path" +import { fileURLToPath } from "node:url" +import { Effect } from "effect" +import { Llm, OpenCodeDriver } from "opencode-drive" +import { screens, type CaptureId } from "../catalog/authored/screens" +import type { ScreenCategory } from "../catalog/dsl" +import { executeFlow, type ExecutableScenario } from "../catalog/flow" +import { patchSuccessFlow } from "../scenarios/tools/patch-success" +import { executableScenarios } from "../scenarios" +import { catalogScenarioRuntime, catalogViewport } from "../scenarios/runtime" +import type { Variant as CaptureSet } from "../catalog/schema" +import { + captureSetId, + captureSetLabel, + captureMatrixManifest, + captureSource, + parseCaptureOptions, +} from "./capture-sets" + +type Capture = { + readonly id: CaptureId + readonly title: string + readonly category: ScreenCategory + readonly frame: { + readonly variantId: string + readonly src: string + readonly cols: number + readonly rows: number + } +} + +type Variant = { + readonly id: string + readonly label: string + readonly source: string + readonly revision: string + readonly ref: string + readonly committedAt: string + readonly path: string + readonly theme?: string +} + +const defaultOpenCode = fileURLToPath(new URL("../../../../", import.meta.url)) +const options = parseCaptureOptions(process.argv.slice(2), defaultOpenCode) +const processStartedAt = performance.now() +const stagingRoot = fileURLToPath(new URL(`../.tmp/capture-staging/${crypto.randomUUID()}/`, import.meta.url)) +const prepared = await prepareCaptureSets(options) +metric("capture_prepare_ms", processStartedAt) +const variants = prepared.variants +let captureSucceeded = false +const lifecycleScenarios = executableScenarios.filter((scenario) => scenario.id !== patchSuccessFlow.id) + +const captureVariant = (variant: Variant) => + Effect.gen(function* () { + if (options.flow !== undefined) { + const selected = executableScenarios.find((scenario) => scenario.id === options.flow) + if (!selected) { + const known = executableScenarios.map((scenario) => scenario.id).join(", ") + return yield* Effect.fail( + new Error(`Unknown executable flow ${JSON.stringify(options.flow)}. Known flows: ${known}`), + ) + } + return yield* captureScenarioProcess(variant, [selected], true) + } + + const queued = lifecycleScenarios.filter((scenario) => scenario.llmMode === "queue") + const served = lifecycleScenarios.filter((scenario) => scenario.llmMode === "serve") + const captures = yield* captureScenarioProcess(variant, [], false, true) + for (const scenario of queued) { + captures.push(...(yield* captureScenarioProcess(variant, [scenario]))) + } + for (const scenario of served) { + captures.push(...(yield* captureScenarioProcess(variant, [scenario]))) + } + return captures + }) + +function captureScenarioProcess( + variant: Variant, + scenarios: ReadonlyArray, + preview = false, + baseline = false, +) { + return OpenCodeDriver.use(catalogScenarioRuntime({ opencode: variant.path, theme: variant.theme }), (driver) => + Effect.gen(function* () { + const captures = baseline ? [...(yield* captureBaseline(driver, variant))] : [] + const shared = scenarios.filter((scenario) => scenario.clientIsolation === "shared") + if (shared.length > 0) { + captures.push(...(yield* captureScenarioClient(driver, variant, shared, preview))) + } + for (const scenario of scenarios.filter((candidate) => candidate.clientIsolation === "isolated")) { + captures.push(...(yield* captureScenarioClient(driver, variant, [scenario], preview))) + } + return captures + }), + ) +} + +function captureScenarioClient( + driver: OpenCodeDriver.Driver, + variant: Variant, + scenarios: ReadonlyArray, + preview: boolean, +) { + const clientName = `catalog-${scenarios[0]?.id ?? "empty"}-${scenarios.length}` + return Effect.acquireUseRelease( + driver.tuis.launch(clientName, { viewport: catalogViewport }), + (client) => + Effect.gen(function* () { + const captures: Array = [] + for (const scenario of scenarios) { + yield* openNewSession(client.ui) + yield* resetProjectFiles(driver) + const startedAt = performance.now() + console.error(`Capturing ${scenario.id}`) + captures.push(...(yield* captureScenario({ ...driver, ui: client.ui }, variant, scenario, preview))) + metric(`capture_scenario_${scenario.id}_ms`, startedAt) + } + return captures + }), + (client) => client.close(), + ) +} + +const openNewSession = Effect.fn("Catalog.openNewSession")(function* (ui: OpenCodeDriver.Driver["ui"]) { + yield* ui.press("p", { ctrl: true }) + yield* ui.waitFor("Commands", { timeout: 15_000 }) + yield* ui.type("New session") + yield* ui.waitFor("New session", { timeout: 15_000 }) + yield* ui.enter() + yield* ui.waitFor("Ask anything...", { timeout: 15_000 }) +}) + +const captureBaseline = (driver: OpenCodeDriver.Driver, variant: Variant) => + Effect.gen(function* () { + const captures: Capture[] = [] + const outputDirectory = join(stagingRoot, variant.id) + yield* Effect.promise(() => mkdir(outputDirectory, { recursive: true })) + + const capture = Effect.fn("Catalog.capture")(function* (id: CaptureId) { + const screen = screens[id] + const frame = yield* driver.ui.capture() + const src = `captures/${variant.id}/${id}.frame.json` + yield* Effect.promise(() => + Bun.write( + join(outputDirectory, `${id}.frame.json`), + `${JSON.stringify({ format: "opencode-terminal-frame-v1", ...frame })}\n`, + ), + ) + captures.push({ + id, + title: screen.title, + category: screen.category, + frame: { variantId: variant.id, src, cols: frame.cols, rows: frame.rows }, + }) + }) + + const close = Effect.fn("Catalog.closeDialog")(function* () { + yield* driver.ui.press("\u001b") + yield* Effect.sleep(150) + }) + + const openSlash = Effect.fn("Catalog.openSlash")(function* (slash: string, marker: string) { + yield* driver.ui.submit(slash) + yield* driver.ui.waitFor(marker) + }) + + yield* driver.ui.waitFor((state) => state.elements.length > 0) + yield* Effect.sleep(400) + yield* capture("home") + + yield* driver.ui.press("p", { ctrl: true }) + yield* driver.ui.waitFor("Commands") + yield* capture("command-palette") + yield* close() + + const dialogs = [ + ["/models", "Select model", "model-picker"], + ["/agents", "Select agent", "agent-picker"], + ["/connect", "Connect an integration", "integration-picker"], + ["/themes", "Themes", "theme-picker"], + ["/mcps", "MCP servers", "mcp-list"], + ["/status", "No MCP servers", "status"], + ["/debug", "Debug", "debug"], + ["/help", "Press ctrl+p", "help"], + ["/pair", "Pair", "pair"], + ["/sessions", "Sessions", "session-picker"], + ["/skills", "Skills", "skill-picker"], + ] as const + + for (const [slash, marker, id] of dialogs) { + yield* openSlash(slash, marker) + yield* capture(id) + yield* close() + } + + yield* executeFlow(patchSuccessFlow, { + driver, + capture: (state) => capture(state.id), + }) + + const sessionDialogs = [ + ["/rename", "Rename session", "session-rename"], + ["/fork", "Full session", "session-fork"], + ["/export", "Export as", "session-export"], + ] as const + + for (const [slash, marker, id] of sessionDialogs) { + yield* openSlash(slash, marker) + yield* capture(id) + yield* close() + } + + yield* driver.llm.queue( + Llm.toolCall({ + index: 0, + id: "call_question_capture", + name: "question", + input: { + questions: [ + { + question: "Which direction should the fixture take?", + header: "Fixture", + options: [ + { + label: "Keep it minimal (Recommended)", + description: "Small deterministic fixture", + }, + { + label: "Expand coverage", + description: "Add more scripted states", + }, + ], + }, + ], + }, + }), + Llm.finish("tool-calls"), + ) + yield* driver.llm.queue(Llm.text("Keeping the fixture minimal.")) + yield* driver.ui.submit("Ask me about the fixture direction.") + yield* driver.ui.waitFor("Permission required", { timeout: 15_000 }) + yield* driver.ui.enter() + yield* driver.ui.waitFor("Which direction should the fixture take?", { timeout: 15_000 }) + yield* capture("question-prompt") + yield* driver.ui.enter() + yield* driver.ui.waitFor("Keeping the fixture minimal.", { timeout: 15_000 }) + + yield* openSlash("/rename", "Rename session") + yield* driver.ui.type("Catalog capture session") + yield* driver.ui.enter() + yield* Effect.sleep(300) + + yield* openSlash("/sessions", "Sessions") + yield* driver.ui.waitFor("Catalog capture session") + yield* capture("session-picker-populated") + yield* close() + + yield* driver.ui.type("/copy") + yield* driver.ui.waitFor("Copy session transcript") + yield* driver.ui.enter() + yield* Effect.sleep(600) + yield* capture("toast-success") + yield* Effect.sleep(200) + + yield* driver.ui.submit("/share") + yield* driver.ui.waitFor("Sharing is not implemented for V2 sessions yet") + yield* capture("toast-error") + + yield* openSlash("/debug", "Debug") + yield* driver.ui.enter() + yield* driver.ui.waitFor("Debug info copied to clipboard") + yield* capture("toast-info") + yield* close() + + yield* openSlash("/diff", "Diff working tree") + yield* driver.ui.waitFor("No changes to show") + yield* capture("diff-viewer") + yield* close() + + return captures + }) + +function captureScenario( + driver: OpenCodeDriver.Driver, + variant: Variant, + scenario: ExecutableScenario, + preview = false, +) { + return Effect.gen(function* () { + const captures: Array = [] + yield* scenario.run({ + driver, + capture: (state) => + Effect.gen(function* () { + if (!isCaptureId(state.id)) { + return yield* Effect.fail(new Error(`Scenario ${scenario.id} references unknown screen ${state.id}`)) + } + const id = state.id + const screen = screens[id] + const frame = yield* driver.ui.capture() + const src = preview + ? `.tmp/capture-runs/${variant.id}/${id}.frame.json` + : `captures/${variant.id}/${id}.frame.json` + const output = preview + ? fileURLToPath(new URL(`../${src}`, import.meta.url)) + : join(stagingRoot, variant.id, `${id}.frame.json`) + yield* Effect.promise(async () => { + await mkdir(dirname(output), { recursive: true }) + await Bun.write(output, `${JSON.stringify({ format: "opencode-terminal-frame-v1", ...frame })}\n`) + }) + captures.push({ + id, + title: screen.title, + category: screen.category, + frame: { variantId: variant.id, src, cols: frame.cols, rows: frame.rows }, + }) + }), + }) + return captures + }) +} + +const resetProjectFiles = Effect.fn("Catalog.resetProjectFiles")(function* (driver: OpenCodeDriver.Driver) { + const files = join(driver.artifacts, "files") + yield* Effect.promise(() => + Promise.all([Bun.write(join(files, "fixture.txt"), "before\n"), rm(join(files, "patched.txt"), { force: true })]), + ) +}) + +function isCaptureId(value: string): value is CaptureId { + return value in screens +} + +try { + const captured = + options.workerOutput === undefined && variants.length > 1 && options.jobs > 1 + ? await captureVariantProcesses(options, variants) + : await Effect.runPromise(Effect.forEach(variants, captureVariant, { concurrency: 1 })) + const expectedIds = captured[0]?.map((capture) => capture.id) ?? [] + for (const [index, variantCaptures] of captured.entries()) { + const actualIds = variantCaptures.map((capture) => capture.id) + if (JSON.stringify(actualIds) !== JSON.stringify(expectedIds)) { + throw new Error(`Variant ${variants[index]?.id ?? index} captured a different ordered screen set`) + } + } + const captures = + captured[0]?.map((first) => ({ + id: first.id, + title: first.title, + category: first.category, + frames: captured.flatMap((variantCaptures) => + variantCaptures.filter((capture) => capture.id === first.id).map((capture) => capture.frame), + ) as [Capture["frame"], ...Array], + })) ?? [] + if (options.flow !== undefined) { + for (const capture of captures) { + for (const frame of capture.frames) console.log(frame.src) + } + } else if (options.workerOutput !== undefined) { + const [variant] = variants + if (!variant) throw new Error("Capture worker requires one variant") + const target = join(options.workerOutput, variant.id) + await rm(target, { recursive: true, force: true }) + await mkdir(options.workerOutput, { recursive: true }) + await rename(join(stagingRoot, variant.id), target) + await Bun.write( + join(options.workerOutput, `${variant.id}.json`), + `${JSON.stringify({ variant: (({ path: _, ...value }) => value)(variant), captures: captured[0] ?? [] })}\n`, + ) + } else { + for (const variant of variants) { + const target = fileURLToPath(new URL(`../public/captures/${variant.id}/`, import.meta.url)) + await rm(target, { recursive: true, force: true }) + await mkdir(dirname(target), { recursive: true }) + await rename(join(stagingRoot, variant.id), target) + } + const manifestFile = new URL("../public/drive-captures.json", import.meta.url) + const captureSets = variants.map(({ path: _, ...variant }) => variant satisfies CaptureSet) + const manifest = captureMatrixManifest(captureSets, captures) + await Bun.write(manifestFile, `${JSON.stringify(manifest, undefined, 2)}\n`) + } + captureSucceeded = true +} finally { + metric("capture_total_ms", processStartedAt) + if (captureSucceeded) await rm(stagingRoot, { recursive: true, force: true }) + else console.error(`Retained staged capture frames: ${stagingRoot}`) + await prepared.cleanup(captureSucceeded) +} + +async function captureVariantProcesses( + captureOptions: ReturnType, + planned: ReadonlyArray, +): Promise>> { + const output = fileURLToPath(new URL(`../.tmp/capture-workers/${crypto.randomUUID()}/`, import.meta.url)) + await mkdir(output, { recursive: true }) + let next = 0 + const results = Array.from | undefined>({ length: planned.length }) + + await Promise.all( + Array.from({ length: Math.min(captureOptions.jobs, planned.length) }, async () => { + while (true) { + const index = next++ + const variant = planned[index] + if (!variant) return + const args = [ + process.execPath, + fileURLToPath(import.meta.url), + "--opencode", + captureOptions.opencode, + "--revision", + variant.revision, + "--theme", + variant.theme ?? "default", + "--jobs", + "1", + "--worker-output", + output, + ] + const child = Bun.spawn(args, { + cwd: fileURLToPath(new URL("..", import.meta.url)), + stdout: "inherit", + stderr: "inherit", + }) + if ((await child.exited) !== 0) throw new Error(`Capture worker ${variant.id} failed`) + const result = (await Bun.file(join(output, `${variant.id}.json`)).json()) as { captures: Array } + results[index] = result.captures + } + }), + ) + + for (const variant of planned) { + const target = join(stagingRoot, variant.id) + await mkdir(dirname(target), { recursive: true }) + await rename(join(output, variant.id), target) + } + await rm(output, { recursive: true, force: true }) + return results.map((result, index) => { + if (!result) throw new Error(`Capture worker ${planned[index]?.id ?? index} produced no result`) + return result + }) +} + +async function prepareCaptureSets(options: ReturnType) { + const worktrees: Array = [] + const variants: Array = [] + const revisions = new Map() + + try { + for (const ref of options.revisions) { + const revision = await git(options.opencode, "rev-parse", `${ref}^{commit}`) + if (revisions.has(revision)) continue + const committedAt = await git(options.opencode, "show", "-s", "--format=%cI", revision) + if (ref === "HEAD") { + revisions.set(revision, { ref, committedAt, path: options.opencode }) + continue + } + const path = fileURLToPath(new URL(`../.tmp/capture-worktrees/${revision}/`, import.meta.url)) + const preparedRevision = await preparedWorktreeRevision(path) + if (options.fresh && preparedRevision !== undefined) { + await command(["git", "worktree", "remove", "--force", path], options.opencode).catch(() => + rm(path, { recursive: true, force: true }), + ) + } + if (options.fresh || preparedRevision !== revision) { + if (preparedRevision !== undefined) { + await command(["git", "worktree", "remove", "--force", path], options.opencode).catch(() => + rm(path, { recursive: true, force: true }), + ) + } + await mkdir(dirname(path), { recursive: true }) + await command(["git", "worktree", "add", "--detach", path, revision], options.opencode) + // Bun can reuse another Git worktree's install state without creating local links. + await command(["bun", "install", "--frozen-lockfile", "--force"], path) + } + worktrees.push(path) + revisions.set(revision, { ref, committedAt, path }) + } + + for (const [revision, preparedRevision] of revisions) { + for (const theme of options.themes) { + variants.push({ + id: captureSetId(revision, theme, revisions.size > 1), + label: captureSetLabel(revision, theme), + source: captureSource(options.opencode), + revision, + ref: preparedRevision.ref, + committedAt: preparedRevision.committedAt, + path: preparedRevision.path, + ...(theme === undefined ? {} : { theme }), + }) + } + } + } catch (error) { + await cleanup() + throw error + } + + return { variants, cleanup } + + async function cleanup(_succeeded = false) { + for (const path of worktrees) console.error(`Prepared capture worktree: ${path}`) + } +} + +async function preparedWorktreeRevision(path: string) { + if (!(await Bun.file(join(path, ".git")).exists())) return undefined + return git(path, "rev-parse", "HEAD").catch(() => undefined) +} + +function metric(name: string, startedAt: number) { + console.log(`METRIC ${name}=${Math.round(performance.now() - startedAt)}`) +} + +async function git(cwd: string, ...args: ReadonlyArray): Promise { + return (await command(["git", ...args], cwd)).trim() +} + +async function command(argv: ReadonlyArray, cwd: string): Promise { + const process = Bun.spawn([...argv], { cwd, stdout: "pipe", stderr: "inherit" }) + const output = await new Response(process.stdout).text() + if ((await process.exited) !== 0) throw new Error(`${argv.join(" ")} failed`) + return output +} diff --git a/packages/lab/catalog/scripts/capture-sets.ts b/packages/lab/catalog/scripts/capture-sets.ts new file mode 100644 index 00000000000..5bc848434da --- /dev/null +++ b/packages/lab/catalog/scripts/capture-sets.ts @@ -0,0 +1,90 @@ +import { basename, resolve } from "node:path" +import type { DriveCapture, DriveManifest, Variant } from "../catalog/schema" + +export interface CaptureOptions { + readonly opencode: string + readonly revisions: ReadonlyArray + readonly themes: ReadonlyArray + readonly flow: string | undefined + readonly fresh: boolean + readonly jobs: number + readonly workerOutput: string | undefined +} + +export function parseCaptureOptions(args: ReadonlyArray, defaultOpenCode: string): CaptureOptions { + let opencode = defaultOpenCode + const revisions: Array = [] + const themes: Array = [] + let flow: string | undefined + let fresh = false + let jobs = 3 + let workerOutput: string | undefined + + for (let index = 0; index < args.length; index++) { + const argument = args[index] + if (argument === "--fresh") { + fresh = true + continue + } + const value = args[++index] + if (!value) throw new Error(`${argument} requires a value`) + if (argument === "--opencode") opencode = value + else if (argument === "--revision") revisions.push(value) + else if (argument === "--theme") themes.push(value === "default" ? undefined : value) + else if (argument === "--flow") flow = value + else if (argument === "--jobs") jobs = Number(value) + else if (argument === "--worker-output") workerOutput = resolve(value) + else throw new Error(`Unknown capture argument: ${argument}`) + } + + if (!Number.isInteger(jobs) || jobs < 1) throw new Error("--jobs must be a positive integer") + + return { + opencode: resolve(opencode), + revisions: revisions.length === 0 ? ["origin/v2"] : revisions, + themes: themes.length === 0 ? [undefined] : themes, + flow, + fresh, + jobs, + workerOutput, + } +} + +export function captureSetId(revision: string, theme: string | undefined, includeRevision = false): string { + const revisionId = revision.slice(0, 12).toLowerCase() + if (theme === undefined) return revisionId + return includeRevision ? `${revisionId}-${slug(theme)}` : slug(theme) +} + +export function captureSetLabel(revision: string, theme: string | undefined): string { + if (theme === undefined) return revision.slice(0, 7) + if (theme === "opencode") return "Opencode" + if (theme === "tokyonight") return "Tokyo Night" + if (theme === "everforest") return "Everforest" + return theme +} + +export function captureMatrixManifest( + variants: ReadonlyArray, + captures: ReadonlyArray, +): DriveManifest { + return { + format: "opencode-terminal-frame-captures-v1", + generatedBy: "scripts/capture-opencode-drive.ts", + variants: variants as [Variant, ...Array], + captures, + } +} + +export function captureSource(path: string): string { + return basename(resolve(path)) +} + +function slug(value: string): string { + const result = value + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-|-$/g, "") + if (result === "") throw new Error(`Theme ${JSON.stringify(value)} cannot form a set ID`) + return result +} diff --git a/packages/lab/catalog/scripts/generate-catalog.ts b/packages/lab/catalog/scripts/generate-catalog.ts new file mode 100644 index 00000000000..294fcd82470 --- /dev/null +++ b/packages/lab/catalog/scripts/generate-catalog.ts @@ -0,0 +1,73 @@ +import { Effect, Schema } from "effect" +import { compileCatalog } from "../catalog/authoring" +import { definition } from "../catalog/authored" +import { CatalogBoundaryError, DriveManifest, FrameArtifact, type Frame } from "../catalog/schema" + +const manifestFile = new URL("../public/drive-captures.json", import.meta.url) +const catalogFile = new URL("../public/catalog.json", import.meta.url) + +const readManifest = Effect.fn("Catalog.readManifest")(function* () { + const json = yield* Effect.tryPromise({ + try: () => Bun.file(manifestFile).text(), + catch: (cause) => new CatalogBoundaryError({ boundary: "drive-captures.json", cause }), + }) + return yield* Schema.decodeUnknownEffect(Schema.fromJsonString(DriveManifest), { + errors: "all", + onExcessProperty: "error", + })(json).pipe(Effect.mapError((cause) => new CatalogBoundaryError({ boundary: "drive-captures.json", cause }))) +}) + +const validateCapture = Effect.fn("Catalog.validateCapture")(function* (frame: Frame) { + const json = yield* Effect.tryPromise({ + try: async () => { + const file = Bun.file(new URL(`../public/${frame.src}`, import.meta.url)) + if (!(await file.exists())) throw new Error(`Missing terminal frame ${frame.src}`) + return file.text() + }, + catch: (cause) => new CatalogBoundaryError({ boundary: frame.src, cause }), + }) + const artifact = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(FrameArtifact), { + errors: "all", + onExcessProperty: "error", + })(json).pipe(Effect.mapError((cause) => new CatalogBoundaryError({ boundary: frame.src, cause }))) + if (artifact.cols !== frame.cols || artifact.rows !== frame.rows) { + return yield* new CatalogBoundaryError({ + boundary: frame.src, + cause: new Error(`Terminal frame is ${artifact.cols}x${artifact.rows}; expected ${frame.cols}x${frame.rows}`), + }) + } + if (artifact.lines.length !== artifact.rows) { + return yield* new CatalogBoundaryError({ + boundary: frame.src, + cause: new Error(`Terminal frame has ${artifact.lines.length} lines; expected ${artifact.rows}`), + }) + } + for (const [row, line] of artifact.lines.entries()) { + const width = line.spans.reduce((total, span) => total + span.width, 0) + if (width !== artifact.cols) { + return yield* new CatalogBoundaryError({ + boundary: frame.src, + cause: new Error(`Terminal frame row ${row} is ${width} cells wide; expected ${artifact.cols}`), + }) + } + } +}) + +const program = Effect.gen(function* () { + const manifest = yield* readManifest() + yield* Effect.forEach( + manifest.captures.flatMap((capture) => capture.frames), + validateCapture, + { + concurrency: "unbounded", + discard: true, + }, + ) + const catalog = yield* compileCatalog(definition, manifest) + yield* Effect.tryPromise({ + try: () => Bun.write(catalogFile, `${JSON.stringify(catalog, undefined, 2)}\n`), + catch: (cause) => new CatalogBoundaryError({ boundary: "catalog.json", cause }), + }) +}) + +await Effect.runPromise(program) diff --git a/packages/lab/catalog/scripts/reproduce-state.ts b/packages/lab/catalog/scripts/reproduce-state.ts new file mode 100644 index 00000000000..6bc88910309 --- /dev/null +++ b/packages/lab/catalog/scripts/reproduce-state.ts @@ -0,0 +1,52 @@ +import { mkdir } from "node:fs/promises" +import { dirname, resolve } from "node:path" +import { fileURLToPath } from "node:url" +import { Effect } from "effect" +import { OpenCodeDriver } from "opencode-drive" +import { executableStates } from "../scenarios" +import { catalogScenarioRuntime } from "../scenarios/runtime" + +const defaultOpenCode = fileURLToPath(new URL("../../../../", import.meta.url)) +const options = parseArgs(process.argv.slice(2)) +const selected = executableStates.find((entry) => entry.address === options.address) + +if (!selected) { + const known = executableStates.map((entry) => entry.address) + throw new Error(`Unknown catalog state ${JSON.stringify(options.address)}. Known states:\n${known.join("\n")}`) +} + +await Effect.runPromise( + OpenCodeDriver.use(catalogScenarioRuntime({ opencode: options.opencode, theme: options.theme }), (driver) => + selected.run(driver, () => + Effect.gen(function* () { + const frame = yield* driver.ui.capture() + yield* Effect.promise(() => mkdir(dirname(options.output), { recursive: true })) + yield* Effect.promise(() => + Bun.write(options.output, `${JSON.stringify({ format: "opencode-terminal-frame-v1", ...frame })}\n`), + ) + }), + ), + ), +) + +console.log(options.output) + +function parseArgs(args: ReadonlyArray) { + const address = args[0] + if (!address || address.startsWith("--")) { + throw new Error("Usage: reproduce-state [--opencode path] [--output path] [--theme name]") + } + let opencode = defaultOpenCode + let output = resolve(`.tmp/reproductions/${address.replace("/", "--")}.frame.json`) + let theme: string | undefined + for (let index = 1; index < args.length; index++) { + const flag = args[index] + const value = args[++index] + if (!value) throw new Error(`${flag} requires a value`) + if (flag === "--opencode") opencode = resolve(value) + else if (flag === "--output") output = resolve(value) + else if (flag === "--theme") theme = value + else throw new Error(`Unknown argument ${flag}`) + } + return { address, opencode, output, theme } +} diff --git a/packages/lab/catalog/server.ts b/packages/lab/catalog/server.ts new file mode 100644 index 00000000000..78f11c73d81 --- /dev/null +++ b/packages/lab/catalog/server.ts @@ -0,0 +1,51 @@ +import index from "./src/index.html" + +const publicDirectory = new URL("./public/", import.meta.url) +const port = Number(process.env.PORT ?? "4187") + +const contentTypes = new Map([ + [".css", "text/css; charset=utf-8"], + [".js", "text/javascript; charset=utf-8"], + [".json", "application/json; charset=utf-8"], + [".svg", "image/svg+xml"], + [".png", "image/png"], + [".jpg", "image/jpeg"], +]) + +const server = Bun.serve({ + port, + development: process.env.NODE_ENV === "production" ? false : { hmr: true, console: true }, + routes: { + "/": index, + }, + async fetch(request) { + const url = new URL(request.url) + const path = normalizePath(url.pathname) + if (!path) return new Response("Not found", { status: 404 }) + + const file = Bun.file(new URL(path, publicDirectory)) + if (!(await file.exists())) return new Response("Not found", { status: 404 }) + + return new Response(file, { + headers: { + "cache-control": "no-store", + "content-type": contentType(path), + }, + }) + }, +}) + +console.log(`OpenCode terminal catalog: http://localhost:${server.port}`) + +function normalizePath(pathname: string) { + const decoded = decodeURIComponent(pathname) + const path = decoded.replace(/^\/+/, "") + if (path === "" || path.includes("..") || path.includes("\\")) return undefined + return path +} + +function contentType(path: string) { + const dot = path.lastIndexOf(".") + const extension = dot === -1 ? "" : path.slice(dot) + return contentTypes.get(extension) ?? "application/octet-stream" +} diff --git a/packages/lab/catalog/src/App.tsx b/packages/lab/catalog/src/App.tsx new file mode 100644 index 00000000000..407487711f8 --- /dev/null +++ b/packages/lab/catalog/src/App.tsx @@ -0,0 +1,530 @@ +import { useEffect, useEffectEvent, useMemo, useReducer, useRef, useState } from "react" +import type { BrowseMode, Catalog, Facet, FacetSelections, Taxonomy } from "./catalog" +import { buildFacetIndex, emptyFacetSelections, facetValues, filterFlows, filterScreens, frameFor } from "./catalog" +import { CommandPalette } from "./components/CommandPalette" +import { ContactSheet } from "./components/ContactSheet" +import { FilterBar } from "./components/FilterBar" +import { FlowBrowser } from "./components/FlowBrowser" +import { Header } from "./components/Header" +import { MatrixNavigation } from "./components/MatrixNavigation" +import { Viewer } from "./components/Viewer" +import { preloadFrame } from "./components/TerminalFrame" +import { catalogBrowseUrl, catalogDeepLink, catalogRootUrl, readCatalogLocation } from "./deep-link" + +interface AppProps { + readonly catalog: Catalog +} + +interface UiState { + readonly mode: BrowseMode + readonly query: string + readonly screenLabels: ReadonlyArray + readonly uiElements: ReadonlyArray + readonly facets: FacetSelections + readonly activeFlowId: string | undefined + readonly selectedScreenId: string | undefined + readonly viewerOpen: boolean + readonly paletteOpen: boolean + readonly gridFocusTick: number +} + +type UiAction = + | { readonly type: "set-mode"; readonly mode: BrowseMode } + | { readonly type: "search"; readonly query: string } + | { readonly type: "toggle-taxonomy"; readonly taxonomy: Taxonomy; readonly value: string } + | { readonly type: "clear-taxonomy"; readonly taxonomy: Taxonomy } + | { readonly type: "toggle-facet"; readonly facet: Facet; readonly value: string } + | { readonly type: "clear-facet"; readonly facet: Facet } + | { readonly type: "clear-facets" } + | { readonly type: "reset-view" } + | { readonly type: "clear-search" } + | { readonly type: "select-flow"; readonly id: string } + | { readonly type: "select-screen"; readonly id: string } + | { readonly type: "navigate"; readonly id: string } + | { readonly type: "open-viewer"; readonly id: string } + | { readonly type: "close-viewer" } + | { readonly type: "jump-to-screen"; readonly id: string } + | { readonly type: "jump-to-flow"; readonly id: string } + | { readonly type: "open-palette" } + | { readonly type: "close-palette" } + | { readonly type: "toggle-palette" } + | { + readonly type: "restore-location" + readonly screenId?: string + readonly flowId?: string + readonly mode: BrowseMode + readonly query: string + readonly screenLabels: ReadonlyArray + readonly uiElements: ReadonlyArray + readonly facets: FacetSelections + } + +function toggle(values: ReadonlyArray, value: string): ReadonlyArray { + return values.includes(value) ? values.filter((candidate) => candidate !== value) : [...values, value] +} + +function uiReducer(state: UiState, action: UiAction): UiState { + switch (action.type) { + case "set-mode": + // Filters and query survive tab switches, matching Mobbin's browse behavior. + return { + ...state, + mode: action.mode, + viewerOpen: false, + selectedScreenId: undefined, + gridFocusTick: state.gridFocusTick + 1, + } + case "search": + return { ...state, query: action.query } + case "toggle-taxonomy": { + // Palette stays open so stacked filter selections read as additive. + const key = action.taxonomy === "screen" ? "screenLabels" : "uiElements" + return { + ...state, + mode: action.taxonomy === "screen" ? "screens" : "ui-elements", + [key]: toggle(state[key], action.value), + viewerOpen: false, + selectedScreenId: undefined, + gridFocusTick: state.gridFocusTick + 1, + } + } + case "clear-taxonomy": { + const key = action.taxonomy === "screen" ? "screenLabels" : "uiElements" + return { ...state, [key]: [], selectedScreenId: undefined, gridFocusTick: state.gridFocusTick + 1 } + } + case "toggle-facet": + return { + ...state, + facets: { ...state.facets, [action.facet]: toggle(state.facets[action.facet], action.value) }, + viewerOpen: false, + selectedScreenId: undefined, + gridFocusTick: state.gridFocusTick + 1, + } + case "clear-facet": + return { + ...state, + facets: { ...state.facets, [action.facet]: [] }, + selectedScreenId: undefined, + gridFocusTick: state.gridFocusTick + 1, + } + case "clear-facets": + return { + ...state, + facets: emptyFacetSelections, + selectedScreenId: undefined, + gridFocusTick: state.gridFocusTick + 1, + } + case "reset-view": + return { + ...state, + query: "", + screenLabels: [], + uiElements: [], + facets: emptyFacetSelections, + selectedScreenId: undefined, + gridFocusTick: state.gridFocusTick + 1, + } + case "clear-search": + return { ...state, query: "", gridFocusTick: state.gridFocusTick + 1 } + case "select-flow": + return { ...state, activeFlowId: action.id } + case "select-screen": + return { ...state, selectedScreenId: action.id, gridFocusTick: state.gridFocusTick + 1 } + case "navigate": + return { ...state, selectedScreenId: action.id } + case "open-viewer": + return { ...state, selectedScreenId: action.id, viewerOpen: true } + case "close-viewer": + return { ...state, viewerOpen: false, gridFocusTick: state.gridFocusTick + 1 } + case "jump-to-screen": + return { + ...state, + mode: "screens", + query: "", + paletteOpen: false, + selectedScreenId: action.id, + viewerOpen: true, + } + case "jump-to-flow": + return { + ...state, + mode: "flows", + query: "", + activeFlowId: action.id, + selectedScreenId: undefined, + viewerOpen: false, + paletteOpen: false, + } + case "open-palette": + return { ...state, paletteOpen: true } + case "close-palette": + return { + ...state, + paletteOpen: false, + gridFocusTick: state.viewerOpen ? state.gridFocusTick : state.gridFocusTick + 1, + } + case "toggle-palette": + return state.paletteOpen ? uiReducer(state, { type: "close-palette" }) : { ...state, paletteOpen: true } + case "restore-location": + return { + ...state, + mode: action.flowId ? "flows" : action.mode, + query: action.query, + screenLabels: action.screenLabels, + uiElements: action.uiElements, + facets: action.facets, + activeFlowId: action.flowId ?? state.activeFlowId, + selectedScreenId: action.screenId, + viewerOpen: action.screenId !== undefined, + } + } +} + +export function App({ catalog }: AppProps) { + const initialLocation = readCatalogLocation(new URL(window.location.href)) + const initialScreen = catalog.screens.some((screen) => screen.id === initialLocation.screenId) + ? initialLocation.screenId + : undefined + const initialFlow = catalog.flows.some((flow) => flow.id === initialLocation.flowId) + ? initialLocation.flowId + : undefined + const initialMode = initialFlow + ? "flows" + : initialLocation.mode === "ui-elements" || initialLocation.mode === "flows" + ? initialLocation.mode + : "screens" + const [ui, dispatch] = useReducer(uiReducer, { + mode: initialMode, + query: initialLocation.query, + screenLabels: initialLocation.screenLabels, + uiElements: initialLocation.uiElements, + facets: { + surface: initialLocation.surfaces, + pattern: initialLocation.patterns, + feature: initialLocation.features, + state: initialLocation.states, + }, + activeFlowId: initialFlow ?? catalog.flows[0]?.id, + selectedScreenId: initialScreen ?? catalog.screens[0]?.id, + viewerOpen: initialScreen !== undefined, + paletteOpen: false, + gridFocusTick: 0, + }) + const [variantIndex, setVariantIndex] = useState(() => { + const index = catalog.variants.findIndex((variant) => variant.id === initialLocation.variantId) + if (index >= 0) return index + const opencode = catalog.variants.findIndex((variant) => variant.id === "opencode") + if (opencode >= 0) return opencode + const coverage = catalog.variants.map( + (variant) => catalog.screens.filter((screen) => frameFor(screen, variant.id) !== undefined).length, + ) + return coverage.indexOf(Math.max(...coverage)) + }) + const searchRef = useRef(null) + const activeVariant = catalog.variants[variantIndex] ?? catalog.variants[0] + + const deepLinkFor = (screenId: string, flowId?: string) => + catalogDeepLink(screenId, { flowId, variantId: activeVariant.id }) + + const openViewer = (screenId: string, flowId?: string) => { + window.history.pushState(null, "", deepLinkFor(screenId, flowId)) + dispatch({ type: "open-viewer", id: screenId }) + } + const availableScreens = useMemo( + () => catalog.screens.filter((screen) => frameFor(screen, activeVariant.id) !== undefined), + [catalog.screens, activeVariant.id], + ) + + const facetIndex = useMemo(() => buildFacetIndex(catalog.screens), [catalog.screens]) + const screens = useMemo( + () => + filterScreens(availableScreens, ui.query, ui.mode, { + screenLabels: ui.screenLabels, + uiElements: ui.uiElements, + facets: ui.facets, + }), + [availableScreens, ui.query, ui.mode, ui.screenLabels, ui.uiElements, ui.facets], + ) + const flows = useMemo(() => filterFlows(catalog.flows, ui.query), [catalog.flows, ui.query]) + const activeFlow = flows.find((flow) => flow.id === ui.activeFlowId) ?? flows[0] + const viewerScreens = useMemo( + () => + ui.mode === "flows" && activeFlow + ? activeFlow.steps.flatMap((step) => { + const screen = availableScreens.find((candidate) => candidate.id === step.screenId) + return screen ? [screen] : [] + }) + : screens, + [activeFlow, availableScreens, screens, ui.mode], + ) + const selectedId = viewerScreens.some((screen) => screen.id === ui.selectedScreenId) + ? ui.selectedScreenId + : viewerScreens[0]?.id + const selectedScreen = availableScreens.find((screen) => screen.id === selectedId) + const taxonomy = ui.mode === "screens" ? catalog.screenTaxonomy : catalog.uiElementTaxonomy + const taxonomyValues = ui.mode === "screens" ? ui.screenLabels : ui.uiElements + const taxonomyCounts = useMemo(() => { + const counts = new Map() + for (const screen of availableScreens) { + const values = ui.mode === "screens" ? screen.screenLabels : screen.uiElements + for (const value of values) counts.set(value, (counts.get(value) ?? 0) + 1) + } + return counts + }, [availableScreens, ui.mode]) + const facetCounts = useMemo(() => { + const counts = new Map() + for (const screen of availableScreens) { + for (const facet of ["surface", "pattern", "feature", "state"] as ReadonlyArray) { + for (const value of facetValues(screen, facet)) { + counts.set(`${facet}:${value}`, (counts.get(`${facet}:${value}`) ?? 0) + 1) + } + } + } + return counts + }, [availableScreens]) + + const navigateViewer = (direction: 1 | -1) => { + if (viewerScreens.length === 0) return + const current = viewerScreens.findIndex((screen) => screen.id === selectedId) + const next = viewerScreens[(current + direction + viewerScreens.length) % viewerScreens.length] + if (next) { + window.history.replaceState(null, "", deepLinkFor(next.id, ui.mode === "flows" ? activeFlow?.id : undefined)) + dispatch({ type: "navigate", id: next.id }) + } + } + + const navigateVariant = (direction: 1 | -1) => { + setVariantIndex((current) => (current + direction + catalog.variants.length) % catalog.variants.length) + } + + const handleWindowKeyDown = useEffectEvent((event: KeyboardEvent) => { + if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k") { + event.preventDefault() + dispatch({ type: "toggle-palette" }) + return + } + if (ui.paletteOpen || ui.viewerOpen) return + const target = event.target + const editing = + target instanceof HTMLInputElement || + target instanceof HTMLTextAreaElement || + (target instanceof HTMLElement && target.isContentEditable) + if (editing) return + if (event.shiftKey && (event.key === "ArrowUp" || event.key === "ArrowDown")) { + event.preventDefault() + navigateVariant(event.key === "ArrowUp" ? -1 : 1) + return + } + if (event.key === "/") { + event.preventDefault() + searchRef.current?.focus() + return + } + const hasFilters = taxonomyValues.length > 0 || Object.values(ui.facets).some((values) => values.length > 0) + if (event.key === "Escape" && (ui.query !== "" || hasFilters)) { + event.preventDefault() + dispatch({ type: "reset-view" }) + } + }) + + useEffect(() => { + const listener = (event: KeyboardEvent) => handleWindowKeyDown(event) + window.addEventListener("keydown", listener) + return () => window.removeEventListener("keydown", listener) + }, []) + + useEffect(() => { + window.history.replaceState( + null, + "", + catalogBrowseUrl({ + variantId: activeVariant.id, + mode: ui.mode, + query: ui.query, + screenLabels: ui.screenLabels, + uiElements: ui.uiElements, + surfaces: ui.facets.surface, + patterns: ui.facets.pattern, + features: ui.facets.feature, + states: ui.facets.state, + }), + ) + }, [activeVariant.id, ui.facets, ui.mode, ui.query, ui.screenLabels, ui.uiElements]) + + useEffect(() => { + if (!ui.viewerOpen || !selectedScreen) return + window.history.replaceState( + null, + "", + catalogDeepLink(selectedScreen.id, { + flowId: ui.mode === "flows" ? activeFlow?.id : undefined, + variantId: activeVariant.id, + }), + ) + }, [activeVariant.id, activeFlow?.id, selectedScreen, ui.mode, ui.viewerOpen]) + + useEffect(() => { + if (!ui.viewerOpen || selectedId === undefined || viewerScreens.length < 2) return + const current = viewerScreens.findIndex((screen) => screen.id === selectedId) + for (const offset of [-1, 1]) { + const screen = viewerScreens[(current + offset + viewerScreens.length) % viewerScreens.length] + const frame = screen && frameFor(screen, activeVariant.id) + if (frame) void preloadFrame(frame) + } + }, [activeVariant.id, selectedId, ui.viewerOpen, viewerScreens]) + + useEffect(() => { + const restore = () => { + const location = readCatalogLocation(new URL(window.location.href)) + const screenId = catalog.screens.some((screen) => screen.id === location.screenId) ? location.screenId : undefined + const flowId = catalog.flows.some((flow) => flow.id === location.flowId) ? location.flowId : undefined + const nextVariant = catalog.variants.findIndex((variant) => variant.id === location.variantId) + if (nextVariant >= 0) setVariantIndex(nextVariant) + const mode = flowId + ? "flows" + : location.mode === "ui-elements" || location.mode === "flows" + ? location.mode + : "screens" + dispatch({ + type: "restore-location", + screenId, + flowId, + mode, + query: location.query, + screenLabels: location.screenLabels, + uiElements: location.uiElements, + facets: { + surface: location.surfaces, + pattern: location.patterns, + feature: location.features, + state: location.states, + }, + }) + } + window.addEventListener("popstate", restore) + return () => window.removeEventListener("popstate", restore) + }, [catalog]) + + const taxonomyType: Taxonomy = ui.mode === "ui-elements" ? "ui-element" : "screen" + + return ( + <> +
+
dispatch({ type: "set-mode", mode })} + onQuery={(query) => dispatch({ type: "search", query })} + onClearSearch={() => dispatch({ type: "clear-search" })} + onOpenPalette={() => dispatch({ type: "open-palette" })} + onVariantSelect={(id) => + setVariantIndex( + Math.max( + 0, + catalog.variants.findIndex((variant) => variant.id === id), + ), + ) + } + /> + {ui.mode !== "flows" ? ( + <> + dispatch({ type: "toggle-taxonomy", taxonomy: taxonomyType, value })} + onClearTaxonomy={() => dispatch({ type: "clear-taxonomy", taxonomy: taxonomyType })} + onFacet={(facet, value) => dispatch({ type: "toggle-facet", facet, value })} + onClearFacet={(facet) => dispatch({ type: "clear-facet", facet })} + onClearQuery={() => dispatch({ type: "clear-search" })} + onClearAll={() => dispatch({ type: "reset-view" })} + /> + + + ) : undefined} + {ui.mode === "flows" ? ( + dispatch({ type: "select-flow", id })} + onOpen={(id) => openViewer(id, activeFlow?.id)} + deepLinkFor={deepLinkFor} + /> + ) : ( + dispatch({ type: "select-screen", id })} + onOpen={(id) => openViewer(id)} + onClearFilters={() => dispatch({ type: "reset-view" })} + deepLinkFor={deepLinkFor} + /> + )} +
+ {ui.viewerOpen && selectedScreen ? ( + screen.id === selectedScreen.id) + 1} + total={viewerScreens.length} + active={!ui.paletteOpen} + onClose={() => { + window.history.pushState(null, "", catalogRootUrl()) + dispatch({ type: "close-viewer" }) + }} + onNavigate={navigateViewer} + onVariant={navigateVariant} + onVariantSelect={(id) => + setVariantIndex( + Math.max( + 0, + catalog.variants.findIndex((variant) => variant.id === id), + ), + ) + } + onFacet={(filter) => dispatch({ type: "toggle-facet", ...filter })} + onTaxonomy={(taxonomy, value) => dispatch({ type: "toggle-taxonomy", taxonomy, value })} + /> + ) : undefined} + {ui.paletteOpen ? ( + dispatch({ type: "close-palette" })} + onFacet={(filter) => dispatch({ type: "toggle-facet", ...filter })} + onTaxonomy={(taxonomy, value) => dispatch({ type: "toggle-taxonomy", taxonomy, value })} + onScreen={(id) => dispatch({ type: "jump-to-screen", id })} + onFlow={(id) => dispatch({ type: "jump-to-flow", id })} + /> + ) : undefined} + + ) +} diff --git a/packages/lab/catalog/src/base-path.ts b/packages/lab/catalog/src/base-path.ts new file mode 100644 index 00000000000..4a08b995a5c --- /dev/null +++ b/packages/lab/catalog/src/base-path.ts @@ -0,0 +1,3 @@ +export function catalogBasePath() { + return window.location.pathname.startsWith("/lab/catalog") ? "/lab/catalog/" : "/" +} diff --git a/packages/lab/catalog/src/catalog.ts b/packages/lab/catalog/src/catalog.ts new file mode 100644 index 00000000000..6024160ab20 --- /dev/null +++ b/packages/lab/catalog/src/catalog.ts @@ -0,0 +1,133 @@ +import type { Catalog, Flow, FlowStep, Frame, Screen, TaxonomyGroup, TaxonomyItem, Variant } from "../catalog/schema" + +export type { Catalog, Flow, FlowStep, Frame, Screen, TaxonomyGroup, TaxonomyItem, Variant } + +export type Facet = "surface" | "pattern" | "feature" | "state" +export type BrowseMode = "screens" | "ui-elements" | "flows" +export type Taxonomy = "screen" | "ui-element" + +export interface Filter { + readonly facet: Facet + readonly value: string +} + +export type FacetSelections = Readonly>> + +export interface CatalogSelections { + readonly screenLabels: ReadonlyArray + readonly uiElements: ReadonlyArray + readonly facets: FacetSelections +} + +export function frameFor(screen: Screen, variantId: string): Frame | undefined { + return screen.frames.find((frame) => frame.variantId === variantId) +} + +const rendererFamilies = [ + "notification", + "shell", + "patch", + "read", + "web", + "search", + "question", + "subagent", + "assistant", +] + +export function screenFamily(screen: Screen): string { + return rendererFamilies.find((family) => screen.features.includes(family)) ?? screen.category +} + +export const emptyFacetSelections: FacetSelections = { + surface: [], + pattern: [], + feature: [], + state: [], +} + +export function label(value: string): string { + return value + .split("-") + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(" ") +} + +export function taxonomyLabel(groups: ReadonlyArray, id: string): string { + for (const group of groups) { + const item = group.items.find((candidate) => candidate.id === id) + if (item) return item.label + } + return label(id) +} + +export function facetValues(screen: Screen, facet: Facet): ReadonlyArray { + if (facet === "surface") return screen.surfaces + if (facet === "pattern") return screen.patterns + if (facet === "feature") return screen.features + return screen.states +} + +export type FacetIndex = ReadonlyMap>> + +export function buildFacetIndex(screens: ReadonlyArray): FacetIndex { + const index = new Map>>([ + ["surface", new Map()], + ["pattern", new Map()], + ["feature", new Map()], + ["state", new Map()], + ]) + for (const screen of screens) { + for (const [facet, values] of index) { + for (const value of facetValues(screen, facet)) { + const ids = values.get(value) + if (ids) ids.add(screen.id) + else values.set(value, new Set([screen.id])) + } + } + } + return index +} + +export function filterScreens( + screens: ReadonlyArray, + query: string, + mode: BrowseMode, + selections: CatalogSelections, +): ReadonlyArray { + const needle = query.trim().toLowerCase() + const taxonomyValues = new Set(mode === "screens" ? selections.screenLabels : selections.uiElements) + const selectedFacets = (Object.keys(selections.facets) as ReadonlyArray).map( + (facet) => [facet, new Set(selections.facets[facet])] as const, + ) + + return screens.filter((screen) => { + if (mode !== "flows" && taxonomyValues.size > 0) { + const values = mode === "screens" ? screen.screenLabels : screen.uiElements + if (!values.some((value) => taxonomyValues.has(value))) return false + } + + for (const [facet, selected] of selectedFacets) { + if (selected.size > 0 && !facetValues(screen, facet).some((value) => selected.has(value))) { + return false + } + } + + if (needle === "") return true + return [screen.title, screen.category, ...screen.tags, ...screen.screenLabels, ...screen.uiElements] + .join(" ") + .toLowerCase() + .includes(needle) + }) +} + +export function filterFlows(flows: ReadonlyArray, query: string): ReadonlyArray { + const needle = query.trim().toLowerCase() + if (needle === "") return flows + return flows.filter((flow) => + [flow.title, flow.group, flow.description, ...flow.steps.flatMap((step) => [step.title, step.trigger ?? ""])] + .join(" ") + .toLowerCase() + .includes(needle), + ) +} diff --git a/packages/lab/catalog/src/components/CaptureActionsMenu.tsx b/packages/lab/catalog/src/components/CaptureActionsMenu.tsx new file mode 100644 index 00000000000..9b382686c3d --- /dev/null +++ b/packages/lab/catalog/src/components/CaptureActionsMenu.tsx @@ -0,0 +1,42 @@ +import { useEffect, useRef } from "react" + +interface CaptureActionsMenuProps { + readonly identifier: string + readonly deepLink: string + readonly issueLink: string +} + +export function CaptureActionsMenu({ identifier, deepLink, issueLink }: CaptureActionsMenuProps) { + const detailsRef = useRef(null) + + useEffect(() => { + const close = (event: PointerEvent) => { + const details = detailsRef.current + if (details?.open && event.target instanceof Node && !details.contains(event.target)) details.open = false + } + document.addEventListener("pointerdown", close) + return () => document.removeEventListener("pointerdown", close) + }, []) + + const copy = (value: string) => { + void navigator.clipboard.writeText(value) + if (detailsRef.current) detailsRef.current.open = false + } + + return ( +
+ ••• + +
+ ) +} diff --git a/packages/lab/catalog/src/components/CaptureContextMenu.tsx b/packages/lab/catalog/src/components/CaptureContextMenu.tsx new file mode 100644 index 00000000000..79fcf253521 --- /dev/null +++ b/packages/lab/catalog/src/components/CaptureContextMenu.tsx @@ -0,0 +1,83 @@ +import { type ReactNode, useEffect, useRef, useState } from "react" +import { createPortal } from "react-dom" + +interface CaptureContextMenuProps { + readonly identifier: string + readonly deepLink: string + readonly issueLink: string + readonly children: ReactNode +} + +export function CaptureContextMenu({ identifier, deepLink, issueLink, children }: CaptureContextMenuProps) { + const [position, setPosition] = useState<{ readonly x: number; readonly y: number }>() + const targetRef = useRef(null) + const menuRef = useRef(null) + + useEffect(() => { + if (!position) return + const close = () => setPosition(undefined) + window.addEventListener("pointerdown", close) + window.addEventListener("blur", close) + window.addEventListener("scroll", close, true) + return () => { + window.removeEventListener("pointerdown", close) + window.removeEventListener("blur", close) + window.removeEventListener("scroll", close, true) + } + }, [position]) + + useEffect(() => { + if (!position) return + menuRef.current?.focus() + }, [position]) + + const copy = (value: string) => { + void navigator.clipboard.writeText(value) + setPosition(undefined) + } + + return ( + { + event.preventDefault() + setPosition({ + x: Number.isFinite(event.clientX) ? event.clientX : 8, + y: Number.isFinite(event.clientY) ? event.clientY : 8, + }) + }} + > + {children} + {position + ? createPortal( +
{ + if (event.key === "Escape") setPosition(undefined) + }} + onPointerDown={(event) => event.stopPropagation()} + > + + + + Report issue + +
, + targetRef.current?.closest("dialog") ?? document.body, + ) + : undefined} +
+ ) +} diff --git a/packages/lab/catalog/src/components/CaptureSetSwitcher.tsx b/packages/lab/catalog/src/components/CaptureSetSwitcher.tsx new file mode 100644 index 00000000000..a01264dd63f --- /dev/null +++ b/packages/lab/catalog/src/components/CaptureSetSwitcher.tsx @@ -0,0 +1,25 @@ +import type { Variant } from "../catalog" + +interface CaptureSetSwitcherProps { + readonly sets: ReadonlyArray + readonly active: Variant + readonly onSelect: (id: string) => void +} + +export function CaptureSetSwitcher({ sets, active, onSelect }: CaptureSetSwitcherProps) { + return ( + + ) +} diff --git a/packages/lab/catalog/src/components/CommandPalette.tsx b/packages/lab/catalog/src/components/CommandPalette.tsx new file mode 100644 index 00000000000..eddef8496e1 --- /dev/null +++ b/packages/lab/catalog/src/components/CommandPalette.tsx @@ -0,0 +1,264 @@ +import type { KeyboardEvent as ReactKeyboardEvent } from "react" +import { useEffect, useRef, useState } from "react" +import type { Catalog, CatalogSelections, Facet, FacetIndex, Filter, Taxonomy } from "../catalog" +import { label, taxonomyLabel } from "../catalog" + +interface CommandResult { + readonly key: string + readonly group: string + readonly label: string + readonly meta: string + readonly selected?: boolean + readonly run: () => void +} + +interface CommandPaletteProps { + readonly catalog: Catalog + readonly facetIndex: FacetIndex + readonly selections: CatalogSelections + readonly onClose: () => void + readonly onFacet: (filter: Filter) => void + readonly onTaxonomy: (taxonomy: Taxonomy, value: string) => void + readonly onScreen: (id: string) => void + readonly onFlow: (id: string) => void +} + +const groupOrder = [ + "Actions", + "Screen labels", + "UI Elements", + "Surfaces", + "Patterns", + "Features", + "States", + "Flows", + "Screens", +] + +export function CommandPalette({ + catalog, + facetIndex, + selections, + onClose, + onFacet, + onTaxonomy, + onScreen, + onFlow, +}: CommandPaletteProps) { + const [query, setQuery] = useState("") + const [index, setIndex] = useState(0) + const dialogRef = useRef(null) + + useEffect(() => { + dialogRef.current?.showModal() + }, []) + + const results = buildResults({ + catalog, + facetIndex, + selections, + query, + onFacet, + onTaxonomy, + onScreen, + onFlow, + }) + const activeIndex = Math.min(index, Math.max(0, results.length - 1)) + const activeResult = results[activeIndex] + const activeId = activeResult ? `command-${activeResult.key}` : undefined + + useEffect(() => { + if (activeId) document.getElementById(activeId)?.scrollIntoView({ block: "nearest" }) + }, [activeId]) + + const handleKeyDown = (event: ReactKeyboardEvent) => { + if (event.key === "Escape") { + event.preventDefault() + event.stopPropagation() + onClose() + return + } + if (event.key === "ArrowDown" || event.key === "ArrowUp") { + event.preventDefault() + if (results.length === 0) return + const direction = event.key === "ArrowDown" ? 1 : -1 + setIndex((activeIndex + direction + results.length) % results.length) + return + } + if (event.key === "Enter") { + event.preventDefault() + activeResult?.run() + } + } + + return ( + { + event.preventDefault() + onClose() + }} + > +
+ { + setQuery(event.target.value) + setIndex(0) + }} + /> + esc +
+
+ {results.length === 0 ? ( +

No matching screens.

+ ) : ( + groupOrder.map((group) => { + const grouped = results.filter((result) => result.group === group) + if (grouped.length === 0) return undefined + return ( +
+

{group}

+ {grouped.map((result) => { + const resultIndex = results.indexOf(result) + const isActive = resultIndex === activeIndex + return ( + + ) + })} +
+ ) + }) + )} +
+

Filters stack as you select them. Select one again to remove it.

+
+ ) +} + +interface BuildResultsInput { + readonly catalog: Catalog + readonly facetIndex: FacetIndex + readonly selections: CatalogSelections + readonly query: string + readonly onFacet: (filter: Filter) => void + readonly onTaxonomy: (taxonomy: Taxonomy, value: string) => void + readonly onScreen: (id: string) => void + readonly onFlow: (id: string) => void +} + +function buildResults({ + catalog, + facetIndex, + selections, + query, + onFacet, + onTaxonomy, + onScreen, + onFlow, +}: BuildResultsInput): ReadonlyArray { + const needle = query.trim().toLowerCase() + const matches = (...values: ReadonlyArray) => needle === "" || values.join(" ").toLowerCase().includes(needle) + const results: Array = [] + + for (const group of catalog.screenTaxonomy) { + for (const item of group.items) { + if (!matches(group.label, item.label)) continue + const total = catalog.screens.filter((screen) => screen.screenLabels.includes(item.id)).length + results.push({ + key: `screen-label:${item.id}`, + group: "Screen labels", + label: item.label, + meta: count(total, "screen"), + selected: selections.screenLabels.includes(item.id), + run: () => onTaxonomy("screen", item.id), + }) + } + } + + for (const group of catalog.uiElementTaxonomy) { + for (const item of group.items) { + if (!matches(group.label, item.label)) continue + const total = catalog.screens.filter((screen) => screen.uiElements.includes(item.id)).length + results.push({ + key: `ui-element:${item.id}`, + group: "UI Elements", + label: item.label, + meta: count(total, "screen"), + selected: selections.uiElements.includes(item.id), + run: () => onTaxonomy("ui-element", item.id), + }) + } + } + + const facetGroups: ReadonlyArray]> = [ + ["surface", "Surfaces", catalog.surfaces], + ["pattern", "Patterns", catalog.patterns], + ["feature", "Features", catalog.features], + ["state", "States", catalog.states], + ] + for (const [facet, group, values] of facetGroups) { + for (const value of values) { + if (!matches(value, label(value))) continue + results.push({ + key: `${facet}:${value}`, + group, + label: label(value), + meta: count(facetIndex.get(facet)?.get(value)?.size ?? 0, "screen"), + selected: selections.facets[facet].includes(value), + run: () => onFacet({ facet, value }), + }) + } + } + + for (const screen of catalog.screens) { + if (!matches(screen.title, screen.category, ...screen.tags)) continue + results.push({ + key: `screen:${screen.id}`, + group: "Screens", + label: screen.title, + meta: screen.screenLabels.map((value) => taxonomyLabel(catalog.screenTaxonomy, value)).join(" · "), + run: () => onScreen(screen.id), + }) + } + + for (const flow of catalog.flows) { + if (!matches(flow.title, flow.group, flow.description)) continue + results.push({ + key: `flow:${flow.id}`, + group: "Flows", + label: flow.title, + meta: `${flow.steps.length} ${flow.steps.length === 1 ? "screen" : "screens"}`, + run: () => onFlow(flow.id), + }) + } + + return results +} + +function count(total: number, noun: string): string { + return `${total} ${noun}${total === 1 ? "" : "s"}` +} diff --git a/packages/lab/catalog/src/components/ContactSheet.tsx b/packages/lab/catalog/src/components/ContactSheet.tsx new file mode 100644 index 00000000000..a5e62fc41f2 --- /dev/null +++ b/packages/lab/catalog/src/components/ContactSheet.tsx @@ -0,0 +1,159 @@ +import { useEffect, useEffectEvent, useRef } from "react" +import type { Screen } from "../catalog" +import { frameFor, screenFamily } from "../catalog" +import { CaptureContextMenu } from "./CaptureContextMenu" +import { TerminalFrame } from "./TerminalFrame" +import { feedbackIssueUrl } from "../feedback" +import { CaptureActionsMenu } from "./CaptureActionsMenu" + +interface ContactSheetProps { + readonly screens: ReadonlyArray + readonly selectedId: string | undefined + readonly focusTick: number + readonly keyboardEnabled: boolean + readonly variantId: string + readonly onSelect: (id: string) => void + readonly onOpen: (id: string) => void + readonly onClearFilters: () => void + readonly deepLinkFor: (id: string) => string +} + +export function ContactSheet({ + screens, + selectedId, + focusTick, + keyboardEnabled, + variantId, + onSelect, + onOpen, + onClearFilters, + deepLinkFor, +}: ContactSheetProps) { + const gridRef = useRef(null) + const focusedTick = useRef(0) + + const handleKeyDown = useEffectEvent((event: KeyboardEvent) => { + if (screens.length === 0) return + if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) return + const target = event.target + const editing = + target instanceof HTMLInputElement || + target instanceof HTMLTextAreaElement || + (target instanceof HTMLElement && target.isContentEditable) + if (editing) return + const current = Math.max( + 0, + screens.findIndex((screen) => screen.id === selectedId), + ) + let next: number | undefined + if (event.key === "Home") next = 0 + if (event.key === "End") next = screens.length - 1 + if (event.key === "ArrowLeft" || event.key === "ArrowRight") { + const step = event.key === "ArrowLeft" ? -1 : 1 + next = Math.min(screens.length - 1, Math.max(0, current + step)) + } + if (event.key === "ArrowUp" || event.key === "ArrowDown") { + const cards = Array.from(gridRef.current?.querySelectorAll("[data-screen]") ?? []) + const active = cards.find((card) => card.dataset.screen === selectedId) + if (active) { + const origin = active.getBoundingClientRect() + const direction = event.key === "ArrowUp" ? -1 : 1 + const candidates = cards + .map((card, index) => ({ card, index, rect: card.getBoundingClientRect() })) + .filter(({ rect }) => direction * (rect.top - origin.top) > 4) + .sort((a, b) => { + const aScore = Math.abs(a.rect.left - origin.left) + Math.abs(a.rect.top - origin.top) * 0.25 + const bScore = Math.abs(b.rect.left - origin.left) + Math.abs(b.rect.top - origin.top) * 0.25 + return aScore - bScore + }) + next = candidates[0]?.index + } + } + if (next === undefined) return + event.preventDefault() + const screen = screens[next] + if (screen) onSelect(screen.id) + }) + + useEffect(() => { + if (!keyboardEnabled) return + const listener = (event: KeyboardEvent) => handleKeyDown(event) + window.addEventListener("keydown", listener) + return () => window.removeEventListener("keydown", listener) + }, [keyboardEnabled]) + + useEffect(() => { + if (focusTick === focusedTick.current) return + focusedTick.current = focusTick + if (selectedId === undefined) return + const card = gridRef.current?.querySelector(`[data-screen="${CSS.escape(selectedId)}"]`) + card?.focus() + }, [focusTick, selectedId]) + + return ( +
+ {screens.length === 0 ? ( +
+

No captures match this combination of filters.

+ +
+ ) : ( + Array.from(Map.groupBy(screens, screenFamily), ([category, categoryScreens]) => ( +
+
+

{category}

+ {categoryScreens.length} +
+
+ {categoryScreens.map((screen) => { + const frame = frameFor(screen, variantId) + if (!frame) return undefined + const deepLink = deepLinkFor(screen.id) + const issueLink = feedbackIssueUrl({ + title: screen.title, + identifier: screen.id, + deepLink, + variant: variantId, + }) + return ( +
+ +
+ + {screen.title} + {screen.states.some((state) => state !== "default") ? ( + + {screen.states.filter((state) => state !== "default").join(" · ")} + + ) : undefined} + + +
+
+ ) + })} +
+
+ )) + )} +
+ ) +} diff --git a/packages/lab/catalog/src/components/FilterBar.tsx b/packages/lab/catalog/src/components/FilterBar.tsx new file mode 100644 index 00000000000..6da56f40c76 --- /dev/null +++ b/packages/lab/catalog/src/components/FilterBar.tsx @@ -0,0 +1,105 @@ +import type { Facet, FacetSelections, TaxonomyGroup } from "../catalog" +import { label, taxonomyLabel } from "../catalog" +import { FilterMenu } from "./FilterMenu" + +const facetOrder: ReadonlyArray = ["surface", "pattern", "feature", "state"] + +interface FilterBarProps { + readonly taxonomyName: string + readonly taxonomy: ReadonlyArray + readonly taxonomyValues: ReadonlyArray + readonly taxonomyCounts: ReadonlyMap + readonly facetOptions: Readonly>> + readonly facets: FacetSelections + readonly facetCounts: ReadonlyMap + readonly query: string + readonly resultCount: number + readonly onTaxonomy: (value: string) => void + readonly onClearTaxonomy: () => void + readonly onFacet: (facet: Facet, value: string) => void + readonly onClearFacet: (facet: Facet) => void + readonly onClearQuery: () => void + readonly onClearAll: () => void +} + +export function FilterBar({ + taxonomyName, + taxonomy, + taxonomyValues, + taxonomyCounts, + facetOptions, + facets, + facetCounts, + query, + resultCount, + onTaxonomy, + onClearTaxonomy, + onFacet, + onClearFacet, + onClearQuery, + onClearAll, +}: FilterBarProps) { + const selectedFacets = facetOrder.flatMap((facet) => facets[facet].map((value) => ({ facet, value }))) + const hasSelections = query !== "" || taxonomyValues.length > 0 || selectedFacets.length > 0 + + return ( +
+
+ + {facetOrder.map((facet) => ( + (facetCounts.get(`${facet}:${value}`) ?? 0) > 0 || facets[facet].includes(value)) + .map((value) => ({ id: `${facet}:${value}`, label: label(value) })), + }, + ]} + selected={facets[facet].map((value) => `${facet}:${value}`)} + counts={facetCounts} + onToggle={(encoded) => onFacet(facet, encoded.slice(facet.length + 1))} + onClear={() => onClearFacet(facet)} + /> + ))} +
+
+ {query ? ( + + ) : undefined} + {taxonomyValues.map((value) => ( + + ))} + {selectedFacets.map(({ facet, value }) => ( + + ))} + {hasSelections ? ( + + ) : undefined} +
+ + {resultCount} {resultCount === 1 ? "result" : "results"} + +
+ ) +} diff --git a/packages/lab/catalog/src/components/FilterMenu.tsx b/packages/lab/catalog/src/components/FilterMenu.tsx new file mode 100644 index 00000000000..dc62558e3d1 --- /dev/null +++ b/packages/lab/catalog/src/components/FilterMenu.tsx @@ -0,0 +1,99 @@ +import { useEffect, useRef, useState } from "react" +import type { TaxonomyGroup } from "../catalog" + +interface FilterMenuProps { + readonly label: string + readonly searchLabel: string + readonly groups: ReadonlyArray + readonly selected: ReadonlyArray + readonly counts?: ReadonlyMap + readonly onToggle: (value: string) => void + readonly onClear: () => void +} + +export function FilterMenu({ label, searchLabel, groups, selected, counts, onToggle, onClear }: FilterMenuProps) { + const [query, setQuery] = useState("") + const detailsRef = useRef(null) + const searchable = groups.reduce((total, group) => total + group.items.length, 0) > 7 + const needle = query.trim().toLowerCase() + const selectedValues = new Set(selected) + const visibleGroups: Array = [] + for (const group of groups) { + const items = group.items.filter((item) => + needle === "" ? true : `${group.label} ${item.label}`.toLowerCase().includes(needle), + ) + if (items.length > 0) visibleGroups.push({ ...group, items }) + } + + useEffect(() => { + const close = (event: PointerEvent) => { + const details = detailsRef.current + if (details?.open && event.target instanceof Node && !details.contains(event.target)) { + details.open = false + } + } + const closeOnEscape = (event: KeyboardEvent) => { + const details = detailsRef.current + if (event.key !== "Escape" || !details?.open) return + event.preventDefault() + event.stopPropagation() + details.open = false + details.querySelector("summary")?.focus() + } + document.addEventListener("pointerdown", close) + document.addEventListener("keydown", closeOnEscape, true) + return () => { + document.removeEventListener("pointerdown", close) + document.removeEventListener("keydown", closeOnEscape, true) + } + }, []) + + return ( +
+ + {label} + {selected.length > 0 ? {selected.length} : undefined} + + +
+ {searchable ? ( +
+ + setQuery(event.target.value)} + /> +
+ ) : undefined} +
+ {visibleGroups.length === 0 ? ( +

No matching labels.

+ ) : ( + visibleGroups.map((group) => ( +
+ {groups.length > 1 ?

{group.label}

: undefined} + {group.items.map((item) => ( + + ))} +
+ )) + )} +
+ {selected.length > 0 ? ( + + ) : undefined} +
+
+ ) +} diff --git a/packages/lab/catalog/src/components/FlowBrowser.tsx b/packages/lab/catalog/src/components/FlowBrowser.tsx new file mode 100644 index 00000000000..10cba33b24d --- /dev/null +++ b/packages/lab/catalog/src/components/FlowBrowser.tsx @@ -0,0 +1,136 @@ +import type { Catalog, Flow } from "../catalog" +import { frameFor } from "../catalog" +import { TerminalFrame } from "./TerminalFrame" +import { CaptureContextMenu } from "./CaptureContextMenu" +import { feedbackIssueUrl } from "../feedback" +import { CaptureActionsMenu } from "./CaptureActionsMenu" + +interface FlowBrowserProps { + readonly catalog: Catalog + readonly flows: ReadonlyArray + readonly activeFlow: Flow | undefined + readonly variantId: string + readonly onFlow: (id: string) => void + readonly onOpen: (screenId: string) => void + readonly deepLinkFor: (screenId: string, flowId: string) => string +} + +export function FlowBrowser({ catalog, flows, activeFlow, variantId, onFlow, onOpen, deepLinkFor }: FlowBrowserProps) { + const groupedFlows = new Map>() + for (const flow of flows) { + const grouped = groupedFlows.get(flow.group) + if (grouped) grouped.push(flow) + else groupedFlows.set(flow.group, [flow]) + } + const navigation = ( + + ) + + if (!activeFlow) { + return

No flows match.

+ } + + return ( +
+ +
+ + {activeFlow.title} + Browse flows ↓ + + {navigation} +
+
+
+
+

{activeFlow.group}

+

{activeFlow.title}

+
+ + {activeFlow.steps.length} {activeFlow.steps.length === 1 ? "step" : "steps"} + +

{activeFlow.description}

+ {!activeFlow.replayable ? ( + Browse only · IDs identify captures, not recipes + ) : undefined} +
+
    + {activeFlow.steps.map((step, index) => { + const screen = catalog.screens.find((candidate) => candidate.id === step.screenId) + if (!screen) return undefined + const frame = frameFor(screen, variantId) + if (!frame) { + return ( +
  1. + {String(index + 1).padStart(2, "0")} + {step.title} + Not captured in this set +
  2. + ) + } + const identifier = activeFlow.replayable ? `${activeFlow.id}/${screen.id}` : screen.id + const deepLink = deepLinkFor(screen.id, activeFlow.id) + return ( +
  3. + +
    + {String(index + 1).padStart(2, "0")} + + + {step.title} + + + {step.trigger ? {step.trigger} : undefined} + +
    +
  4. + ) + })} +
+
+
+ ) +} diff --git a/packages/lab/catalog/src/components/Header.tsx b/packages/lab/catalog/src/components/Header.tsx new file mode 100644 index 00000000000..4a3341cd269 --- /dev/null +++ b/packages/lab/catalog/src/components/Header.tsx @@ -0,0 +1,89 @@ +import type { Ref } from "react" +import type { BrowseMode, Catalog, Variant } from "../catalog" +import { CaptureSetSwitcher } from "./CaptureSetSwitcher" + +interface HeaderProps { + readonly catalog: Catalog + readonly mode: BrowseMode + readonly query: string + readonly resultCount: number + readonly searchRef: Ref + readonly variant: Variant + readonly onMode: (mode: BrowseMode) => void + readonly onQuery: (query: string) => void + readonly onClearSearch: () => void + readonly onOpenPalette: () => void + readonly onVariantSelect: (id: string) => void +} + +const modes: ReadonlyArray = [ + ["screens", "Screens"], + ["ui-elements", "UI Elements"], + ["flows", "Flows"], +] + +export function Header({ + catalog, + mode, + query, + resultCount, + searchRef, + variant, + onMode, + onQuery, + onClearSearch, + onOpenPalette, + onVariantSelect, +}: HeaderProps) { + const noun = mode === "flows" ? "flows" : "screens" + + return ( +
+
+ Terminal Catalog + + {resultCount} {noun} + +
+ +
+ +
+ + onQuery(event.target.value)} + onKeyDown={(event) => { + if (event.key !== "Escape") return + event.preventDefault() + event.stopPropagation() + event.currentTarget.blur() + onClearSearch() + }} + /> + / +
+ +
+
+ ) +} diff --git a/packages/lab/catalog/src/components/MatrixNavigation.tsx b/packages/lab/catalog/src/components/MatrixNavigation.tsx new file mode 100644 index 00000000000..f58c012953a --- /dev/null +++ b/packages/lab/catalog/src/components/MatrixNavigation.tsx @@ -0,0 +1,29 @@ +import type { Screen } from "../catalog" +import { label, screenFamily } from "../catalog" + +interface MatrixNavigationProps { + readonly screens: ReadonlyArray +} + +export function MatrixNavigation({ screens }: MatrixNavigationProps) { + const categories = Array.from( + screens.reduce((counts, screen) => { + const family = screenFamily(screen) + return counts.set(family, (counts.get(family) ?? 0) + 1) + }, new Map()), + ) + if (categories.length < 2) return undefined + + return ( + + ) +} diff --git a/packages/lab/catalog/src/components/TerminalFrame.tsx b/packages/lab/catalog/src/components/TerminalFrame.tsx new file mode 100644 index 00000000000..dc92ce61151 --- /dev/null +++ b/packages/lab/catalog/src/components/TerminalFrame.tsx @@ -0,0 +1,154 @@ +import { + CellHeight, + CellWidth, + DimAlpha, + FontSize, + StrikethroughOffset, + TextStyle, + UnderlineOffset, + baselineOffset, + drawBlockGlyph, +} from "opencode-drive/frame" +import { useEffect, useRef } from "react" +import type { Frame, FrameArtifact } from "../../catalog/schema" +import { catalogBasePath } from "../base-path" + +interface TerminalFrameProps { + readonly frame: Frame + readonly label: string + readonly lazy?: boolean +} + +const FontFamily = "Commit Mono" +const SymbolFontFamily = "Noto Sans Symbols" +const SymbolFontFamily2 = "Noto Sans Symbols 2" +const MathFontFamily = "Noto Sans Math" +const FontStack = `"${FontFamily}", "${SymbolFontFamily}", "${SymbolFontFamily2}", "${MathFontFamily}"` +const cache = new Map>() +let fontsReady: Promise | undefined + +export function preloadFrame(frame: Frame) { + return loadFrame(frame.src) +} + +export function TerminalFrame({ frame, label, lazy = false }: TerminalFrameProps) { + const canvasRef = useRef(null) + + useEffect(() => { + const canvas = canvasRef.current + if (!canvas) return + let cancelled = false + const render = async () => { + if (lazy && !isNearViewport(canvas)) return + const artifact = await loadFrame(frame.src) + fontsReady ??= Promise.all([ + document.fonts.load(`400 ${FontSize}px "${FontFamily}"`), + document.fonts.load(`700 ${FontSize}px "${FontFamily}"`), + document.fonts.load(`400 ${FontSize}px "${SymbolFontFamily}"`, "⚙"), + document.fonts.load(`700 ${FontSize}px "${SymbolFontFamily}"`, "⚙"), + document.fonts.load(`400 ${FontSize}px "${SymbolFontFamily2}"`, "△✱⬝"), + document.fonts.load(`400 ${FontSize}px "${MathFontFamily}"`, "⇆↳⟳"), + ]) + await fontsReady + if (!cancelled) drawFrame(canvas, artifact) + } + let observer: IntersectionObserver | undefined + observer = lazy + ? new IntersectionObserver( + (entries) => { + if (!entries.some((entry) => entry.isIntersecting)) return + observer?.disconnect() + void render() + }, + { rootMargin: "300px" }, + ) + : undefined + if (observer) observer.observe(canvas) + else void render() + return () => { + cancelled = true + observer?.disconnect() + } + }, [frame.src, lazy]) + + return ( + + ) +} + +function loadFrame(src: string) { + const existing = cache.get(src) + if (existing) return existing + const pending = fetch(`${catalogBasePath()}${src}`).then(async (response) => { + if (!response.ok) throw new Error(`Failed to load terminal frame: ${response.status}`) + return response.json() as Promise + }) + cache.set(src, pending) + return pending +} + +function drawFrame(canvas: HTMLCanvasElement, frame: FrameArtifact) { + const context = canvas.getContext("2d") + if (!context) return + context.fillStyle = "#080808" + context.fillRect(0, 0, canvas.width, canvas.height) + context.textBaseline = "alphabetic" + context.textAlign = "center" + + frame.lines.forEach((line, row) => { + let column = 0 + line.spans.forEach((span) => { + const attributes = span.attributes & 0xff + const inverse = Boolean(attributes & TextStyle.inverse) + const hidden = Boolean(attributes & TextStyle.invisible) + const foreground = inverse ? span.bg : span.fg + const background = inverse ? span.fg : span.bg + const chars = [...span.text] + let remaining = span.width + + chars.forEach((char, index) => { + const cells = Math.max(1, remaining - (chars.length - index - 1)) + const x = column * CellWidth + const y = row * CellHeight + if (background[3]) { + context.fillStyle = color(background) + context.fillRect(x, y, cells * CellWidth, CellHeight) + } + if (!hidden && char.codePointAt(0) !== 0x0a00) { + context.fillStyle = color(foreground, attributes & TextStyle.dim ? DimAlpha : 1) + if (!drawBlockGlyph(context, char, x, y, cells)) { + const font = `${attributes & TextStyle.italic ? "italic " : ""}${attributes & TextStyle.bold ? "700 " : "400 "}${FontSize}px ${FontStack}` + context.font = font + context.fillText(char, x + (cells * CellWidth) / 2, y + baselineOffset(context, font), cells * CellWidth) + } + if (attributes & TextStyle.underline) context.fillRect(x, y + UnderlineOffset, cells * CellWidth, 1) + if (attributes & TextStyle.strikethrough) context.fillRect(x, y + StrikethroughOffset, cells * CellWidth, 1) + } + column += cells + remaining -= cells + }) + while (remaining-- > 0) { + if (background[3]) { + context.fillStyle = color(background) + context.fillRect(column * CellWidth, row * CellHeight, CellWidth, CellHeight) + } + column++ + } + }) + }) +} + +function color([red, green, blue, alpha]: FrameArtifact["lines"][number]["spans"][number]["fg"], opacity = 1) { + return `rgba(${red}, ${green}, ${blue}, ${(alpha / 255) * opacity})` +} + +function isNearViewport(element: HTMLElement) { + const bounds = element.getBoundingClientRect() + return bounds.bottom >= -300 && bounds.top <= window.innerHeight + 300 +} diff --git a/packages/lab/catalog/src/components/Viewer.tsx b/packages/lab/catalog/src/components/Viewer.tsx new file mode 100644 index 00000000000..686fd43ec1b --- /dev/null +++ b/packages/lab/catalog/src/components/Viewer.tsx @@ -0,0 +1,164 @@ +import { useEffect, useEffectEvent, useRef } from "react" +import type { Facet, Filter, Screen, Taxonomy, TaxonomyGroup, Variant } from "../catalog" +import { facetValues, frameFor, label, taxonomyLabel } from "../catalog" +import { TerminalFrame } from "./TerminalFrame" +import { CaptureSetSwitcher } from "./CaptureSetSwitcher" +import { CaptureContextMenu } from "./CaptureContextMenu" +import { feedbackIssueUrl } from "../feedback" +import { CaptureActionsMenu } from "./CaptureActionsMenu" + +interface ViewerProps { + readonly screen: Screen + readonly identifier: string + readonly deepLink: string + readonly variant: Variant + readonly variants: ReadonlyArray + readonly screenTaxonomy: ReadonlyArray + readonly uiElementTaxonomy: ReadonlyArray + readonly position: number + readonly total: number + readonly active: boolean + readonly onClose: () => void + readonly onNavigate: (direction: 1 | -1) => void + readonly onVariant: (direction: 1 | -1) => void + readonly onVariantSelect: (id: string) => void + readonly onFacet: (filter: Filter) => void + readonly onTaxonomy: (taxonomy: Taxonomy, value: string) => void +} + +const facetOrder: ReadonlyArray = ["surface", "pattern", "feature", "state"] + +export function Viewer({ + screen, + identifier, + deepLink, + variant, + variants, + screenTaxonomy, + uiElementTaxonomy, + position, + total, + active, + onClose, + onNavigate, + onVariant, + onVariantSelect, + onFacet, + onTaxonomy, +}: ViewerProps) { + const dialogRef = useRef(null) + const frame = frameFor(screen, variant.id) + if (!frame) throw new Error(`Capture ${screen.id} is unavailable in set ${variant.id}`) + const issueLink = feedbackIssueUrl({ title: screen.title, identifier, deepLink, variant: variant.id }) + + useEffect(() => { + dialogRef.current?.showModal() + }, []) + + const handleKeyDown = useEffectEvent((event: KeyboardEvent) => { + if (event.key === "Escape") { + event.preventDefault() + onClose() + return + } + if (event.key === "ArrowLeft" || event.key === "ArrowRight") { + event.preventDefault() + onNavigate(event.key === "ArrowLeft" ? -1 : 1) + return + } + if (event.key === "ArrowUp" || event.key === "ArrowDown") { + event.preventDefault() + onVariant(event.key === "ArrowUp" ? -1 : 1) + } + }) + + useEffect(() => { + if (!active) return + window.addEventListener("keydown", handleKeyDown) + return () => window.removeEventListener("keydown", handleKeyDown) + }, [active]) + + return ( + { + event.preventDefault() + onClose() + }} + > +
+ + + + {String(position).padStart(2, "0")} / {String(total).padStart(2, "0")} + + +
+ + +
+
+
+
+
+ +
+ +
+
+
+

{screen.title}

+
+
+

Screens

+
+ {screen.screenLabels.map((value) => ( + + ))} +
+
+
+

UI Elements

+
+ {screen.uiElements.map((value) => ( + + ))} +
+
+
+

Labels

+
+ {facetOrder.flatMap((facet) => + facetValues(screen, facet).map((value) => ( + + )), + )} +
+
+
+
+
+
+
+
+ ) +} diff --git a/packages/lab/catalog/src/deep-link.ts b/packages/lab/catalog/src/deep-link.ts new file mode 100644 index 00000000000..df9130e4038 --- /dev/null +++ b/packages/lab/catalog/src/deep-link.ts @@ -0,0 +1,73 @@ +export interface CatalogLocation { + readonly screenId: string | undefined + readonly flowId: string | undefined + readonly variantId: string | undefined + readonly mode: string | undefined + readonly query: string + readonly screenLabels: ReadonlyArray + readonly uiElements: ReadonlyArray + readonly surfaces: ReadonlyArray + readonly patterns: ReadonlyArray + readonly features: ReadonlyArray + readonly states: ReadonlyArray +} + +export function readCatalogLocation(url: URL): CatalogLocation { + return { + screenId: url.searchParams.get("screen") ?? undefined, + flowId: url.searchParams.get("flow") ?? undefined, + variantId: url.searchParams.get("set") ?? undefined, + mode: url.searchParams.get("mode") ?? undefined, + query: url.searchParams.get("q") ?? "", + screenLabels: url.searchParams.getAll("screen-label"), + uiElements: url.searchParams.getAll("ui-element"), + surfaces: url.searchParams.getAll("surface"), + patterns: url.searchParams.getAll("pattern"), + features: url.searchParams.getAll("feature"), + states: url.searchParams.getAll("state"), + } +} + +export function catalogBrowseUrl( + location: Omit, + current = new URL(window.location.href), +) { + const url = new URL(current) + url.searchParams.delete("screen") + url.searchParams.delete("flow") + set(url, "set", location.variantId ? [location.variantId] : []) + set(url, "mode", location.mode && location.mode !== "screens" ? [location.mode] : []) + set(url, "q", location.query ? [location.query] : []) + set(url, "screen-label", location.screenLabels) + set(url, "ui-element", location.uiElements) + set(url, "surface", location.surfaces) + set(url, "pattern", location.patterns) + set(url, "feature", location.features) + set(url, "state", location.states) + return url.href +} + +export function catalogDeepLink( + screenId: string, + options: { readonly flowId?: string; readonly variantId?: string } = {}, +) { + const url = new URL(window.location.href) + url.hash = "" + url.searchParams.set("screen", screenId) + set(url, "flow", options.flowId ? [options.flowId] : []) + set(url, "set", options.variantId ? [options.variantId] : []) + return url.href +} + +export function catalogRootUrl() { + const url = new URL(window.location.href) + url.hash = "" + url.searchParams.delete("screen") + url.searchParams.delete("flow") + return url.href +} + +function set(url: URL, key: string, values: ReadonlyArray) { + url.searchParams.delete(key) + for (const value of values) url.searchParams.append(key, value) +} diff --git a/packages/lab/catalog/src/feedback.ts b/packages/lab/catalog/src/feedback.ts new file mode 100644 index 00000000000..3159d3cd75f --- /dev/null +++ b/packages/lab/catalog/src/feedback.ts @@ -0,0 +1,27 @@ +interface FeedbackIssue { + readonly title: string + readonly identifier: string + readonly deepLink: string + readonly variant: string +} + +export function feedbackIssueUrl(issue: FeedbackIssue) { + const url = new URL("https://github.com/anomalyco/opencode/issues/new") + url.searchParams.set("title", `[Catalog feedback] ${issue.title}`) + url.searchParams.set("labels", "catalog,design-feedback") + url.searchParams.set( + "body", + [ + "## Feedback", + "", + "", + "", + "## Catalog state", + "", + `- Screen: \`${issue.identifier}\``, + `- Theme: \`${issue.variant}\``, + `- Link: ${issue.deepLink}`, + ].join("\n"), + ) + return url.href +} diff --git a/packages/lab/catalog/src/globals.d.ts b/packages/lab/catalog/src/globals.d.ts new file mode 100644 index 00000000000..4d807787efd --- /dev/null +++ b/packages/lab/catalog/src/globals.d.ts @@ -0,0 +1,6 @@ +declare module "*.css" {} + +// The compile fixture follows Drive source through workspace exports under DOM types. +interface WebSocket { + terminate(): void +} diff --git a/packages/lab/catalog/src/index.html b/packages/lab/catalog/src/index.html new file mode 100644 index 00000000000..3b5588f184a --- /dev/null +++ b/packages/lab/catalog/src/index.html @@ -0,0 +1,13 @@ + + + + + + + OpenCode Terminal Catalog + + +
+ + + diff --git a/packages/lab/catalog/src/main.tsx b/packages/lab/catalog/src/main.tsx new file mode 100644 index 00000000000..8de5b8e5ad4 --- /dev/null +++ b/packages/lab/catalog/src/main.tsx @@ -0,0 +1,28 @@ +import { StrictMode } from "react" +import { createRoot } from "react-dom/client" +import "@fontsource/commit-mono/400.css" +import "@fontsource/commit-mono/400-italic.css" +import "@fontsource/commit-mono/700.css" +import "@fontsource/commit-mono/700-italic.css" +import "@fontsource/noto-sans-symbols/symbols-400.css" +import "@fontsource/noto-sans-symbols/symbols-700.css" +import "@fontsource/noto-sans-symbols-2/symbols-400.css" +import "@fontsource/noto-sans-math/math-400.css" +import "./styles.css" +import { App } from "./App" +import type { Catalog } from "./catalog" +import { catalogBasePath } from "./base-path" + +const catalog = await fetch(`${catalogBasePath()}catalog.json`).then((response) => { + if (!response.ok) throw new Error(`Failed to load catalog: ${response.status}`) + return response.json() as Promise +}) + +const root = document.getElementById("root") +if (!root) throw new Error("Missing #root element") + +createRoot(root).render( + + + , +) diff --git a/packages/lab/catalog/src/styles.css b/packages/lab/catalog/src/styles.css new file mode 100644 index 00000000000..5a1c36e2f35 --- /dev/null +++ b/packages/lab/catalog/src/styles.css @@ -0,0 +1,1663 @@ +:root { + color-scheme: dark; + --kit-bg: #050505; + --kit-bg-inset: #0a0a0a; + --kit-bg-hover: #121212; + --kit-fg: #d6d3cc; + --kit-fg-strong: #f1efe8; + --kit-fg-muted: #8b8983; + --kit-fg-faint: #696863; + --kit-line: #1c1c1c; + --kit-line-strong: #2e2e2e; + --kit-accent: #7b96ff; + --kit-mono: "Commit Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace; + --kit-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + --catalog-accent: var(--kit-accent, #7b96ff); + --catalog-mark: #ffbd5c; + --catalog-mark-ink: #16120b; + --catalog-canvas: #0d0d0d; + --catalog-frame-line: rgb(255 255 255 / 7%); + --catalog-frame-line-strong: rgb(255 255 255 / 16%); + --catalog-header-height: 4rem; + --catalog-filterbar-height: 3rem; + --catalog-sidebar-width: 19rem; + background: var(--kit-bg); + color: var(--kit-fg); + font-family: var(--kit-sans); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; +} + +* { + box-sizing: border-box; +} + +html, +body, +#root { + min-height: 100%; +} + +body { + min-width: 320px; + margin: 0; + overflow-x: hidden; + background: var(--kit-bg); + color: var(--kit-fg); + scrollbar-color: var(--kit-line-strong) transparent; +} + +button, +select, +input, +textarea { + font: inherit; + color: inherit; +} + +button, +a { + touch-action: manipulation; +} + +button { + border: 0; + padding: 0; + background: none; + cursor: pointer; +} + +.capture-context-target { + display: block; +} + +.capture-context-menu { + position: fixed; + z-index: 100; + display: grid; + width: 10.5rem; + padding: 0.3rem; + border: 1px solid var(--kit-line-strong); + background: #202020; + box-shadow: 0 16px 48px rgb(0 0 0 / 60%); +} + +.capture-context-menu button, +.capture-context-menu a { + display: flex; + align-items: center; + width: 100%; + min-height: 2.2rem; + padding: 0 0.7rem; + color: var(--kit-fg); + font-family: var(--kit-mono); + font-size: 0.65rem; + text-align: left; +} + +.capture-context-menu button:hover, +.capture-context-menu button:focus-visible, +.capture-context-menu a:hover, +.capture-context-menu a:focus-visible { + background: rgb(255 255 255 / 7%); + color: var(--kit-fg-strong); +} + +a { + color: inherit; + text-decoration: none; +} + +::selection { + background: color-mix(in srgb, var(--kit-accent) 35%, transparent); +} + +:focus-visible { + outline: 1px solid var(--kit-accent); + outline-offset: -1px; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +kbd { + padding: 0.1rem 0.35rem; + border: 1px solid var(--kit-line-strong); + background: var(--kit-bg-inset); + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.6rem; + line-height: 1; + white-space: nowrap; +} + +/* ---------------------------------- shell --------------------------------- */ + +.catalog-app { + min-height: 100dvh; + isolation: isolate; + background: var(--catalog-canvas); +} + +.catalog-header { + position: sticky; + top: 0; + z-index: 20; + display: grid; + min-height: var(--catalog-header-height); + grid-template-columns: auto auto minmax(0, 1fr); + align-items: center; + border-bottom: 1px solid var(--kit-line); + background: color-mix(in srgb, var(--catalog-canvas) 92%, transparent); + backdrop-filter: blur(18px); +} + +.catalog-brand { + display: flex; + min-width: 12.5rem; + height: 100%; + flex-direction: column; + justify-content: center; + gap: 0.2rem; + padding: 0 1.35rem; + border-right: 1px solid var(--kit-line); + font-family: var(--kit-mono); + white-space: nowrap; +} + +.catalog-brand strong { + color: var(--kit-fg-strong); + font-size: 0.68rem; + font-weight: 650; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.catalog-brand span { + color: var(--kit-fg-faint); + font-size: 0.58rem; +} + +.catalog-tabs { + display: flex; + height: 100%; + min-width: 0; + padding: 0 0.75rem; + overflow-x: auto; + scrollbar-width: none; +} + +.catalog-tabs::-webkit-scrollbar { + display: none; +} + +.catalog-tabs button, +.viewer-button { + padding: 0 0.8rem; + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.66rem; + white-space: nowrap; +} + +.catalog-tabs button:hover, +.viewer-button:hover, +.viewer-button.active { + background: var(--kit-bg-hover); + color: var(--kit-fg-strong); +} + +.catalog-tabs button.active { + color: var(--kit-fg-strong); + box-shadow: inset 0 -1px 0 var(--catalog-accent); +} + +.catalog-tabs button:focus-visible, +.viewer-button:focus-visible, +.command-trigger:focus-visible { + outline: 1px solid var(--catalog-accent); + outline-offset: -1px; +} + +.catalog-tools { + display: flex; + height: 100%; + min-width: 0; + justify-content: flex-end; + align-items: stretch; +} + +.filter-menu { + position: relative; + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.66rem; +} + +.filter-menu summary { + display: flex; + height: 100%; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0 0.9rem; + cursor: pointer; + list-style: none; + white-space: nowrap; +} + +.filter-menu summary::-webkit-details-marker { + display: none; +} + +.filter-menu summary:hover, +.filter-menu[open] summary { + background: var(--kit-bg-hover); + color: var(--kit-fg-strong); +} + +.filter-count { + display: grid; + min-width: 1.15rem; + height: 1.15rem; + place-items: center; + padding: 0 0.25rem; + background: var(--catalog-accent); + color: #0b1020; + font-size: 0.56rem; +} + +.filter-chevron { + color: var(--kit-fg-faint); + font-size: 0.58rem; +} + +.filter-menu[open] .filter-chevron { + transform: rotate(180deg); +} + +.filter-popover { + position: absolute; + top: calc(100% + 0.5rem); + left: 0; + z-index: 40; + display: flex; + width: min(25rem, calc(100vw - 2rem)); + max-height: min(42rem, calc(100dvh - 6rem)); + flex-direction: column; + overflow: hidden; + border: 1px solid var(--kit-line-strong); + background: #202020; + box-shadow: 0 24px 80px rgb(0 0 0 / 65%); +} + +.filter-search { + display: grid; + flex: none; + min-height: 3.25rem; + grid-template-columns: auto minmax(0, 1fr); + align-items: center; + gap: 0.7rem; + padding: 0 1rem; + border-bottom: 1px solid var(--kit-line-strong); + color: var(--kit-fg-muted); + font-size: 1.15rem; +} + +.filter-search input { + min-width: 0; + height: 100%; + border: 0; + background: transparent; + color: var(--kit-fg-strong); + font-size: 0.82rem; + outline: 0; +} + +.filter-search input::placeholder { + color: var(--kit-fg-faint); +} + +.filter-options { + min-height: 0; + flex: 1; + overflow-y: auto; + padding: 0.6rem; + scrollbar-width: thin; +} + +.filter-group + .filter-group { + padding-top: 0.65rem; +} + +.filter-group h2 { + margin: 0; + padding: 0.45rem 0.6rem; + color: var(--kit-fg-faint); + font-size: 0.6rem; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.filter-option { + display: grid; + min-height: 2.65rem; + grid-template-columns: auto minmax(0, 1fr) auto; + align-items: center; + gap: 0.75rem; + padding: 0 0.75rem; + color: var(--kit-fg); + cursor: pointer; +} + +.filter-option:hover { + background: rgb(255 255 255 / 6%); + color: var(--kit-fg-strong); +} + +.filter-option input { + width: 1rem; + height: 1rem; + margin: 0; + accent-color: var(--catalog-accent); +} + +.filter-option small { + color: var(--kit-fg-faint); + font-size: 0.58rem; + font-variant-numeric: tabular-nums; +} + +.filter-clear { + flex: none; + min-height: 2.75rem; + border-top: 1px solid var(--kit-line-strong); + color: var(--kit-fg-muted); + font-size: 0.64rem; + text-align: center; +} + +.filter-clear:hover { + background: rgb(255 255 255 / 5%); + color: var(--kit-fg-strong); +} + +.filter-empty { + margin: 0; + padding: 2rem 1rem; + color: var(--kit-fg-faint); + font-size: 0.68rem; + text-align: center; +} + +.catalog-search { + position: relative; + display: grid; + width: clamp(10rem, 14vw, 15rem); + grid-template-columns: auto minmax(0, 1fr) auto; + align-items: center; + gap: 0.55rem; + padding: 0 0.8rem; + border-left: 1px solid var(--kit-line); + color: var(--kit-fg-faint); +} + +.catalog-search input { + min-width: 0; + height: 100%; + border: 0; + padding: 0; + background: transparent; + color: var(--kit-fg-strong); + font-size: 0.72rem; + outline: 0; +} + +.catalog-search input::placeholder { + color: var(--kit-fg-faint); +} + +.catalog-search kbd { + pointer-events: none; +} + +.catalog-search input:focus ~ kbd { + display: none; +} + +.command-trigger { + display: flex; + align-items: center; + gap: 0.55rem; + padding: 0 1.25rem; + border-left: 1px solid var(--kit-line); + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.66rem; +} + +.command-trigger:hover { + background: var(--kit-bg-hover); + color: var(--kit-fg-strong); +} + +.filter-bar { + position: sticky; + top: var(--catalog-header-height); + z-index: 15; + display: flex; + min-height: var(--catalog-filterbar-height); + align-items: stretch; + border-bottom: 1px solid var(--kit-line); + background: color-mix(in srgb, var(--catalog-canvas) 94%, transparent); + backdrop-filter: blur(18px); +} + +.filter-bar-menus { + display: flex; + flex: none; + align-items: stretch; +} + +.filter-bar-menus .filter-menu { + border-right: 1px solid var(--kit-line); +} + +.filter-bar-chips { + display: flex; + min-width: 0; + flex: 1; + align-items: center; + gap: 0.4rem; + padding: 0 0.9rem; + overflow-x: auto; + scrollbar-width: none; +} + +.filter-bar-chips::-webkit-scrollbar { + display: none; +} + +.filter-bar-chips button { + flex: none; + min-height: 1.8rem; + padding: 0 0.55rem; + background: var(--kit-bg-hover); + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.6rem; + white-space: nowrap; +} + +.filter-bar-chips button small { + margin-right: 0.25rem; + color: var(--kit-fg-faint); + font: inherit; +} + +.filter-bar-chips button:hover { + color: var(--kit-fg-strong); +} + +.filter-bar-chips button span { + padding-left: 0.25rem; + color: var(--kit-fg-faint); +} + +.filter-bar-results { + display: flex; + flex: none; + align-items: center; + padding: 0 0.9rem; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.58rem; + white-space: nowrap; +} + +.filter-bar-chips button.filter-bar-clear { + margin-left: 0.35rem; + background: transparent; + color: var(--catalog-accent); + text-decoration: underline; + text-underline-offset: 0.25rem; +} + +.filter-bar-chips button.filter-bar-clear:hover { + color: var(--kit-fg-strong); +} + +/* ------------------------------ contact sheet ----------------------------- */ + +.matrix-navigation { + position: sticky; + top: calc(var(--catalog-header-height) + var(--catalog-filterbar-height)); + z-index: 10; + display: grid; + min-height: 2.75rem; + grid-template-columns: minmax(0, 1fr) auto; + align-items: stretch; + border-bottom: 1px solid var(--kit-line); + background: color-mix(in srgb, var(--catalog-canvas) 94%, transparent); + backdrop-filter: blur(18px); + font-family: var(--kit-mono); + font-size: 0.6rem; +} + +.matrix-categories { + display: flex; + min-width: 0; + align-items: stretch; + overflow-x: auto; + scrollbar-width: none; +} + +.matrix-categories::-webkit-scrollbar { + display: none; +} + +.matrix-label, +.matrix-navigation a, +.matrix-navigation button { + display: flex; + min-height: 2.75rem; + flex: none; + align-items: center; + gap: 0.35rem; + padding: 0 0.7rem; + color: var(--kit-fg-muted); + white-space: nowrap; +} + +.matrix-label { + color: var(--kit-fg-faint); + font-size: 0.52rem; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.matrix-navigation a:hover, +.matrix-navigation button:hover, +.matrix-navigation button.active { + background: var(--kit-bg-hover); + color: var(--kit-fg-strong); +} + +.matrix-navigation button.active { + box-shadow: inset 0 -1px 0 var(--catalog-accent); +} + +.matrix-navigation small { + color: var(--kit-fg-faint); + font-size: 0.52rem; + font-variant-numeric: tabular-nums; +} + +.contact-sheet { + padding: 2.25rem 2rem 5rem; +} + +.capture-family { + scroll-margin-top: calc(var(--catalog-header-height) + var(--catalog-filterbar-height) + 3.5rem); +} + +.capture-family + .capture-family { + margin-top: 3.25rem; +} + +.capture-family-heading { + display: flex; + align-items: baseline; + gap: 0.65rem; + margin-bottom: 1rem; + border-bottom: 1px solid var(--kit-line); + padding-bottom: 0.65rem; + font-family: var(--kit-mono); +} + +.capture-family-heading h2 { + margin: 0; + color: var(--kit-fg-strong); + font-size: 0.65rem; + font-weight: 600; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.capture-family-heading span { + color: var(--kit-fg-faint); + font-size: 0.55rem; +} + +.capture-family-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + align-items: start; + gap: 2.75rem 2rem; +} + +.capture-card { + display: grid; + gap: 0.6rem; + min-width: 0; + width: 100%; +} + +.capture-open { + display: block; + min-width: 0; + width: 100%; + text-align: left; +} + +.capture-frame { + display: block; + outline: 1px solid var(--catalog-frame-line); + outline-offset: -1px; +} + +.capture-card canvas { + display: block; + width: 100%; + height: auto; + object-fit: contain; +} + +.variant-switcher { + position: relative; + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0 1rem; + border-left: 1px solid var(--kit-line); + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.66rem; + cursor: pointer; +} + +.variant-switcher:hover { + background: var(--kit-bg-hover); + color: var(--kit-fg-strong); +} + +.variant-switcher select { + appearance: none; + border: 0; + padding: 0; + background: transparent; + color: inherit; + font-family: inherit; + font-size: inherit; + outline: 0; + cursor: pointer; +} + +.variant-switcher .variant-chevron { + color: var(--kit-fg-faint); + font-size: 0.58rem; +} + +.capture-open:hover .capture-frame, +.capture-card.selected .capture-frame { + outline-color: var(--catalog-frame-line-strong); +} + +.capture-open:focus-visible { + outline: 0; +} + +.capture-open:focus-visible .capture-frame { + outline: 1px solid var(--catalog-accent); + outline-offset: 0.3rem; +} + +.capture-caption { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 1rem; + min-width: 0; +} + +.capture-actions { + position: relative; + flex: 0 0 auto; +} + +.capture-actions > summary { + display: grid; + width: 1.8rem; + height: 1.5rem; + place-items: center; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.7rem; + letter-spacing: 0.08em; + list-style: none; + cursor: pointer; +} + +.capture-actions > summary::-webkit-details-marker { + display: none; +} + +.capture-actions > summary:hover, +.capture-actions > summary:focus-visible, +.capture-actions[open] > summary { + color: var(--kit-fg-strong); + background: var(--kit-bg-hover); +} + +.capture-actions-menu { + position: absolute; + z-index: 90; + right: 0; + bottom: calc(100% + 0.35rem); + display: grid; + width: 10.5rem; + padding: 0.3rem; + border: 1px solid var(--kit-line-strong); + background: #202020; + box-shadow: 0 16px 48px rgb(0 0 0 / 60%); +} + +.capture-actions-menu button, +.capture-actions-menu a { + display: flex; + min-height: 2.2rem; + align-items: center; + padding: 0 0.7rem; + color: var(--kit-fg); + font-family: var(--kit-mono); + font-size: 0.65rem; + text-align: left; +} + +.capture-actions-menu button:hover, +.capture-actions-menu button:focus-visible, +.capture-actions-menu a:hover, +.capture-actions-menu a:focus-visible { + background: rgb(255 255 255 / 7%); + color: var(--kit-fg-strong); +} + +.capture-title { + overflow: hidden; + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.66rem; + font-weight: 500; + line-height: 1.35; + text-overflow: ellipsis; + white-space: nowrap; +} + +.capture-title-wrap { + display: grid; + min-width: 0; + gap: 0.2rem; +} + +.capture-state { + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.52rem; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.capture-card.selected .capture-title { + color: var(--kit-fg-strong); +} + +.empty-state { + display: grid; + grid-column: 1 / -1; + margin: 0; + padding: 6rem 0; + justify-items: center; + gap: 1rem; + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.72rem; + text-align: center; +} + +.empty-state p { + margin: 0; +} + +.empty-state button { + min-height: 2.1rem; + padding: 0 0.9rem; + border: 1px solid var(--kit-line-strong); + color: var(--kit-fg-muted); +} + +.empty-state button:hover { + background: var(--kit-bg-hover); + color: var(--kit-fg-strong); +} + +/* ---------------------------------- flows --------------------------------- */ + +.flow-browser { + display: grid; + min-height: calc(100dvh - var(--catalog-header-height)); + grid-template-columns: var(--catalog-sidebar-width) minmax(0, 1fr); +} + +.flow-sidebar { + position: sticky; + top: var(--catalog-header-height); + height: calc(100dvh - var(--catalog-header-height)); + overflow-y: auto; + border-right: 1px solid var(--kit-line); + background: #101010; + scrollbar-width: thin; +} + +.flow-sidebar-heading { + display: flex; + min-height: 3.5rem; + align-items: center; + justify-content: space-between; + padding: 0 1.25rem; + border-bottom: 1px solid var(--kit-line); + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.64rem; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.flow-sidebar-heading small { + color: var(--kit-fg-faint); + font-size: 0.58rem; + font-variant-numeric: tabular-nums; +} + +.flow-navigation { + padding: 0.8rem 0.65rem 2rem; +} + +.flow-navigation section + section { + padding-top: 1rem; +} + +.flow-navigation h2 { + margin: 0; + padding: 0.55rem 0.6rem; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.56rem; + font-weight: 500; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.flow-navigation button { + display: grid; + width: 100%; + min-height: 2.45rem; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: 0.75rem; + padding: 0 0.65rem; + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.65rem; + text-align: left; +} + +.flow-navigation button span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.flow-navigation button small { + color: var(--kit-fg-faint); + font-size: 0.55rem; + font-variant-numeric: tabular-nums; +} + +.flow-navigation button:hover, +.flow-navigation button.active { + background: rgb(255 255 255 / 5%); + color: var(--kit-fg-strong); +} + +.flow-navigation button.active { + box-shadow: inset 2px 0 0 var(--catalog-accent); +} + +.flow-mobile-nav { + display: none; +} + +.flow-content { + min-width: 0; + overflow: hidden; + padding: clamp(1.5rem, 3vw, 3rem) 0 5rem; +} + +.flow-heading { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 0.7rem 2rem; + padding: 0 clamp(1.5rem, 3vw, 3rem) 2rem; +} + +.flow-heading > div p, +.flow-heading > p { + margin: 0; +} + +.flow-browse-only { + width: fit-content; + grid-column: 1 / -1; + padding-top: 0.25rem; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.58rem; +} + +.flow-heading > div p { + padding-bottom: 0.45rem; + color: var(--catalog-accent); + font-family: var(--kit-mono); + font-size: 0.58rem; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.flow-heading h1 { + margin: 0; + color: var(--kit-fg-strong); + font-size: clamp(1.35rem, 2.2vw, 2rem); + font-weight: 550; + letter-spacing: -0.025em; +} + +.flow-heading > span { + align-self: end; + padding-bottom: 0.25rem; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.62rem; + font-variant-numeric: tabular-nums; +} + +.flow-heading > p { + max-width: 44rem; + grid-column: 1 / -1; + color: var(--kit-fg-muted); + font-size: 0.82rem; + line-height: 1.55; +} + +.flow-rail { + display: grid; + grid-auto-columns: minmax(27rem, 34rem); + grid-auto-flow: column; + gap: 1.5rem; + margin: 0; + padding: 0 clamp(1.5rem, 3vw, 3rem) 1.5rem; + overflow-x: auto; + overscroll-behavior-inline: contain; + scroll-padding-inline: clamp(1.5rem, 3vw, 3rem); + scroll-snap-type: inline proximity; + scrollbar-width: thin; +} + +.flow-step { + display: grid; + min-width: 0; + gap: 0.75rem; + scroll-snap-align: start; +} + +.flow-step-unavailable { + min-height: 8rem; + grid-template-columns: auto minmax(0, 1fr); + align-content: center; + padding: 1rem; + border: 1px dashed var(--kit-line-strong); + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.62rem; +} + +.flow-step-unavailable strong { + color: var(--kit-fg-muted); + font-weight: 500; +} + +.flow-step-unavailable small { + grid-column: 2; +} + +.flow-open { + display: block; + width: 100%; + text-align: left; +} + +.flow-frame { + display: block; + outline: 1px solid var(--catalog-frame-line); + outline-offset: -1px; +} + +.flow-open:hover .flow-frame, +.flow-open:focus-visible .flow-frame { + outline-color: var(--catalog-frame-line-strong); +} + +.flow-open:focus-visible { + outline: 0; +} + +.flow-open:focus-visible .flow-frame { + outline: 1px solid var(--catalog-accent); + outline-offset: 0.3rem; +} + +.flow-frame canvas { + display: block; + width: 100%; + height: auto; +} + +.flow-step-meta { + display: grid; + grid-template-columns: 1.6rem minmax(0, 1fr); + align-items: baseline; + gap: 0.7rem; +} + +.flow-step-number { + color: var(--catalog-accent); + font-family: var(--kit-mono); + font-size: 0.6rem; + font-variant-numeric: tabular-nums; +} + +.flow-step-text { + display: grid; + gap: 0.3rem; + min-width: 0; +} + +.flow-step-title { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 1rem; + min-width: 0; +} + +.flow-step-meta strong { + min-width: 0; + overflow: hidden; + color: var(--kit-fg-strong); + font-size: 0.83rem; + font-weight: 550; + text-overflow: ellipsis; + white-space: nowrap; +} + +.flow-step-meta small { + overflow: hidden; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.58rem; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* --------------------------------- viewer --------------------------------- */ + +.viewer { + width: 100vw; + height: 100dvh; + max-width: 100vw; + max-height: 100dvh; + margin: 0; + padding: 0; + border: 0; + background: var(--kit-bg); + color: var(--kit-fg); +} + +.viewer[open] { + display: grid; + grid-template-rows: 3rem minmax(0, 1fr); +} + +.viewer::backdrop { + background: transparent; +} + +.viewer-header { + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: stretch; + border-bottom: 1px solid var(--kit-line); +} + +.viewer-header > .viewer-button:first-child { + justify-self: start; + border-right: 1px solid var(--kit-line); +} + +.viewer-position { + align-self: center; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.62rem; + letter-spacing: 0.08em; +} + +.viewer-actions { + display: flex; + align-items: center; + justify-content: flex-end; +} + +.viewer-actions .capture-actions { + align-self: center; + margin-inline: 0.4rem; +} + +.viewer-button { + display: inline-flex; + align-items: center; + gap: 0.5rem; +} + +.viewer-actions .viewer-button { + border-left: 1px solid var(--kit-line); +} + +.viewer-body { + display: grid; + min-height: 0; + grid-template-columns: minmax(0, 1fr); +} + +.viewer-stage { + position: relative; + display: grid; + min-width: 0; + min-height: 0; + place-items: center; + overflow: auto; + padding: clamp(1rem, 3vw, 3rem); + background: var(--kit-bg-inset); +} + +.viewer-figure { + display: grid; + max-width: 100%; + max-height: 100%; + gap: 0.9rem; + margin: 0; +} + +.viewer-image-wrap { + position: relative; + max-width: 100%; + max-height: 100%; + justify-self: start; + outline: 1px solid var(--catalog-frame-line); + outline-offset: -1px; +} + +.viewer-image-wrap canvas { + display: block; + width: auto; + max-width: 100%; + max-height: calc(100dvh - 13rem); + user-select: none; + -webkit-user-drag: none; +} + +.viewer-variant { + display: flex; + align-items: center; + gap: 0.45rem; + padding: 0 0.8rem; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.58rem; +} + +.viewer-variant strong { + color: var(--kit-fg-muted); + font-weight: 600; +} + +.viewer-caption { + display: grid; + gap: 0.8rem; +} + +.viewer-caption h3 { + margin: 0; + color: var(--kit-fg-strong); + font-family: var(--kit-mono); + font-size: 0.72rem; + font-weight: 650; + letter-spacing: 0.02em; +} + +.viewer-label-groups { + display: grid; + gap: 0.55rem; +} + +.viewer-label-groups section { + display: grid; + grid-template-columns: 5.5rem minmax(0, 1fr); + align-items: baseline; + gap: 0.75rem; +} + +.viewer-label-groups h4 { + margin: 0; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.54rem; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.viewer-facets { + display: flex; + flex-wrap: wrap; + gap: 0.3rem 0.4rem; +} + +.viewer-facets button { + padding: 0.15rem 0.35rem; + background: rgb(255 255 255 / 4%); + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.62rem; +} + +.viewer-facets button:hover, +.viewer-facets button:focus-visible { + background: var(--kit-bg-hover); + color: var(--kit-fg-strong); +} + +/* ------------------------------ command palette --------------------------- */ + +.command-dialog { + width: min(38rem, calc(100vw - 2rem)); + max-height: 72dvh; + margin: 12dvh auto auto; + padding: 0; + overflow: hidden; + border: 1px solid var(--kit-line-strong); + background: var(--kit-bg); + color: var(--kit-fg); + box-shadow: 0 24px 80px rgb(0 0 0 / 55%); +} + +.command-dialog[open] { + display: grid; + grid-template-rows: auto minmax(0, 1fr) auto; +} + +.command-dialog::backdrop { + background: rgb(0 0 0 / 65%); + backdrop-filter: blur(4px); +} + +.command-input-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + border-bottom: 1px solid var(--kit-line); +} + +.command-input-row input { + min-height: 3.25rem; + border: 0; + padding: 0 1rem; + background: transparent; + color: var(--kit-fg-strong); + font-size: 0.82rem; + outline: 0; +} + +.command-input-row input::placeholder { + color: var(--kit-fg-faint); +} + +.command-input-row kbd { + margin-right: 1rem; +} + +.command-results { + overflow-y: auto; + padding: 0.5rem 0.5rem 0.75rem; + scrollbar-width: thin; +} + +.command-group + .command-group { + margin-top: 0.5rem; + padding-top: 0.5rem; + border-top: 1px solid var(--kit-line); +} + +.command-group h2 { + margin: 0; + padding: 0.5rem 0.65rem 0.35rem; + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.6rem; + font-weight: 500; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.command-result { + display: grid; + width: 100%; + min-height: 2.25rem; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: 1rem; + padding: 0 0.65rem; + color: var(--kit-fg); + font-size: 0.8rem; + text-align: left; +} + +.command-result small { + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.6rem; +} + +.command-result.active { + background: var(--kit-bg-hover); + color: var(--kit-fg-strong); + box-shadow: inset 2px 0 0 var(--catalog-accent); +} + +.command-selected { + margin-left: 0.6rem; + color: var(--catalog-accent); + font-family: var(--kit-mono); + font-size: 0.58rem; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +.command-hint { + margin: 0; + padding: 0.6rem 1rem; + border-top: 1px solid var(--kit-line-strong); + color: var(--kit-fg-faint); + font-family: var(--kit-mono); + font-size: 0.6rem; +} + +.command-empty { + margin: 0; + padding: 1.25rem 1rem; + color: var(--kit-fg-muted); + font-family: var(--kit-mono); + font-size: 0.72rem; +} + +/* -------------------------------- responsive ------------------------------ */ + +@media (max-width: 1280px) { + .capture-family-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .catalog-brand { + min-width: auto; + } + + .catalog-search { + width: 11rem; + } +} + +@media (max-width: 1024px) { + :root { + --catalog-header-height: 7.5rem; + } + + .catalog-header { + grid-template-columns: auto minmax(0, 1fr); + grid-template-rows: 3.75rem 3.75rem; + } + + .catalog-brand { + grid-column: 1; + grid-row: 1; + } + + .catalog-tabs { + grid-column: 2; + grid-row: 1; + } + + .catalog-tools { + grid-column: 1 / -1; + grid-row: 2; + border-top: 1px solid var(--kit-line); + } + + .catalog-tools > :first-child { + margin-left: auto; + } + + .catalog-search { + width: min(16rem, 26vw); + } + + .capture-family-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 2rem 1.5rem; + } + + .flow-browser { + grid-template-columns: 16rem minmax(0, 1fr); + } + + .flow-rail { + grid-auto-columns: minmax(24rem, 30rem); + } +} + +@media (max-width: 760px) { + :root { + --catalog-header-height: 10.5rem; + } + + .catalog-header { + position: relative; + grid-template-columns: minmax(0, 1fr); + grid-template-rows: 3.5rem 3rem 4rem; + } + + .catalog-brand { + grid-column: 1; + grid-row: 1; + border-right: 0; + } + + .catalog-tabs { + grid-column: 1; + grid-row: 2; + padding: 0; + border-top: 1px solid var(--kit-line); + } + + .catalog-tabs button { + flex: 1; + } + + .catalog-tools { + grid-column: 1; + grid-row: 3; + overflow-x: auto; + justify-content: flex-start; + } + + .catalog-tools > :first-child { + margin-left: 0; + } + + .filter-bar { + top: 0; + overflow-x: auto; + scrollbar-width: none; + } + + .filter-bar::-webkit-scrollbar { + display: none; + } + + .filter-bar-chips { + overflow-x: visible; + } + + .filter-popover { + position: fixed; + top: 4rem; + right: 1rem; + left: 1rem; + width: auto; + max-height: calc(100dvh - 5rem); + } + + .catalog-search { + width: 12rem; + flex: none; + } + + .contact-sheet { + padding: 1rem 1rem 3rem; + } + + .capture-family-grid { + grid-template-columns: minmax(0, 1fr); + gap: 1.5rem; + } + + .capture-family + .capture-family { + margin-top: 2.25rem; + } + + .matrix-navigation { + position: sticky; + top: var(--catalog-filterbar-height); + grid-template-columns: minmax(0, 1fr); + } + + .flow-browser { + display: block; + min-height: auto; + } + + .flow-sidebar { + display: none; + } + + .flow-mobile-nav { + display: block; + border-bottom: 1px solid var(--kit-line); + background: #101010; + } + + .flow-mobile-nav summary { + display: flex; + min-height: 3.5rem; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 0 1rem; + color: var(--kit-fg-strong); + font-family: var(--kit-mono); + font-size: 0.68rem; + list-style: none; + } + + .flow-mobile-nav summary::-webkit-details-marker { + display: none; + } + + .flow-mobile-nav summary small { + color: var(--kit-fg-faint); + font-size: 0.55rem; + font-weight: 400; + } + + .flow-mobile-nav .flow-navigation { + max-height: 55dvh; + overflow-y: auto; + border-top: 1px solid var(--kit-line); + } + + .flow-heading { + grid-template-columns: minmax(0, 1fr); + padding-bottom: 1.5rem; + } + + .flow-heading > span { + align-self: auto; + } + + .flow-rail { + grid-auto-columns: minmax(18rem, 86vw); + gap: 1rem; + } + + .viewer-position, + .viewer-button kbd { + display: none; + } +} + +@media (max-width: 460px) { + .catalog-brand { + padding: 0 1rem; + } + + .command-trigger { + padding: 0 0.85rem; + } + + .command-trigger > :first-child { + display: none; + } + + .viewer-label-groups section { + grid-template-columns: minmax(0, 1fr); + gap: 0.3rem; + } +} diff --git a/packages/lab/catalog/tsconfig.json b/packages/lab/catalog/tsconfig.json new file mode 100644 index 00000000000..bfe68fa12fd --- /dev/null +++ b/packages/lab/catalog/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "Preserve", + "moduleResolution": "bundler", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "noEmit": true, + "skipLibCheck": true, + "types": ["bun", "react", "react-dom"] + }, + "include": ["src", "catalog", "compile", "scripts", "server.ts"] +} diff --git a/packages/lab/catalog/worker.ts b/packages/lab/catalog/worker.ts new file mode 100644 index 00000000000..be996fdd099 --- /dev/null +++ b/packages/lab/catalog/worker.ts @@ -0,0 +1,16 @@ +interface Env { + readonly ASSETS: { fetch(request: Request): Promise } +} + +export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url) + url.pathname = assetPath(url.pathname) + return env.ASSETS.fetch(new Request(url, request)) + }, +} + +export function assetPath(pathname: string) { + const path = pathname.slice("/lab/catalog".length) + return path === "" || path === "/" || !path.includes(".") ? "/index.html" : path +} diff --git a/packages/lab/catalog/wrangler.jsonc b/packages/lab/catalog/wrangler.jsonc new file mode 100644 index 00000000000..28a235cfb4e --- /dev/null +++ b/packages/lab/catalog/wrangler.jsonc @@ -0,0 +1,19 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "opencode-lab-catalog", + "main": "worker.ts", + "compatibility_date": "2026-08-12", + "workers_dev": false, + "preview_urls": false, + "assets": { + "directory": "./dist", + "binding": "ASSETS", + "html_handling": "none", + }, + "routes": [ + { + "pattern": "dev.opencode.ai/lab/catalog*", + "zone_name": "opencode.ai", + }, + ], +} diff --git a/packages/merman/src/core/canvas.test.ts b/packages/merman/src/core/canvas.test.ts index 59b343d32c6..2b1030d6050 100644 --- a/packages/merman/src/core/canvas.test.ts +++ b/packages/merman/src/core/canvas.test.ts @@ -4,7 +4,7 @@ import { DiagramCanvas, DiagramCanvasSizeError, type DiagramCanvasCell } from ". describe("DiagramCanvas", () => { test("rejects canvases that exceed the rendering budget", () => { - expect(() => new DiagramCanvas(2_000, 1_000)).toThrow(DiagramCanvasSizeError) + expect(() => new DiagramCanvas(1_000, 251)).toThrow(DiagramCanvasSizeError) }) test("rejects invalid canvas dimensions", () => { @@ -38,6 +38,12 @@ describe("DiagramCanvas", () => { expect(stringWidth(canvas.toString())).toBe(4) }) + test("does not emit partial wide graphemes", () => { + const clipped = new DiagramCanvas<"label">(1, 1) + clipped.setText(0, 0, "界", "label") + expect(clipped.toString()).toBe("") + }) + test("keeps custom measurement for ASCII text", () => { let measurements = 0 const canvas = new DiagramCanvas<"label">(5, 1, { diff --git a/packages/merman/src/core/canvas.ts b/packages/merman/src/core/canvas.ts index 4b6b4c013a6..d932d928cd0 100644 --- a/packages/merman/src/core/canvas.ts +++ b/packages/merman/src/core/canvas.ts @@ -40,7 +40,7 @@ export interface DiagramCanvasRunOptions