diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000000..51298ca8a81
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,6 @@
+# Git LFS tracking for binary/media files
+*.gif filter=lfs diff=lfs merge=lfs -text
+*.mp4 filter=lfs diff=lfs merge=lfs -text
+
+# Visual regression baseline snapshots
+packages/kilo-ui/tests/**/*.png filter=lfs diff=lfs merge=lfs -text
diff --git a/.github/workflows/test-vscode.yml b/.github/workflows/test-vscode.yml
index 899ef321767..fef0bd11709 100644
--- a/.github/workflows/test-vscode.yml
+++ b/.github/workflows/test-vscode.yml
@@ -6,9 +6,13 @@ on:
- dev
paths:
- "packages/kilo-vscode/**"
+ - "packages/ui/**"
+ - "packages/kilo-ui/**"
pull_request:
paths:
- "packages/kilo-vscode/**"
+ - "packages/ui/**"
+ - "packages/kilo-ui/**"
workflow_dispatch:
jobs:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 344830138e1..86ec616de0e 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -39,6 +39,8 @@ jobs:
run: bun turbo test
e2e:
+ # kilocode_change - disabled: packages/app is not actively maintained
+ if: false
name: e2e (${{ matrix.settings.name }})
needs: unit
strategy:
@@ -98,12 +100,9 @@ jobs:
runs-on: blacksmith-4vcpu-ubuntu-2404
needs:
- unit
- - e2e
if: always()
steps:
- name: Verify upstream test jobs passed
run: |
echo "unit=${{ needs.unit.result }}"
- echo "e2e=${{ needs.e2e.result }}"
test "${{ needs.unit.result }}" = "success"
- test "${{ needs.e2e.result }}" = "success"
diff --git a/.github/workflows/visual-regression.yml b/.github/workflows/visual-regression.yml
new file mode 100644
index 00000000000..d764fd30543
--- /dev/null
+++ b/.github/workflows/visual-regression.yml
@@ -0,0 +1,103 @@
+name: Visual Regression Tests
+
+on:
+ pull_request:
+ paths:
+ - "packages/kilo-ui/**"
+ - "packages/ui/**"
+ - "packages/util/**"
+ - "packages/sdk/js/**"
+ - ".github/workflows/visual-regression.yml"
+
+jobs:
+ visual-regression:
+ name: Visual Regression (kilo-ui)
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ timeout-minutes: 15
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ lfs: true
+ token: ${{ secrets.GITHUB_TOKEN }}
+ ref: ${{ github.head_ref }}
+
+ - name: Setup Bun
+ uses: oven-sh/setup-bun@v2
+ with:
+ bun-version: latest
+
+ - name: Cache Bun modules
+ uses: actions/cache@v4
+ with:
+ path: ~/.bun/install/cache
+ key: bun-${{ hashFiles('bun.lock') }}
+
+ - name: Install dependencies
+ run: bun install
+
+ - name: Cache Playwright browsers
+ id: playwright-cache
+ uses: actions/cache@v4
+ with:
+ path: ~/.cache/ms-playwright
+ key: playwright-${{ hashFiles('packages/kilo-ui/package.json') }}
+
+ - name: Install Playwright browsers
+ if: steps.playwright-cache.outputs.cache-hit != 'true'
+ run: bunx playwright install chromium
+ working-directory: packages/kilo-ui
+
+ - name: Install Playwright system deps
+ run: bunx playwright install-deps chromium
+ working-directory: packages/kilo-ui
+
+ - name: Cache Storybook build
+ id: storybook-cache
+ uses: actions/cache@v4
+ with:
+ path: packages/kilo-ui/storybook-static
+ key: storybook-${{ hashFiles('packages/kilo-ui/src/**', 'packages/kilo-ui/.storybook/**', 'packages/ui/src/**', 'packages/kilo-ui/package.json') }}
+
+ - name: Build Storybook
+ if: steps.storybook-cache.outputs.cache-hit != 'true'
+ run: bun run build-storybook
+ working-directory: packages/kilo-ui
+
+ - name: Generate baselines for new/missing stories
+ run: bun run test:visual:update
+ working-directory: packages/kilo-ui
+ env:
+ CI: true
+ PLAYWRIGHT_WORKERS: "4"
+
+ - name: Commit and push new baselines (if any)
+ id: commit-baselines
+ run: |
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+ git add packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/
+ if git diff --cached --quiet; then
+ echo "No new baselines — nothing to commit."
+ echo "changed=false" >> "$GITHUB_OUTPUT"
+ else
+ git commit -m "chore: update visual regression baselines"
+ git lfs push --all origin
+ git push
+ echo "changed=true" >> "$GITHUB_OUTPUT"
+ fi
+
+ - name: Fail if baselines changed
+ if: steps.commit-baselines.outputs.changed == 'true'
+ run: |
+ echo "::error::Visual regression baselines changed. New baselines have been committed to the branch. Please pull and review."
+ exit 1
+
+ - name: Upload test results on failure
+ if: failure()
+ uses: actions/upload-artifact@v4
+ with:
+ name: visual-regression-results
+ path: packages/kilo-ui/test-results/
+ retention-days: 7
diff --git a/SECURITY.md b/SECURITY.md
index c0c5faaa2e4..aca8b556832 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -36,12 +36,10 @@ Server mode is opt-in only. When enabled, set `KILO_SERVER_PASSWORD` to require
# Reporting Security Issues
-We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.
+We value the contributions of the security research community and recognize the importance of a coordinated approach to vulnerability disclosure. If you have discovered a security vulnerability, we encourage you to let us know immediately. We welcome the opportunity to work with you to resolve the issue promptly.
-To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/Kilo-Org/kilocode/security/advisories/new) tab.
+Please email your findings to [security@kilo.ai](mailto:security@kilo.ai). We will acknowledge your report and work with you to resolve the issue.
-The team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.
+After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.
-## Escalation
-
-If you do not receive an acknowledgement of your report within 6 business days, you may send an email to hi@kilo.ai
+For more details, see our [Security Disclosure](https://kilo.ai/security) page.
diff --git a/bun.lock b/bun.lock
index 4821ba9524f..b26f2e9e39d 100644
--- a/bun.lock
+++ b/bun.lock
@@ -25,7 +25,7 @@
},
"packages/app": {
"name": "@opencode-ai/app",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"@kilocode/kilo-i18n": "workspace:*",
"@kilocode/kilo-ui": "workspace:*",
@@ -77,7 +77,7 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"@opencode-ai/app": "workspace:*",
"@opencode-ai/ui": "workspace:*",
@@ -110,7 +110,7 @@
},
"packages/kilo-docs": {
"name": "@kilocode/kilo-docs",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"@docsearch/css": "^4",
"@docsearch/js": "^4",
@@ -118,6 +118,7 @@
"@markdoc/next.js": "^0.5.0",
"@vscode/codicons": "^0.0.44",
"js-yaml": "^4.1.0",
+ "mermaid": "11.12.3",
"next": "^16.1.5",
"posthog-js": "^1.335.3",
"prismjs": "^1.30.0",
@@ -138,7 +139,7 @@
},
"packages/kilo-gateway": {
"name": "@kilocode/kilo-gateway",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"@clack/prompts": "1.0.0-alpha.1",
"@kilocode/plugin": "workspace:*",
@@ -170,7 +171,7 @@
},
"packages/kilo-i18n": {
"name": "@kilocode/kilo-i18n",
- "version": "7.0.32",
+ "version": "7.0.33",
"devDependencies": {
"@tsconfig/node22": "catalog:",
"@types/bun": "catalog:",
@@ -180,7 +181,7 @@
},
"packages/kilo-telemetry": {
"name": "@kilocode/kilo-telemetry",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"@kilocode/kilo-gateway": "workspace:*",
"@opentelemetry/api": "1.9.0",
@@ -200,11 +201,12 @@
},
"packages/kilo-ui": {
"name": "@kilocode/kilo-ui",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"@kobalte/core": "0.13.11",
},
"devDependencies": {
+ "@playwright/test": "1.58.2",
"@storybook/addon-a11y": "10.2.10",
"@storybook/addon-docs": "10.2.10",
"@storybook/addon-themes": "10.2.10",
@@ -223,7 +225,7 @@
},
"packages/kilo-vscode": {
"name": "kilo-code",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"@anthropic-ai/sdk": "^0.39.0",
"@kilocode/kilo-i18n": "workspace:*",
@@ -267,7 +269,7 @@
},
"packages/opencode": {
"name": "@kilocode/cli",
- "version": "7.0.32",
+ "version": "7.0.33",
"bin": {
"opencode": "./bin/opencode",
},
@@ -384,7 +386,7 @@
},
"packages/plugin": {
"name": "@kilocode/plugin",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"@kilocode/sdk": "workspace:*",
"zod": "catalog:",
@@ -398,14 +400,14 @@
},
"packages/script": {
"name": "@opencode-ai/script",
- "version": "7.0.32",
+ "version": "7.0.33",
"devDependencies": {
"@types/bun": "catalog:",
},
},
"packages/sdk/js": {
"name": "@kilocode/sdk",
- "version": "7.0.32",
+ "version": "7.0.33",
"devDependencies": {
"@hey-api/openapi-ts": "0.90.10",
"@tsconfig/node22": "catalog:",
@@ -416,7 +418,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"@kilocode/sdk": "workspace:*",
"@kobalte/core": "catalog:",
@@ -458,7 +460,7 @@
},
"packages/util": {
"name": "@opencode-ai/util",
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {
"zod": "catalog:",
},
@@ -592,6 +594,8 @@
"@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
+ "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="],
+
"@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.39.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg=="],
"@anycable/core": ["@anycable/core@0.9.2", "", { "dependencies": { "nanoevents": "^7.0.1" } }, "sha512-x5ZXDcW/N4cxWl93CnbHs/u7qq4793jS2kNPWm+duPrXlrva+ml2ZGT7X9tuOBKzyIHf60zWCdIK7TUgMPAwXA=="],
@@ -788,10 +792,22 @@
"@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="],
+ "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.2", "", {}, "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA=="],
+
"@bufbuild/protobuf": ["@bufbuild/protobuf@2.11.0", "", {}, "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ=="],
"@bufbuild/protoplugin": ["@bufbuild/protoplugin@2.11.0", "", { "dependencies": { "@bufbuild/protobuf": "2.11.0", "@typescript/vfs": "^1.6.2", "typescript": "5.4.5" } }, "sha512-lyZVNFUHArIOt4W0+dwYBe5GBwbKzbOy8ObaloEqsw9Mmiwv2O48TwddDoHN4itylC+BaEGqFdI1W8WQt2vWJQ=="],
+ "@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@11.1.1", "", { "dependencies": { "@chevrotain/gast": "11.1.1", "@chevrotain/types": "11.1.1", "lodash-es": "4.17.23" } }, "sha512-fRHyv6/f542qQqiRGalrfJl/evD39mAvbJLCekPazhiextEatq1Jx1K/i9gSd5NNO0ds03ek0Cbo/4uVKmOBcw=="],
+
+ "@chevrotain/gast": ["@chevrotain/gast@11.1.1", "", { "dependencies": { "@chevrotain/types": "11.1.1", "lodash-es": "4.17.23" } }, "sha512-Ko/5vPEYy1vn5CbCjjvnSO4U7GgxyGm+dfUZZJIWTlQFkXkyym0jFYrWEU10hyCjrA7rQtiHtBr0EaZqvHFZvg=="],
+
+ "@chevrotain/regexp-to-ast": ["@chevrotain/regexp-to-ast@11.1.1", "", {}, "sha512-ctRw1OKSXkOrR8VTvOxrQ5USEc4sNrfwXHa1NuTcR7wre4YbjPcKw+82C2uylg/TEwFRgwLmbhlln4qkmDyteg=="],
+
+ "@chevrotain/types": ["@chevrotain/types@11.1.1", "", {}, "sha512-wb2ToxG8LkgPYnKe9FH8oGn3TMCBdnwiuNC5l5y+CtlaVRbCytU0kbVsk6CGrqTL4ZN4ksJa0TXOYbxpbthtqw=="],
+
+ "@chevrotain/utils": ["@chevrotain/utils@11.1.1", "", {}, "sha512-71eTYMzYXYSFPrbg/ZwftSaSDld7UYlS8OQa3lNnn9jzNtpFbaReRRyghzqS7rI3CDaorqpPJJcXGHK+FE1TVQ=="],
+
"@clack/core": ["@clack/core@1.0.0-alpha.1", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-rFbCU83JnN7l3W1nfgCqqme4ZZvTTgsiKQ6FM0l+r0P+o2eJpExcocBUWUIwnDzL76Aca9VhUdWmB2MbUv+Qyg=="],
"@clack/prompts": ["@clack/prompts@1.0.0-alpha.1", "", { "dependencies": { "@clack/core": "1.0.0-alpha.1", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-07MNT0OsxjKOcyVfX8KhXBhJiyUbDP1vuIAcHc+nx5v93MJO23pX3X/k3bWz6T3rpM9dgWPq90i4Jq7gZAyMbw=="],
@@ -930,6 +946,10 @@
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
+ "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
+
+ "@iconify/utils": ["@iconify/utils@3.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "mlly": "^1.8.0" } }, "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw=="],
+
"@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="],
"@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=="],
@@ -1104,6 +1124,8 @@
"@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="],
+ "@mermaid-js/parser": ["@mermaid-js/parser@1.0.0", "", { "dependencies": { "langium": "^4.0.0" } }, "sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw=="],
+
"@mixmark-io/domino": ["@mixmark-io/domino@2.2.0", "", {}, "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="],
"@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="],
@@ -1272,7 +1294,7 @@
"@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
- "@playwright/test": ["@playwright/test@1.57.0", "", { "dependencies": { "playwright": "1.57.0" }, "bin": { "playwright": "cli.js" } }, "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA=="],
+ "@playwright/test": ["@playwright/test@1.58.2", "", { "dependencies": { "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" } }, "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA=="],
"@posthog/core": ["@posthog/core@1.23.1", "", { "dependencies": { "cross-spawn": "^7.0.6" } }, "sha512-GViD5mOv/mcbZcyzz3z9CS0R79JzxVaqEz4sP5Dsea178M/j3ZWe6gaHDZB9yuyGfcmIMQ/8K14yv+7QrK4sQQ=="],
@@ -1694,12 +1716,76 @@
"@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
+ "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="],
+
+ "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="],
+
+ "@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="],
+
+ "@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="],
+
+ "@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="],
+
+ "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="],
+
+ "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="],
+
+ "@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="],
+
+ "@types/d3-dispatch": ["@types/d3-dispatch@3.0.7", "", {}, "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA=="],
+
+ "@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="],
+
+ "@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="],
+
+ "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="],
+
+ "@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="],
+
+ "@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="],
+
+ "@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="],
+
+ "@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="],
+
+ "@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="],
+
+ "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="],
+
+ "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="],
+
+ "@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="],
+
+ "@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="],
+
+ "@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="],
+
+ "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
+
+ "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="],
+
+ "@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="],
+
+ "@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="],
+
+ "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
+
+ "@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="],
+
+ "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="],
+
+ "@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="],
+
+ "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="],
+
"@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="],
"@types/diff": ["@types/diff@6.0.0", "", {}, "sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA=="],
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+ "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
+
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
"@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="],
@@ -2040,6 +2126,10 @@
"cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="],
+ "chevrotain": ["chevrotain@11.1.1", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.1.1", "@chevrotain/gast": "11.1.1", "@chevrotain/regexp-to-ast": "11.1.1", "@chevrotain/types": "11.1.1", "@chevrotain/utils": "11.1.1", "lodash-es": "4.17.23" } }, "sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ=="],
+
+ "chevrotain-allstar": ["chevrotain-allstar@0.3.1", "", { "dependencies": { "lodash-es": "^4.17.21" }, "peerDependencies": { "chevrotain": "^11.0.0" } }, "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw=="],
+
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
"chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
@@ -2096,6 +2186,8 @@
"cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="],
+ "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="],
+
"crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="],
"crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="],
@@ -2112,8 +2204,82 @@
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
+ "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="],
+
+ "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="],
+
+ "cytoscape-fcose": ["cytoscape-fcose@2.2.0", "", { "dependencies": { "cose-base": "^2.2.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ=="],
+
+ "d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="],
+
+ "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
+
+ "d3-axis": ["d3-axis@3.0.0", "", {}, "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="],
+
+ "d3-brush": ["d3-brush@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "3", "d3-transition": "3" } }, "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ=="],
+
+ "d3-chord": ["d3-chord@3.0.1", "", { "dependencies": { "d3-path": "1 - 3" } }, "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g=="],
+
+ "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="],
+
+ "d3-contour": ["d3-contour@4.0.2", "", { "dependencies": { "d3-array": "^3.2.0" } }, "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA=="],
+
+ "d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="],
+
+ "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="],
+
+ "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="],
+
+ "d3-dsv": ["d3-dsv@3.0.1", "", { "dependencies": { "commander": "7", "iconv-lite": "0.6", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json.js", "csv2tsv": "bin/dsv2dsv.js", "dsv2dsv": "bin/dsv2dsv.js", "dsv2json": "bin/dsv2json.js", "json2csv": "bin/json2dsv.js", "json2dsv": "bin/json2dsv.js", "json2tsv": "bin/json2dsv.js", "tsv2csv": "bin/dsv2dsv.js", "tsv2json": "bin/dsv2json.js" } }, "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q=="],
+
+ "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="],
+
+ "d3-fetch": ["d3-fetch@3.0.1", "", { "dependencies": { "d3-dsv": "1 - 3" } }, "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw=="],
+
+ "d3-force": ["d3-force@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", "d3-timer": "1 - 3" } }, "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg=="],
+
+ "d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="],
+
+ "d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="],
+
+ "d3-hierarchy": ["d3-hierarchy@3.1.2", "", {}, "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="],
+
+ "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
+
+ "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
+
+ "d3-polygon": ["d3-polygon@3.0.1", "", {}, "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="],
+
+ "d3-quadtree": ["d3-quadtree@3.0.1", "", {}, "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="],
+
+ "d3-random": ["d3-random@3.0.1", "", {}, "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="],
+
+ "d3-sankey": ["d3-sankey@0.12.3", "", { "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ=="],
+
+ "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
+
+ "d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="],
+
+ "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="],
+
+ "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="],
+
+ "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="],
+
+ "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="],
+
+ "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="],
+
+ "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="],
+
+ "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="],
+
+ "dagre-d3-es": ["dagre-d3-es@7.0.13", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q=="],
+
"data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
+ "dayjs": ["dayjs@1.11.19", "", {}, "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="],
+
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="],
@@ -2138,6 +2304,8 @@
"defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
+ "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="],
+
"delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
"depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
@@ -2420,6 +2588,8 @@
"gtoken": ["gtoken@8.0.0", "", { "dependencies": { "gaxios": "^7.0.0", "jws": "^4.0.0" } }, "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw=="],
+ "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="],
+
"happy-dom": ["happy-dom@20.5.0", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "entities": "^4.5.0", "whatwg-mimetype": "^3.0.0", "ws": "^8.18.3" } }, "sha512-VQe+Q5CYiGOgcCERXhcfNsbnrN92FDEKciMH/x6LppU9dd0j4aTjCTlqONFOIMcAm/5JxS3+utowbXV1OoFr+g=="],
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
@@ -2486,6 +2656,8 @@
"ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
+ "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
+
"ipaddr.js": ["ipaddr.js@2.3.0", "", {}, "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg=="],
"is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="],
@@ -2612,10 +2784,16 @@
"keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+ "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="],
+
"kilo-code": ["kilo-code@workspace:packages/kilo-vscode"],
"kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
+ "langium": ["langium@4.2.1", "", { "dependencies": { "chevrotain": "~11.1.1", "chevrotain-allstar": "~0.3.1", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.1.0" } }, "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ=="],
+
+ "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="],
+
"lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="],
"leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="],
@@ -2656,6 +2834,8 @@
"lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="],
+ "lodash-es": ["lodash-es@4.17.23", "", {}, "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg=="],
+
"lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="],
"lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="],
@@ -2720,6 +2900,8 @@
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
+ "mermaid": ["mermaid@11.12.3", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.1", "@mermaid-js/parser": "^1.0.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.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.13", "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.23", "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ=="],
+
"micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
"micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
@@ -2758,6 +2940,8 @@
"mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="],
+ "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="],
+
"mocha": ["mocha@11.7.5", "", { "dependencies": { "browser-stdout": "^1.3.1", "chokidar": "^4.0.1", "debug": "^4.3.5", "diff": "^7.0.0", "escape-string-regexp": "^4.0.0", "find-up": "^5.0.0", "glob": "^10.4.5", "he": "^1.2.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "log-symbols": "^4.1.0", "minimatch": "^9.0.5", "ms": "^2.1.3", "picocolors": "^1.1.1", "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", "workerpool": "^9.2.0", "yargs": "^17.7.2", "yargs-parser": "^21.1.1", "yargs-unparser": "^2.0.0" }, "bin": { "mocha": "bin/mocha.js", "_mocha": "bin/_mocha" } }, "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig=="],
"morphdom": ["morphdom@2.7.8", "", {}, "sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg=="],
@@ -2862,6 +3046,8 @@
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
+ "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
+
"pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="],
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
@@ -2888,6 +3074,8 @@
"path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
+ "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="],
+
"path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
@@ -2924,20 +3112,24 @@
"pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
- "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="],
+ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
"pkg-up": ["pkg-up@3.1.0", "", { "dependencies": { "find-up": "^3.0.0" } }, "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="],
"planck": ["planck@1.4.2", "", { "peerDependencies": { "stage-js": "^1.0.0-alpha.12" } }, "sha512-mNbhnV3g8X2rwGxzcesjmN8BDA6qfXgQxXVMkWau9MCRlQY0RLNEkyHlVp6yFy/X6qrzAXyNONCnZ1cGDLrNew=="],
- "playwright": ["playwright@1.57.0", "", { "dependencies": { "playwright-core": "1.57.0" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw=="],
+ "playwright": ["playwright@1.58.2", "", { "dependencies": { "playwright-core": "1.58.2" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A=="],
- "playwright-core": ["playwright-core@1.57.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ=="],
+ "playwright-core": ["playwright-core@1.58.2", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg=="],
"pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="],
"pngjs": ["pngjs@5.0.0", "", {}, "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="],
+ "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="],
+
+ "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="],
+
"possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
"postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
@@ -3068,14 +3260,20 @@
"rimraf": ["rimraf@5.0.10", "", { "dependencies": { "glob": "^10.3.7" }, "bin": { "rimraf": "dist/esm/bin.mjs" } }, "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ=="],
+ "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="],
+
"rollup": ["rollup@4.57.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.57.1", "@rollup/rollup-android-arm64": "4.57.1", "@rollup/rollup-darwin-arm64": "4.57.1", "@rollup/rollup-darwin-x64": "4.57.1", "@rollup/rollup-freebsd-arm64": "4.57.1", "@rollup/rollup-freebsd-x64": "4.57.1", "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", "@rollup/rollup-linux-arm-musleabihf": "4.57.1", "@rollup/rollup-linux-arm64-gnu": "4.57.1", "@rollup/rollup-linux-arm64-musl": "4.57.1", "@rollup/rollup-linux-loong64-gnu": "4.57.1", "@rollup/rollup-linux-loong64-musl": "4.57.1", "@rollup/rollup-linux-ppc64-gnu": "4.57.1", "@rollup/rollup-linux-ppc64-musl": "4.57.1", "@rollup/rollup-linux-riscv64-gnu": "4.57.1", "@rollup/rollup-linux-riscv64-musl": "4.57.1", "@rollup/rollup-linux-s390x-gnu": "4.57.1", "@rollup/rollup-linux-x64-gnu": "4.57.1", "@rollup/rollup-linux-x64-musl": "4.57.1", "@rollup/rollup-openbsd-x64": "4.57.1", "@rollup/rollup-openharmony-arm64": "4.57.1", "@rollup/rollup-win32-arm64-msvc": "4.57.1", "@rollup/rollup-win32-ia32-msvc": "4.57.1", "@rollup/rollup-win32-x64-gnu": "4.57.1", "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A=="],
+ "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="],
+
"router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="],
"run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
+ "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="],
+
"s-js": ["s-js@0.4.9", "", {}, "sha512-RtpOm+cM6O0sHg6IA70wH+UC3FZcND+rccBZpBAHzlUgNO2Bm5BN+FnM8+OBxzXdwpKWFwX11JGF0MFRkhSoIQ=="],
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
@@ -3254,6 +3452,8 @@
"styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
+ "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="],
+
"supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
"supports-hyperlinks": ["supports-hyperlinks@3.2.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig=="],
@@ -3376,6 +3576,8 @@
"uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
+ "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
+
"ulid": ["ulid@3.0.1", "", { "bin": { "ulid": "dist/cli.js" } }, "sha512-dPJyqPzx8preQhqq24bBG1YNkvigm87K8kVEHCD+ruZg24t6IFEFv00xMWfxcC4djmFtiTLdFuADn4+DOz6R7Q=="],
"underscore": ["underscore@1.13.8", "", {}, "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ=="],
@@ -3422,7 +3624,7 @@
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
- "uuid": ["uuid@8.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw=="],
+ "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],
"v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="],
@@ -3452,8 +3654,16 @@
"vscode-jsonrpc": ["vscode-jsonrpc@8.2.1", "", {}, "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ=="],
+ "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="],
+
+ "vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="],
+
+ "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="],
+
"vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="],
+ "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
+
"web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="],
"web-tree-sitter": ["web-tree-sitter@0.25.10", "", { "peerDependencies": { "@types/emscripten": "^1.40.0" }, "optionalPeers": ["@types/emscripten"] }, "sha512-Y09sF44/13XvgVKgO2cNDw5rGk6s26MgoZPXLESvMXeefBf7i6/73eFurre0IsTW6E14Y0ArIzhUMmjoc7xyzA=="],
@@ -3574,6 +3784,8 @@
"@ai-sdk/xai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.20", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ=="],
+ "@antfu/install-pkg/tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
+
"@aws-crypto/sha1-browser/@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-crypto/sha256-browser/@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=="],
@@ -3964,6 +4176,8 @@
"@openauthjs/openauth/jose": ["jose@5.9.6", "", {}, "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ=="],
+ "@opencode-ai/app/@playwright/test": ["@playwright/test@1.57.0", "", { "dependencies": { "playwright": "1.57.0" }, "bin": { "playwright": "cli.js" } }, "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA=="],
+
"@opencode-ai/app/tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="],
"@opencode-ai/app/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=="],
@@ -4092,6 +4306,8 @@
"aws-sdk/events": ["events@1.1.1", "", {}, "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw=="],
+ "aws-sdk/uuid": ["uuid@8.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw=="],
+
"aws-sdk/xml2js": ["xml2js@0.6.2", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="],
"babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="],
@@ -4106,6 +4322,8 @@
"c12/dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="],
+ "c12/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="],
+
"c8/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
"c8/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
@@ -4116,6 +4334,16 @@
"compress-commons/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
+ "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="],
+
+ "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="],
+
+ "d3-dsv/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
+
+ "d3-sankey/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="],
+
+ "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="],
+
"drizzle-kit/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
"encoding-sniffer/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
@@ -4178,6 +4406,8 @@
"log-symbols/is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="],
+ "mermaid/marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="],
+
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
"mocha/diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="],
@@ -4228,6 +4458,8 @@
"pixelmatch/pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="],
+ "pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
+
"pkg-up/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="],
"playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="],
@@ -4302,6 +4534,8 @@
"vitest/why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
+ "vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="],
+
"whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
@@ -4966,6 +5200,8 @@
"@octokit/rest/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="],
+ "@opencode-ai/app/@playwright/test/playwright": ["playwright@1.57.0", "", { "dependencies": { "playwright-core": "1.57.0" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw=="],
+
"@opencode-ai/app/vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
"@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=="],
@@ -5114,6 +5350,12 @@
"c8/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=="],
+ "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="],
+
+ "d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="],
+
+ "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="],
+
"drizzle-kit/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
"drizzle-kit/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
@@ -5830,6 +6072,10 @@
"@octokit/rest/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+ "@opencode-ai/app/@playwright/test/playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="],
+
+ "@opencode-ai/app/@playwright/test/playwright/playwright-core": ["playwright-core@1.57.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ=="],
+
"@opencode-ai/app/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
"@opencode-ai/app/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
diff --git a/flake.nix b/flake.nix
index fdd673dd73f..ed9a99e8a6e 100644
--- a/flake.nix
+++ b/flake.nix
@@ -162,7 +162,8 @@
unzip
gnutar
gzip
- ripgrep
+ patchelf
+ ripgrep
kilo-dev
kilo-install-bin
kilo-bin
diff --git a/nix/hashes.json b/nix/hashes.json
index ba1bfd246d5..9138c40ef00 100644
--- a/nix/hashes.json
+++ b/nix/hashes.json
@@ -1,8 +1,8 @@
{
"nodeModules": {
- "x86_64-linux": "sha256-Medit5guq3rzXGSFYP7iH6pyaozOJLgLpreU/GT+4Dw=",
- "aarch64-linux": "sha256-R//MvhDIKPFGpWIbPksi494L9bfv3eahL/GzYhQ/NFw=",
- "aarch64-darwin": "sha256-83+hjrJyV2rC1BstFathrJvUv0Di6vpbRSs2Nek72eU=",
- "x86_64-darwin": "sha256-v3cAIq+ChvljgWBuPCvb12PYXlSalXkkr4BRCfQu2VE="
+ "x86_64-linux": "sha256-nK6w/+ZFZ1e3IF3JQaCdE7mn7FtEuY5fUAJNOiPjTVM=",
+ "aarch64-linux": "sha256-oOiCU3mNgccNrU3VQydTozb5PhRAmUnoyetDkePakq0=",
+ "aarch64-darwin": "sha256-qT4DC6mGD2pkNjSX2RJ6+FCRIlDnXEYiHAxurULkgXI=",
+ "x86_64-darwin": "sha256-4Lew/qSnYVbaJlfP+9fIi2mTuw4mMLYNkFbPNQkJu9k="
}
}
diff --git a/package.json b/package.json
index 9d6e656b41c..a4b2a49d868 100644
--- a/package.json
+++ b/package.json
@@ -107,6 +107,6 @@
"@openrouter/ai-sdk-provider@1.5.4": "patches/@openrouter%2Fai-sdk-provider@1.5.4.patch",
"ghostty-web@0.3.0": "patches/ghostty-web@0.3.0.patch"
},
- "version": "7.0.32",
+ "version": "7.0.33",
"peerDependencies": {}
}
diff --git a/packages/app/package.json b/packages/app/package.json
index da96fa807c0..0decec0990c 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
- "version": "7.0.32",
+ "version": "7.0.33",
"description": "",
"type": "module",
"exports": {
diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts
index db735ac3599..9519e440c07 100644
--- a/packages/app/src/i18n/ar.ts
+++ b/packages/app/src/i18n/ar.ts
@@ -134,8 +134,7 @@ export const dict = {
"provider.connect.oauth.code.invalid": "رمز التفويض غير صالح",
"provider.connect.oauth.auto.visit.prefix": "قم بزيارة ",
"provider.connect.oauth.auto.visit.link": "هذا الرابط",
- "provider.connect.oauth.auto.visit.suffix":
- " وأدخل الرمز أدناه لتوصيل حسابك واستخدام نماذج {{provider}} في Kilo.",
+ "provider.connect.oauth.auto.visit.suffix": " وأدخل الرمز أدناه لتوصيل حسابك واستخدام نماذج {{provider}} في Kilo.",
"provider.connect.oauth.auto.confirmationCode": "رمز التأكيد",
"provider.connect.toast.connected.title": "تم توصيل {{provider}}",
"provider.connect.toast.connected.description": "نماذج {{provider}} متاحة الآن للاستخدام.",
diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts
index 5aac1d03d07..b211045e6b4 100644
--- a/packages/app/src/i18n/fr.ts
+++ b/packages/app/src/i18n/fr.ts
@@ -389,8 +389,7 @@ export const dict = {
"toast.session.unshare.failed.description": "Une erreur s'est produite lors de l'annulation du partage de la session",
"toast.session.listFailed.title": "Échec du chargement des sessions pour {{project}}",
"toast.update.title": "Mise à jour disponible",
- "toast.update.description":
- "Une nouvelle version d'Kilo ({{version}}) est maintenant disponible pour installation.",
+ "toast.update.description": "Une nouvelle version d'Kilo ({{version}}) est maintenant disponible pour installation.",
"toast.update.action.installRestart": "Installer et redémarrer",
"toast.update.action.notYet": "Pas encore",
"error.page.title": "Quelque chose s'est mal passé",
@@ -524,8 +523,7 @@ export const dict = {
"sidebar.workspaces.enable": "Activer les espaces de travail",
"sidebar.workspaces.disable": "Désactiver les espaces de travail",
"sidebar.gettingStarted.title": "Commencer",
- "sidebar.gettingStarted.line1":
- "Kilo inclut des modèles gratuits pour que vous puissiez commencer immédiatement.",
+ "sidebar.gettingStarted.line1": "Kilo inclut des modèles gratuits pour que vous puissiez commencer immédiatement.",
"sidebar.gettingStarted.line2":
"Connectez n'importe quel fournisseur pour utiliser des modèles, y compris Claude, GPT, Gemini etc.",
"sidebar.project.recentSessions": "Sessions récentes",
diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts
index 53819544191..6ed8f81b6f3 100644
--- a/packages/app/src/i18n/th.ts
+++ b/packages/app/src/i18n/th.ts
@@ -146,8 +146,7 @@ export const dict = {
"provider.connect.oauth.code.invalid": "รหัสการอนุญาตไม่ถูกต้อง",
"provider.connect.oauth.auto.visit.prefix": "เยี่ยมชม ",
"provider.connect.oauth.auto.visit.link": "ลิงก์นี้",
- "provider.connect.oauth.auto.visit.suffix":
- " และป้อนรหัสด้านล่างเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน Kilo",
+ "provider.connect.oauth.auto.visit.suffix": " และป้อนรหัสด้านล่างเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน Kilo",
"provider.connect.oauth.auto.confirmationCode": "รหัสยืนยัน",
"provider.connect.toast.connected.title": "{{provider}} ที่เชื่อมต่อแล้ว",
"provider.connect.toast.connected.description": "โมเดล {{provider}} พร้อมใช้งานแล้ว",
diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts
index fa5dee31bd6..d25288c4d24 100644
--- a/packages/app/src/i18n/zht.ts
+++ b/packages/app/src/i18n/zht.ts
@@ -147,8 +147,7 @@ export const dict = {
"provider.connect.oauth.code.invalid": "授權碼無效",
"provider.connect.oauth.auto.visit.prefix": "造訪 ",
"provider.connect.oauth.auto.visit.link": "此連結",
- "provider.connect.oauth.auto.visit.suffix":
- " 並輸入以下程式碼,以連線你的帳戶並在 Kilo 中使用 {{provider}} 模型。",
+ "provider.connect.oauth.auto.visit.suffix": " 並輸入以下程式碼,以連線你的帳戶並在 Kilo 中使用 {{provider}} 模型。",
"provider.connect.oauth.auto.confirmationCode": "確認碼",
"provider.connect.toast.connected.title": "{{provider}} 已連線",
"provider.connect.toast.connected.description": "現在可以使用 {{provider}} 模型了。",
diff --git a/packages/app/src/pages/layout/sidebar-items.tsx b/packages/app/src/pages/layout/sidebar-items.tsx
index 0a461ca79f8..6fb7ce6319b 100644
--- a/packages/app/src/pages/layout/sidebar-items.tsx
+++ b/packages/app/src/pages/layout/sidebar-items.tsx
@@ -32,9 +32,7 @@ export const ProjectIcon = (props: { project: LocalProject; class?: string; noti
0 && props.notify }}
diff --git a/packages/desktop/package.json b/packages/desktop/package.json
index 6a961418905..f06e8ce23f8 100644
--- a/packages/desktop/package.json
+++ b/packages/desktop/package.json
@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/desktop",
"private": true,
- "version": "7.0.32",
+ "version": "7.0.33",
"type": "module",
"license": "MIT",
"scripts": {
diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml
index 6e16ebf7ca2..8ea1c5bca00 100644
--- a/packages/extensions/zed/extension.toml
+++ b/packages/extensions/zed/extension.toml
@@ -1,7 +1,7 @@
id = "kilo"
name = "Kilo"
description = "The open source coding agent."
-version = "7.0.32"
+version = "7.0.33"
schema_version = 1
authors = ["Anomaly"]
repository = "https://github.com/Kilo-Org/kilocode"
@@ -11,26 +11,26 @@ name = "Kilo"
icon = "./icons/opencode.svg"
[agent_servers.opencode.targets.darwin-aarch64]
-archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.32/opencode-darwin-arm64.zip"
+archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.33/opencode-darwin-arm64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.darwin-x86_64]
-archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.32/opencode-darwin-x64.zip"
+archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.33/opencode-darwin-x64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-aarch64]
-archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.32/opencode-linux-arm64.tar.gz"
+archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.33/opencode-linux-arm64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-x86_64]
-archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.32/opencode-linux-x64.tar.gz"
+archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.33/opencode-linux-x64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.windows-x86_64]
-archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.32/opencode-windows-x64.zip"
+archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.33/opencode-windows-x64.zip"
cmd = "./opencode.exe"
args = ["acp"]
diff --git a/packages/kilo-docs/components/CodeBlock.tsx b/packages/kilo-docs/components/CodeBlock.tsx
index 64a7f268885..80e8378419b 100644
--- a/packages/kilo-docs/components/CodeBlock.tsx
+++ b/packages/kilo-docs/components/CodeBlock.tsx
@@ -3,14 +3,84 @@ import Prism from "prismjs"
import * as React from "react"
import { Codicon } from "./Codicon"
+let mermaidInitialized = false
+
+function MermaidBlock({ children }) {
+ const ref = React.useRef(null)
+ const [svg, setSvg] = React.useState("")
+ const [error, setError] = React.useState(false)
+
+ React.useEffect(() => {
+ const code = typeof children === "string" ? children : ref.current?.textContent || ""
+ if (!code.trim()) return
+ const id = `mermaid-${Math.random().toString(36).slice(2, 9)}`
+
+ import("mermaid").then((mod) => {
+ const mermaid = mod.default
+ if (!mermaidInitialized) {
+ mermaid.initialize({
+ startOnLoad: false,
+ theme: "base",
+ themeVariables: {
+ primaryColor: "#33332d",
+ primaryTextColor: "#e9e9e9",
+ primaryBorderColor: "#555",
+ lineColor: "#a3a3a2",
+ secondaryColor: "#2a2a24",
+ tertiaryColor: "#1a1a18",
+ background: "#1a1a18",
+ mainBkg: "#33332d",
+ nodeBorder: "#555",
+ clusterBkg: "#2a2a24",
+ clusterBorder: "#444",
+ titleColor: "#e9e9e9",
+ edgeLabelBackground: "#1a1a18",
+ },
+ securityLevel: "strict",
+ fontFamily: "inherit",
+ })
+ mermaidInitialized = true
+ }
+ mermaid
+ .render(id, code.trim())
+ .then(({ svg }) => setSvg(svg))
+ .catch((err) => {
+ console.error(err)
+ setError(true)
+ })
+ })
+ }, [children])
+
+ if (error) {
+ return {children}
+ }
+
+ if (svg) {
+ return (
+
+ )
+ }
+
+ return (
+
+ {children}
+
+ )
+}
+
export function CodeBlock({ children, "data-language": language }) {
const ref = React.useRef(null)
const timeoutRef = React.useRef(null)
const [copied, setCopied] = React.useState(false)
React.useEffect(() => {
+ if (language === "mermaid") return
if (ref.current) Prism.highlightElement(ref.current, false)
- }, [children])
+ }, [children, language])
React.useEffect(() => {
return () => {
@@ -20,6 +90,10 @@ export function CodeBlock({ children, "data-language": language }) {
}
}, [])
+ if (language === "mermaid") {
+ return {children}
+ }
+
const handleCopy = async () => {
const code = ref.current?.textContent || ""
try {
diff --git a/packages/kilo-docs/package.json b/packages/kilo-docs/package.json
index 322e1fd6150..49b452481ce 100644
--- a/packages/kilo-docs/package.json
+++ b/packages/kilo-docs/package.json
@@ -1,6 +1,6 @@
{
"name": "@kilocode/kilo-docs",
- "version": "7.0.32",
+ "version": "7.0.33",
"private": true,
"scripts": {
"dev": "next dev --webpack --port 3002",
@@ -15,6 +15,7 @@
"@markdoc/next.js": "^0.5.0",
"js-yaml": "^4.1.0",
"@vscode/codicons": "^0.0.44",
+ "mermaid": "11.12.3",
"next": "^16.1.5",
"posthog-js": "^1.335.3",
"prismjs": "^1.30.0",
diff --git a/packages/kilo-docs/pages/404.tsx b/packages/kilo-docs/pages/404.tsx
index c2d4c612f6f..db14a31ddaa 100644
--- a/packages/kilo-docs/pages/404.tsx
+++ b/packages/kilo-docs/pages/404.tsx
@@ -1,8 +1,19 @@
-import React from "react"
+import React, { useState, useEffect } from "react"
import Link from "next/link"
import Head from "next/head"
+const subtitles = [
+ "The page you requested does not exist or has been moved.",
+ "That link is dead, and may have ridden off into the sunset on a pink pony 🦄",
+]
+
export default function Custom404() {
+ const [subtitle, setSubtitle] = useState("")
+
+ useEffect(() => {
+ setSubtitle(subtitles[Math.floor(Math.random() * subtitles.length)])
+ }, [])
+
return (
<>
@@ -39,7 +50,7 @@ export default function Custom404() {
{/* Message */}
Page not found
-
The page you requested does not exist or has been moved.
+ {subtitle &&
{subtitle}
}
{/* Actions */}
diff --git a/packages/kilo-docs/pages/_app.tsx b/packages/kilo-docs/pages/_app.tsx
index e8ad6f7fb87..f3836c97c56 100644
--- a/packages/kilo-docs/pages/_app.tsx
+++ b/packages/kilo-docs/pages/_app.tsx
@@ -137,13 +137,14 @@ export default function MyApp({ Component, pageProps }: AppProps) {
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
{/* Preconnect to Algolia for better performance */}
diff --git a/packages/kilo-docs/pages/automate/code-reviews/github.md b/packages/kilo-docs/pages/automate/code-reviews/github.md
index f967dabceb1..2547cd02c58 100644
--- a/packages/kilo-docs/pages/automate/code-reviews/github.md
+++ b/packages/kilo-docs/pages/automate/code-reviews/github.md
@@ -17,15 +17,7 @@ Kilo's Code Reviews integrate with GitHub via a **GitHub App** to automatically
### Step 1: Install the GitHub App
-1. Go to the **Integrations** page:
- - **Personal**: [app.kilo.ai/integrations/github](https://app.kilo.ai/integrations/github)
- - **Organization**: Your organization → Integrations → GitHub
-2. Click **Install GitHub App**
-3. Choose which GitHub account or organization to install the app on
-4. Select repository access:
- - **All repositories** — the app can access all current and future repos
- - **Only select repositories** — choose specific repos
-5. Click **Install**
+Connect your GitHub account via the [Integrations page](/docs/automate/integrations#connecting-github). Once connected, return here to configure the Review Agent.
The GitHub App requests the following permissions:
diff --git a/packages/kilo-docs/pages/automate/code-reviews/gitlab.md b/packages/kilo-docs/pages/automate/code-reviews/gitlab.md
index 4d795e1771b..0087a26dd7e 100644
--- a/packages/kilo-docs/pages/automate/code-reviews/gitlab.md
+++ b/packages/kilo-docs/pages/automate/code-reviews/gitlab.md
@@ -21,48 +21,9 @@ Both **GitLab.com** and **self-hosted GitLab instances** are supported.
### Step 1: Connect GitLab
-You can connect using **OAuth** or a **Personal Access Token (PAT)**. Choose the method that matches your GitLab setup:
+Connect your GitLab account via the [Integrations page](/docs/automate/integrations#connecting-gitlab). You can use **OAuth** (GitLab.com or self-hosted) or a **Personal Access Token (PAT)**.
-{% tabs %}
-{% tab label="OAuth (GitLab.com)" %}
-
-1. Go to the **Integrations** page:
- - **Personal**: [app.kilo.ai/integrations/gitlab](https://app.kilo.ai/integrations/gitlab)
- - **Organization**: Your organization → Integrations → GitLab
-2. Click **Connect GitLab**
-3. Authorize the application on GitLab
-4. You'll be redirected back to Kilo with the connection active
-
-{% /tab %}
-{% tab label="OAuth (Self-Hosted)" %}
-
-For self-hosted GitLab instances using OAuth, you need to register an OAuth application first:
-
-1. In your GitLab instance, go to **Admin Area → Applications** (or **User Settings → Applications**)
-2. Create a new application:
- - **Name**: `Kilo Code`
- - **Redirect URI**: `https://app.kilo.ai/api/integrations/gitlab/callback`
- - **Scopes**: `api`, `read_user`, `read_repository`, `write_repository`
- - **Confidential**: Yes
-3. Copy the **Application ID** and **Secret**
-4. In Kilo, go to the GitLab integration page
-5. Enter your **Instance URL**, **Client ID**, and **Client Secret**
-6. Click **Connect** and authorize
-
-{% /tab %}
-{% tab label="Personal Access Token" %}
-
-1. In GitLab, go to **User Settings → Access Tokens**
-2. Create a token with the `api` scope
-3. Copy the token
-4. In Kilo, go to the GitLab integration page
-5. Paste the token (and enter your Instance URL for self-hosted)
-6. Click **Connect**
-
-> PAT tokens cannot be refreshed automatically. When your token expires, create a new one in GitLab and reconnect in Kilo.
-
-{% /tab %}
-{% /tabs %}
+Once connected, return here to configure the Review Agent.
### Step 2: Configure the Review Agent
diff --git a/packages/kilo-docs/pages/automate/code-reviews/overview.md b/packages/kilo-docs/pages/automate/code-reviews/overview.md
index 25d4bdfa27d..c89e043a9a4 100644
--- a/packages/kilo-docs/pages/automate/code-reviews/overview.md
+++ b/packages/kilo-docs/pages/automate/code-reviews/overview.md
@@ -26,7 +26,7 @@ Kilo's **Code Reviews** feature automatically analyzes your pull or merge reques
Before enabling Code Reviews:
-- **A platform integration must be configured:** Connect your GitHub or GitLab account via the [Integrations page](https://app.kilo.ai/integrations) so that the Review Agent can access your repositories.
+- **A platform integration must be configured:** Connect your GitHub or GitLab account via the [Integrations page](https://app.kilo.ai/integrations) so that the Review Agent can access your repositories. See the [Integration setup guide](/docs/automate/integrations) for detailed instructions.
- **Kilo Code credits:** The AI model uses credits when analyzing your code.
## Cost
diff --git a/packages/kilo-docs/pages/automate/integrations.md b/packages/kilo-docs/pages/automate/integrations.md
index b9468a8f3ba..1a8dd1e9126 100644
--- a/packages/kilo-docs/pages/automate/integrations.md
+++ b/packages/kilo-docs/pages/automate/integrations.md
@@ -5,32 +5,42 @@ description: "Overview of Kilo Code integrations"
# Kilo Code Integrations
-Kilo Integrations lets you connect your GitHub account (and soon, GitLab and Bitbucket) to enable advanced features inside Kilo Code. Once connected, Kilo can access your repositories securely through the **KiloConnect** GitHub App, enabling features like **Cloud Agents** and **Kilo Deploy**.
+Kilo Integrations lets you connect your GitHub or GitLab account (soon Bitbucket) to enable advanced features inside Kilo Code. Once connected, Kilo can access your repositories securely, enabling features like **Code Reviews**, **Cloud Agents**, and **Kilo Deploy**.
+
+## Supported Platforms
+
+| Platform | Integration Type | Details |
+| -------- | ---------------- | --------------------------------- |
+| GitHub | GitHub App | [GitHub Setup](#connecting-github)|
+| GitLab | OAuth or PAT | [GitLab Setup](#connecting-gitlab)|
## What You Can Do With Integrations
-- **Connect GitHub to Kilo Code** in a few clicks
-- **Authorize the KiloConnect App** for repo access
-- **Enable advanced features** like Cloud Agents and Kilo Deploy
+- **Connect GitHub or GitLab to Kilo Code** in a few clicks
+- **Enable advanced features** like Cloud Agents, Code Reviews, and Kilo Deploy
+- **Authorize repository access** so Kilo can analyze and work with your code
## Prerequisites
Before connecting:
-- You must have a **GitHub account**.
-- You need permission to install GitHub Apps for the repositories you want Kilo to access.
-- (Optional) If you're connecting an organization, you must be an **org admin** or have app installation permissions.
+- You must have a **GitHub** or **GitLab** account.
+- For GitHub: You need permission to install GitHub Apps for the repositories you want Kilo to access.
+- For GitLab: You need **Maintainer** role (or higher) on the projects you want to connect.
+- (Optional) If you're connecting an organization, you must be an admin or have app installation permissions.
-## Connecting GitHub to Kilo
+---
+
+## Connecting GitHub
### 1. Open the Integrations Page
-Go to your **Personal** or **Organization Dashboard**, and navigate to the [Integrations](https://app.kilo.ai/integrations) tab
+Go to your **Personal** or **Organization Dashboard**, and navigate to the [Integrations](https://app.kilo.ai/integrations) tab.
### 2. Start the Connection Flow
1. Click **Configure** on the GitHub panel.
-2. You’ll be redirected to GitHub to authorize the **KiloConnect** App.
+2. You'll be redirected to GitHub to authorize the **KiloConnect** App.
3. Select the GitHub account or organization you want to connect.
### 3. Choose Repository Access
@@ -46,13 +56,62 @@ Click **Install & Authorize** to continue.
Once approved:
-- You’ll return to the Kilo Integrations page.
-- Github will show a **Connected** status.
+- You'll return to the Kilo Integrations page.
+- GitHub will show a **Connected** status.
- Your Kilo workspace can now access GitHub repositories securely.
+---
+
+## Connecting GitLab
+
+You can connect GitLab using **OAuth** or a **Personal Access Token (PAT)**. Both **GitLab.com** and **self-hosted GitLab instances** are supported.
+
+{% tabs %}
+{% tab label="OAuth (GitLab.com)" %}
+
+1. Go to the **Integrations** page:
+ - **Personal**: [app.kilo.ai/integrations/gitlab](https://app.kilo.ai/integrations/gitlab)
+ - **Organization**: Your organization → Integrations → GitLab
+2. Click **Connect GitLab**
+3. Authorize the application on GitLab
+4. You'll be redirected back to Kilo with the connection active
+
+{% /tab %}
+{% tab label="OAuth (Self-Hosted)" %}
+
+For self-hosted GitLab instances using OAuth, you need to register an OAuth application first:
+
+1. In your GitLab instance, go to **Admin Area → Applications** (or **User Settings → Applications**)
+2. Create a new application:
+ - **Name**: `Kilo Code`
+ - **Redirect URI**: `https://app.kilo.ai/api/integrations/gitlab/callback`
+ - **Scopes**: `api`, `read_user`, `read_repository`, `write_repository`
+ - **Confidential**: Yes
+3. Copy the **Application ID** and **Secret**
+4. In Kilo, go to the GitLab integration page
+5. Enter your **Instance URL**, **Client ID**, and **Client Secret**
+6. Click **Connect** and authorize
+
+{% /tab %}
+{% tab label="Personal Access Token" %}
+
+1. In GitLab, go to **User Settings → Access Tokens**
+2. Create a token with the `api` scope
+3. Copy the token
+4. In Kilo, go to the GitLab integration page
+5. Paste the token (and enter your Instance URL for self-hosted)
+6. Click **Connect**
+
+> PAT tokens cannot be refreshed automatically. When your token expires, create a new one in GitLab and reconnect in Kilo.
+
+{% /tab %}
+{% /tabs %}
+
+---
+
## What Happens After Connecting
-Once GitHub is connected, the following features will be enabled in Kilo:
+Once your Git provider is connected, the following features are enabled in Kilo:
### Cloud Agents
@@ -60,6 +119,12 @@ Once GitHub is connected, the following features will be enabled in Kilo:
- Auto-create branches and push work continuously
- Work from anywhere while keeping your repo in sync
+### Code Reviews
+
+- Automated AI review on every pull request or merge request
+- Consistent feedback based on your team's standards
+- See the [Code Reviews guide](/docs/automate/code-reviews/overview) for setup
+
### Kilo Deploy
- Deploy Next.js 14 & 15 apps directly from Kilo
@@ -68,29 +133,61 @@ Once GitHub is connected, the following features will be enabled in Kilo:
### Upcoming:
-- **GitLab Integration**
- **Bitbucket Integration**
---
## Managing or Removing the Integration
-From the same **Integrations** page, you can click "Manage on Github" to:
+### GitHub
+
+From the **Integrations** page, click "Manage on GitHub" to:
- View the GitHub account you connected
- Update which repositories Kilo has access to
- Disconnect GitHub entirely
- Reauthorize the app if permissions change
+### GitLab
+
+From the **Integrations** page:
+
+- Click **Disconnect** to remove the GitLab connection
+- Your tokens are cleared, but webhook configuration is preserved so reconnecting restores your setup
+
+> Disconnecting from Kilo does not revoke OAuth tokens on GitLab's side. You can manually revoke them from **GitLab → User Settings → Applications → Authorized Applications**.
+
---
## Troubleshooting
-**“I don’t see my repositories.”**
+### GitHub
+
+**"I don't see my repositories."**
Ensure the KiloConnect App is installed for the correct GitHub org and that repo access includes the repositories you need.
-**“My organization blocks third-party apps.”**
+**"My organization blocks third-party apps."**
You may need an admin to approve installing GitHub Apps.
-**“Cloud Agents or Deploy can’t access my repo.”**
+**"Cloud Agents or Deploy can't access my repo."**
Revisit the GitHub app settings and confirm the app has the correct repo scope.
+
+### GitLab
+
+**"No projects listed after connecting."**
+Click the refresh button to sync projects from GitLab. Ensure your GitLab account has access to the projects you expect.
+
+**"Permission denied" errors.**
+You need **Maintainer role** on the GitLab project for webhook and bot token creation.
+
+**"Token expired."**
+
+- **OAuth**: Tokens refresh automatically. If refresh fails, reconnect from the integration page.
+- **PAT**: Create a new token in GitLab and reconnect in Kilo.
+
+**"Self-hosted connection issues."**
+
+- Verify your instance URL is accessible from the internet
+- Ensure HTTPS is configured
+- Check that OAuth application scopes include all required scopes
+- Verify the redirect URI matches: `https://app.kilo.ai/api/integrations/gitlab/callback`
diff --git a/packages/kilo-docs/pages/automate/mcp/using-in-cli.md b/packages/kilo-docs/pages/automate/mcp/using-in-cli.md
index e2689999b89..eae0fb42193 100644
--- a/packages/kilo-docs/pages/automate/mcp/using-in-cli.md
+++ b/packages/kilo-docs/pages/automate/mcp/using-in-cli.md
@@ -20,7 +20,7 @@ The CLI accepts several config filenames. The recommended file is `kilo.json`:
| **Global** | `~/.config/kilo/kilo.json` | `kilo.jsonc`, `config.json` |
| **Project** | `./kilo.json` or `./.kilo/kilo.json` | `kilo.jsonc` |
-Project-level configuration takes precedence over global settings.
+Project-level configuration takes precedence over global settings.
## Configuration Format
diff --git a/packages/kilo-docs/pages/code-with-ai/platforms/slack.md b/packages/kilo-docs/pages/code-with-ai/platforms/slack.md
index 43b8bec5da2..eca1d4c83cc 100644
--- a/packages/kilo-docs/pages/code-with-ai/platforms/slack.md
+++ b/packages/kilo-docs/pages/code-with-ai/platforms/slack.md
@@ -18,12 +18,21 @@ Kilo for Slack brings the power of Kilo Code directly into your Slack workspace.
---
+## Supported Platforms
+
+| Platform | Integration Type | Details |
+| -------- | ---------------- | --------------------------------------------------------------------|
+| GitHub | GitHub App | [GitHub Setup Guide](/docs/automate/integrations#connecting-github) |
+| GitLab | OAuth or PAT | [GitLab Setup Guide](/docs/automate/integrations#connecting-gitlab) |
+
+---
+
## Prerequisites
Before using Kilo for Slack:
- You must have a **Kilo Code account** with available credits
-- Your **GitHub Integration must be configured** via the [Integrations tab](https://app.kilo.ai/integrations) so Kilo can access your repositories
+- Your **Git provider integration must be configured** via the [Integrations tab](https://app.kilo.ai/integrations) so Kilo can access your repositories
To install Kilo for Slack, simply go to the integrations menu in the sidebar on https://app.kilo.ai and set up the Slack integration.
@@ -105,9 +114,9 @@ Can you help me understand what's causing it?
## How It Works
1. **Message Kilo** — Either through DMs or by mentioning it in a channel
-2. **Kilo processes your request** — Kilo uses your connected GitHub repositories to understand context
+2. **Kilo processes your request** — Kilo uses your connected repositories to understand context
3. **AI generates a response** — Kilo Code's AI analyzes your request and provides helpful responses
-4. **Code changes (if requested)** — For implementation requests, Kilo can create pull requests
+4. **Code changes (if requested)** — For implementation requests, Kilo can create pull or merge requests
---
@@ -157,10 +166,10 @@ Kilo for Slack supports over 400+ models across different providers.
Ensure Kilo for Slack is installed in your workspace and has been added to the channel you're using.
**"Kilo can't access my repository."**
-Verify your GitHub integration is configured correctly in the [Integrations tab](https://app.kilo.ai/integrations).
+Verify your Git provider integration is configured correctly in the [Integrations tab](https://app.kilo.ai/integrations).
**"I'm getting incomplete responses."**
Try breaking your request into smaller, more specific questions.
**"Kilo doesn't understand my codebase."**
-Make sure the repository you're asking about is connected and accessible through your GitHub integration.
+Make sure the repository you're asking about is connected and accessible through your Git provider integration.
diff --git a/packages/kilo-docs/pages/collaborate/enterprise/sso.md b/packages/kilo-docs/pages/collaborate/enterprise/sso.md
index 8f25b843aed..b52f3a8ee64 100644
--- a/packages/kilo-docs/pages/collaborate/enterprise/sso.md
+++ b/packages/kilo-docs/pages/collaborate/enterprise/sso.md
@@ -11,13 +11,6 @@ Kilo Enterprise lets your organization securely manage access using **Single Sig
**IDP-initiated logins are not currently supported.** Users must navigate to the [Kilo Web App](https://app.kilo.ai) to log in. Logging in directly from your identity provider's dashboard is not supported at this time.
{% /callout %}
-## Why Enable SSO?
-
-- **Centralized access control:** Manage permissions through your existing identity provider.
-- **Faster onboarding:** New team members automatically gain access when added to your company directory.
-- **Improved security:** Enforce company-wide password, MFA, and session policies.
-- **Easy offboarding:** Smoothly remove access when users leave your organization.
-
## Prerequisites
You’ll need:
@@ -25,7 +18,7 @@ You’ll need:
- Admin or Owner permissions for your Kilo organization.
- Access to your **Identity Provider (IdP)** (e.g. Okta, Google Workspace, Azure AD).
-## Step-by-Step Setup
+## Initiating SSO Configuration
### 1. Open [Organization](https://app.kilo.ai/organizations) Dashboard
@@ -36,7 +29,30 @@ Find the Single Sign-On (SSO) Configuration panel, and click "Set up SSO":
Fill in your contact information and someone from our team will reach out soon to help you configure SSO.
-## ✅ Next Steps
+## Implementing SSO Configuration
+
+Once the Kilo team has enabled SSO for your organization, your named admin will get an email from WorkOS to configure SSO.
+
+{% callout type="warning" %}
+**Save domain policy for last.**
+
+If you configure domain policy before setting up SSO, you may lock users out of Kilo.
+{% /callout %}
+
+Your admin will need to use the WorkOS link to:
+
+### 1. Configure your Identity Provider in WorkOS
+
+Find the Metadata in your Identity Provider and apply that configuration in WorkOS.
+
+### 2. Configure WorkOS in your Identity Provider
+
+Copy the Service Provider details (Entity ID, ACS URL, and Metadata) from the WorkOS dashboard and apply them in your Identity Provider.
+
+### 3. Configure Policy and Domain Settings in WorkOS
+
+1. Set the organization policy and user provisioning settings according to your organization's needs.
+2. Configure domain policy and domain verification in WorkOS.
After enabling SSO:
diff --git a/packages/kilo-docs/pages/contributing/architecture/auto-model-tiers.md b/packages/kilo-docs/pages/contributing/architecture/auto-model-tiers.md
index 578fbdd4f63..e6ae9bc611b 100644
--- a/packages/kilo-docs/pages/contributing/architecture/auto-model-tiers.md
+++ b/packages/kilo-docs/pages/contributing/architecture/auto-model-tiers.md
@@ -85,10 +85,10 @@ Extend Kilo Auto into four tiers.
**Model options for Auto: Small**:
-| Model | Cost | Capability | Notes |
-| ----- | ---- | ---------- | ----- |
+| Model | Cost | Capability | Notes |
+| ----------- | ---------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------- |
| gpt-oss-20b | ~50% cheaper than GPT-5 Nano | Lower — suitable for simple background tasks like titles and summaries | Open-weight, cost-optimized option for high-volume lightweight tasks |
-| GPT-5 Nano | Higher than gpt-oss-20b | Higher — better instruction following and output quality | Preferred when credits are available and task quality matters |
+| GPT-5 Nano | Higher than gpt-oss-20b | Higher — better instruction following and output quality | Preferred when credits are available and task quality matters |
Auto: Small should prefer **gpt-oss-20b** when minimizing cost (e.g., free users, high-volume background tasks) and **GPT-5 Nano** when credits are available and higher output quality is desired.
diff --git a/packages/kilo-docs/pages/contributing/architecture/index.md b/packages/kilo-docs/pages/contributing/architecture/index.md
index b9e26b370ae..dcafcbe1dff 100644
--- a/packages/kilo-docs/pages/contributing/architecture/index.md
+++ b/packages/kilo-docs/pages/contributing/architecture/index.md
@@ -1,56 +1,146 @@
---
title: "Architecture Overview"
-description: "Overview of Kilo Code architecture"
+description: "Overview of the Kilo platform architecture"
---
# Architecture Overview
-This document provides a high-level overview of Kilo Code's architecture to help contributors understand how the different components fit together.
+This document provides a high-level overview of the Kilo platform architecture to help contributors understand how the different components fit together.
## System Architecture
-Kilo Code is a VS Code extension built with TypeScript that connects to various AI providers to deliver intelligent coding assistance. The architecture follows a layered approach:
+Kilo is an AI coding platform built around a central CLI engine that powers every client surface — the terminal, VS Code, and the cloud. The architecture follows a layered approach where all clients communicate with the CLI over HTTP + SSE, and the CLI connects to AI providers either directly or through Kilo Cloud.
-```
-┌─────────────────────────────────────────────────────────────────────┐
-│ VS Code Extension │
-├─────────────────────────────────────────────────────────────────────┤
-│ │
-│ ┌──────────────────┐ ┌──────────────────┐ │
-│ │ Extension Host │ │ Webview UI │ │
-│ │ (src/) │◀───▶│ (webview-ui/) │ │
-│ └────────┬─────────┘ └──────────────────┘ │
-│ │ │
-│ │ Messages │
-│ ▼ │
-│ ┌──────────────────────────────────────────────────────────────┐ │
-│ │ Core Services │ │
-│ ├────────────┬────────────┬────────────┬───────────────────────┤ │
-│ │ Tools │ Browser │ MCP │ Code Index │ │
-│ │ Service │ Session │ Servers │ Service │ │
-│ └────────────┴────────────┴────────────┴───────────────────────┘ │
-│ │ │
-│ │ API Calls │
-│ ▼ │
-│ ┌──────────────────────────────────────────────────────────────┐ │
-│ │ API Provider Layer │ │
-│ ├────────────┬────────────┬────────────┬───────────────────────┤ │
-│ │ Anthropic │ OpenAI │ Kilo │ OpenRouter │ │
-│ │ API │ API │ Provider │ API │ │
-│ └────────────┴────────────┴────────────┴───────────────────────┘ │
-│ │
-└─────────────────────────────────────────────────────────────────────┘
+```mermaid
+graph LR
+ tui["Kilo CLI (TUI)"]
+ vscode["VS Code Extension"]
+
+ subgraph cli ["Kilo CLI Engine"]
+ provider["Provider Router"]
+ end
+
+ subgraph cloud ["Kilo Cloud"]
+ gateway["Kilo Gateway"]
+ cloudagent["Cloud Agent"]
+ bot["Kilo Bot"]
+ claw["KiloClaw"]
+ review["Code Review"]
+ triage["Auto Triage"]
+ appbuilder["App Builder"]
+ end
+
+ providers["Inference Providers: Anthropic, OpenAI, Google, OpenRouter + 500 more"]
+
+ tui -->|SDK| cli
+ vscode -->|SDK| cli
+ cloudagent -->|Sandbox| cli
+
+ provider -- Direct --> providers
+ provider -- Gateway --> gateway
+ gateway --> providers
+ claw --> gateway
+
+ bot --> cloudagent
+ review --> cloudagent
+ triage --> cloudagent
+ appbuilder --> cloudagent
```
-### Features
+## Kilo CLI — The Foundation
-For detailed documentation on current and planned features, see the [Architecture Features](/docs/contributing/architecture/features) page.
+The CLI (`packages/opencode/`) is the core engine that all products are built on. It contains the AI agent runtime, tool execution, session management, provider integrations, and an HTTP server. Each client spawns or connects to a `kilo serve` process and communicates via HTTP + SSE using the `@kilocode/sdk`.
+
+The CLI can run in several modes:
+
+- **`kilo`** — Interactive TUI for terminal-based coding
+- **`kilo run`** — Headless single-prompt execution
+- **`kilo serve`** — HTTP server mode for client integrations
+- **`kilo web`** — Browser-based UI
+
+Key subsystems inside the CLI:
+
+| Subsystem | Purpose |
+| --------------- | ------------------------------------------------------------------------ |
+| Agent Runtime | Orchestrates AI conversations, tool calls, and multi-step task execution |
+| Tools Service | Built-in tools for file editing, shell execution, search, and more |
+| MCP Servers | Model Context Protocol support for extending with external tools |
+| LSP Client | Language Server Protocol integration for code intelligence |
+| Session Manager | Persistent session state, conversation history, and checkpoints |
+| Provider Router | Connects to 500+ AI models via direct APIs or Kilo Gateway |
+| HTTP Server | REST API + SSE streaming for client communication |
+| Config System | Project and global configuration, modes, and permissions |
+
+## Client Layer
+
+All clients are thin wrappers over the CLI engine.
+
+### VS Code Extension
+
+The VS Code extension (`packages/kilo-vscode/`) bundles the CLI binary and spawns `kilo serve` as a child process. It includes:
+
+- **Sidebar Chat** — Primary coding assistant interface
+- **Agent Manager** — Multi-session orchestration panel with git worktree isolation for running parallel tasks
+
+### TUI
+
+The built-in terminal UI ships with the CLI itself — a SolidJS interface rendered in the terminal via OpenTUI.
+
+## Kilo Cloud
+
+Kilo Cloud is the hosted platform layer that provides authentication, provider routing, and autonomous agent services. The cloud infrastructure lives in a separate repository.
+
+### Kilo Gateway
+
+The gateway (`packages/kilo-gateway/` in this repo, plus API routes in the cloud) handles:
+
+- **Authentication** — Device flow auth, token management, and account linking
+- **Provider Routing** — Routes AI requests through Kilo's managed API keys or the user's own keys
+- **Model Catalog** — Serves the available model list and provider configuration
+- **Usage & Billing** — Tracks token consumption and manages credits
+
+### Cloud Agent
+
+A Cloudflare Worker within Kilo Cloud that runs the Kilo CLI in isolated sandbox environments. It powers cloud-based AI coding tasks triggered via the web dashboard, webhooks, or automation workflows. It provides a secure API for:
+
+- Creating and managing coding sessions with full GitHub/GitLab integration
+- Running AI tasks in Docker containers with the CLI pre-installed
+- Streaming results back via WebSocket
+
+### Kilo Bot
+
+The GitHub/GitLab bot that responds to issue comments and PR mentions. It dispatches work to the Cloud Agent, enabling users to trigger AI coding tasks directly from their repositories.
+
+### KiloClaw
+
+A multi-tenant compute platform running on Fly.io, orchestrated by a Cloudflare Worker. Each user gets a dedicated persistent machine running an OpenClaw gateway, coordinated via Durable Objects for state management and self-healing reconciliation.
+
+### Code Review
+
+An automated code review service that subscribes to GitHub webhooks, dispatches reviews through the Cloud Agent, and posts feedback directly on pull requests. Supports per-organization concurrency limits and automatic queuing.
+
+### Auto Triage
+
+An automated issue triage service that classifies GitHub issues (bug, feature, question), detects duplicates via vector similarity search, and optionally creates fix PRs for high-confidence actionable issues.
+
+### App Builder
+
+A service that builds and deploys user applications via the Cloud Agent. Users can generate full applications from prompts, with the App Builder orchestrating the Cloud Agent to scaffold, iterate, and deploy the result.
+
+### Supporting Services
+
+| Service | Purpose |
+| -------------------- | ------------------------------------------------------------------------------------ |
+| Webhook Agent Ingest | Named webhook endpoints that capture HTTP requests and queue delivery to Cloud Agent |
+| AI Attribution | Tracks line-level AI-generated code attribution when users accept or reject edits |
+| Session Ingest | Ingests and stores CLI session data for analytics |
+| Observability | Telemetry pipelines for monitoring cloud services |
## Key Concepts
### Modes
-Modes are configurable presets that customize Kilo Code's behavior:
+Modes are configurable presets that customize the agent's behavior:
- Define which tools are available
- Set custom system prompts
@@ -59,7 +149,7 @@ Modes are configurable presets that customize Kilo Code's behavior:
### Model Context Protocol (MCP)
-MCP enables extending Kilo Code with external tools:
+MCP enables extending the agent with external tools:
- Servers provide additional capabilities
- Standardized protocol for tool communication
@@ -73,75 +163,79 @@ Git-based state management for safe exploration:
- Enables rolling back to previous states
- Shadow repository for isolation
-### Code Indexing
+### Worktrees
-Semantic search over the codebase:
+Git worktree isolation for parallel task execution:
-- Embeddings-based search
-- Vector database storage (LanceDB/Qdrant)
-- Automatic chunking and indexing
+- Each agent session can operate in its own worktree
+- Prevents conflicts between concurrent tasks
+- Used by the Agent Manager in VS Code for multi-session workflows
## Development Patterns
-### Message Passing
+### Client-Server Communication
-The extension uses VS Code's webview message API:
+All clients communicate with the CLI via its HTTP + SSE API. The `@kilocode/sdk` package provides a TypeScript client:
```typescript
-// Extension → Webview
-panel.webview.postMessage({ type: "response", data: ... });
+import { KiloClient } from "@kilocode/sdk"
-// Webview → Extension
-vscode.postMessage({ type: "request", data: ... });
+const client = new KiloClient({ baseUrl: "http://localhost:3000" })
+const session = await client.session.create({ ... })
```
-### Service Architecture
+### Namespace Module Pattern
-Services are typically singletons with clear interfaces:
+The CLI uses a namespace module pattern for organizing related functionality:
```typescript
-class CodeIndexService {
- private static instance: CodeIndexService
+export namespace Session {
+ export const create = fn(CreateSchema, async (input) => {
+ // ...
+ })
- static getInstance(): CodeIndexService {
- if (!this.instance) {
- this.instance = new CodeIndexService()
- }
- return this.instance
- }
+ export const list = fn(ListSchema, async (input) => {
+ // ...
+ })
}
```
### Tool Implementation
-Tools follow a consistent pattern:
+Tools follow a consistent pattern with Zod schema validation:
```typescript
-interface Tool {
- name: string
- description: string
- parameters: z.ZodSchema
- execute(params: unknown): Promise
-}
+export const ReadTool = Tool.define({
+ name: "read",
+ description: "Read a file",
+ parameters: z.object({
+ path: z.string(),
+ }),
+ async execute(params) {
+ // ...
+ },
+})
```
## Build System
The project uses:
-- **pnpm** - Package management (monorepo workspaces)
-- **esbuild** - Fast bundling for extension
-- **Vite** - Webview UI development
-- **TypeScript** - Type checking across all packages
-- **Vitest** - Test runner
+- **Bun** — Package management (monorepo workspaces) and runtime
+- **Turborepo** — Monorepo task orchestration
+- **esbuild** — Bundling for the CLI and VS Code extension
+- **TypeScript** — Type checking via `tsgo` across all packages
+- **Vitest / Bun test** — Test runner
-## Testing
+## Repositories
-- **Unit tests** - `*.spec.ts` files alongside source
-- **Integration tests** - E2E tests in `e2e/` directory
-- **Run tests**: `cd src && pnpm test` or `cd webview-ui && pnpm test`
+| Repository | Contents |
+| --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| [Kilo-Org/kilocode](https://github.com/Kilo-Org/kilocode) | CLI engine, VS Code extension, SDK, gateway client, telemetry, docs, UI components |
+| Cloud (private) | Web dashboard, Cloud Agent, Kilo Bot, KiloClaw, code review, auto triage, billing, and supporting Cloudflare Workers |
## Further Reading
-- [Development Environment](/docs/contributing/development-environment) - Setup guide
-- [Tools Reference](/docs/automate/tools) - Available tools
+- [Development Environment](/docs/contributing/development-environment) — Setup guide
+- [Architecture Features](/docs/contributing/architecture/features) — Detailed feature specs
+- [Ecosystem](/docs/contributing/ecosystem) — Related projects and integrations
diff --git a/packages/kilo-docs/pages/customize/agents-md.md b/packages/kilo-docs/pages/customize/agents-md.md
index d451b5e7a7d..cd34077e7a0 100644
--- a/packages/kilo-docs/pages/customize/agents-md.md
+++ b/packages/kilo-docs/pages/customize/agents-md.md
@@ -18,7 +18,7 @@ If you'd like to migrate your memory bank content to AGENTS.md:
1. Examine the contents in `.kilocode/rules/memory-bank/`
2. Move that content into your project's `AGENTS.md` file (or ask Kilo to do it for you)
-{% /callout %}
+ {% /callout %}
## What is AGENTS.md?
diff --git a/packages/kilo-docs/public/favicon/android-chrome-192x192.png b/packages/kilo-docs/public/favicon/android-chrome-192x192.png
new file mode 100644
index 00000000000..bbc50f6fc9a
Binary files /dev/null and b/packages/kilo-docs/public/favicon/android-chrome-192x192.png differ
diff --git a/packages/kilo-docs/public/favicon/android-chrome-512x512.png b/packages/kilo-docs/public/favicon/android-chrome-512x512.png
new file mode 100644
index 00000000000..b83ac83bda1
Binary files /dev/null and b/packages/kilo-docs/public/favicon/android-chrome-512x512.png differ
diff --git a/packages/kilo-docs/public/favicon/apple-touch-icon.png b/packages/kilo-docs/public/favicon/apple-touch-icon.png
new file mode 100644
index 00000000000..e6c4bbf9994
Binary files /dev/null and b/packages/kilo-docs/public/favicon/apple-touch-icon.png differ
diff --git a/packages/kilo-docs/public/favicon/favicon.ico b/packages/kilo-docs/public/favicon/favicon.ico
new file mode 100644
index 00000000000..777c633b0b5
Binary files /dev/null and b/packages/kilo-docs/public/favicon/favicon.ico differ
diff --git a/packages/kilo-docs/public/favicon/favicon.svg b/packages/kilo-docs/public/favicon/favicon.svg
new file mode 100644
index 00000000000..88982e215b7
--- /dev/null
+++ b/packages/kilo-docs/public/favicon/favicon.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/packages/kilo-docs/public/site.webmanifest b/packages/kilo-docs/public/site.webmanifest
new file mode 100644
index 00000000000..a21d7ea4bc8
--- /dev/null
+++ b/packages/kilo-docs/public/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "Kilo Code",
+ "short_name": "Kilo",
+ "icons": [
+ {
+ "src": "/docs/favicon/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/docs/favicon/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#617A91",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/packages/kilo-gateway/package.json b/packages/kilo-gateway/package.json
index 85489c9ccfc..f8a9bc5fd76 100644
--- a/packages/kilo-gateway/package.json
+++ b/packages/kilo-gateway/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/kilo-gateway",
- "version": "7.0.32",
+ "version": "7.0.33",
"type": "module",
"license": "MIT",
"description": "Unified Kilo Gateway package for OpenCode - authentication, provider, and API integration",
diff --git a/packages/kilo-gateway/src/api/notifications.ts b/packages/kilo-gateway/src/api/notifications.ts
index e61e5aa6740..2d0994e94bd 100644
--- a/packages/kilo-gateway/src/api/notifications.ts
+++ b/packages/kilo-gateway/src/api/notifications.ts
@@ -30,7 +30,7 @@ const NOTIFICATIONS_TIMEOUT_MS = 5000
* Fetch notifications from Kilo API
*
* @param options - Configuration with token and optional organization ID
- * @returns Array of notifications filtered for CLI display
+ * @returns Array of notifications from the Kilo API (clients filter by showIn)
*/
export async function fetchKilocodeNotifications(options: {
kilocodeToken?: string
@@ -57,11 +57,7 @@ export async function fetchKilocodeNotifications(options: {
if (!result.success) return []
- // Filter to show notifications meant for CLI (or no specific target)
- // Accept "cli", "extension", or no showIn field (matches old Kilo CLI behavior)
- return result.data.notifications.filter(
- ({ showIn }) => !showIn || showIn.includes("cli") || showIn.includes("extension"),
- )
+ return result.data.notifications
} catch {
return []
}
diff --git a/packages/kilo-gateway/src/server/routes.ts b/packages/kilo-gateway/src/server/routes.ts
index 2b25b4ba790..19a239f35ff 100644
--- a/packages/kilo-gateway/src/server/routes.ts
+++ b/packages/kilo-gateway/src/server/routes.ts
@@ -254,10 +254,10 @@ export function createKiloRoutes(deps: KiloRoutesDeps) {
const endpoint = new URL("fim/completions", baseApiUrl)
const headers = {
- "Content-Type": "application/json",
- Authorization: `Bearer ${token}`,
- ...buildKiloHeaders(undefined, { kilocodeOrganizationId: organizationId }),
- [HEADER_FEATURE]: "autocomplete",
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${token}`,
+ ...buildKiloHeaders(undefined, { kilocodeOrganizationId: organizationId }),
+ [HEADER_FEATURE]: "autocomplete",
}
const response = await fetch(endpoint, {
diff --git a/packages/kilo-i18n/package.json b/packages/kilo-i18n/package.json
index c4c1cd6fe7c..9ed52fbd82a 100644
--- a/packages/kilo-i18n/package.json
+++ b/packages/kilo-i18n/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/kilo-i18n",
- "version": "7.0.32",
+ "version": "7.0.33",
"type": "module",
"license": "MIT",
"description": "Kilo-specific i18n translations and overrides",
diff --git a/packages/kilo-telemetry/package.json b/packages/kilo-telemetry/package.json
index 0736beca011..dc2ea2fa04b 100644
--- a/packages/kilo-telemetry/package.json
+++ b/packages/kilo-telemetry/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/kilo-telemetry",
- "version": "7.0.32",
+ "version": "7.0.33",
"type": "module",
"license": "MIT",
"description": "Telemetry for Kilo CLI - PostHog analytics integration",
diff --git a/packages/kilo-ui/.gitattributes b/packages/kilo-ui/.gitattributes
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/packages/kilo-ui/.gitignore b/packages/kilo-ui/.gitignore
new file mode 100644
index 00000000000..de95c927d82
--- /dev/null
+++ b/packages/kilo-ui/.gitignore
@@ -0,0 +1,3 @@
+storybook-static/
+test-results/
+playwright-report/
diff --git a/packages/kilo-ui/package.json b/packages/kilo-ui/package.json
index 815226ac024..989da989136 100644
--- a/packages/kilo-ui/package.json
+++ b/packages/kilo-ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@kilocode/kilo-ui",
- "version": "7.0.32",
+ "version": "7.0.33",
"type": "module",
"license": "MIT",
"exports": {
@@ -84,6 +84,7 @@
"solid-js": "catalog:"
},
"devDependencies": {
+ "@playwright/test": "1.58.2",
"@storybook/addon-a11y": "10.2.10",
"@storybook/addon-docs": "10.2.10",
"@storybook/addon-themes": "10.2.10",
@@ -97,7 +98,9 @@
},
"scripts": {
"storybook": "storybook dev -p 6006",
- "build-storybook": "storybook build"
+ "build-storybook": "storybook build",
+ "test:visual": "playwright test",
+ "test:visual:update": "playwright test --update-snapshots"
},
"dependencies": {
"@kobalte/core": "0.13.11"
diff --git a/packages/kilo-ui/playwright.config.ts b/packages/kilo-ui/playwright.config.ts
new file mode 100644
index 00000000000..7b2b32ab6e8
--- /dev/null
+++ b/packages/kilo-ui/playwright.config.ts
@@ -0,0 +1,41 @@
+import { defineConfig, devices } from "@playwright/test"
+
+export default defineConfig({
+ testDir: "./tests",
+ testMatch: "**/*.spec.ts",
+ fullyParallel: true,
+ forbidOnly: !!process.env["CI"],
+ retries: process.env["CI"] ? 1 : 0,
+ // Number of parallel workers — defaults to half the CPU count locally,
+ // override with PLAYWRIGHT_WORKERS env var or --workers CLI flag
+ workers: process.env["PLAYWRIGHT_WORKERS"]
+ ? Number.parseInt(process.env["PLAYWRIGHT_WORKERS"]!, 10) || undefined
+ : undefined,
+ reporter: [["html", { open: "never" }], ["list"]],
+ use: {
+ baseURL: "http://localhost:6006",
+ viewport: { width: 1280, height: 720 },
+ reducedMotion: "reduce",
+ screenshot: "only-on-failure",
+ },
+ projects: [
+ {
+ name: "chromium",
+ use: { ...devices["Desktop Chrome"] },
+ },
+ ],
+ webServer: {
+ command:
+ "bunx storybook build -o ./storybook-static && bunx http-server ./storybook-static -p 6006 --silent",
+ url: "http://localhost:6006",
+ reuseExistingServer: !process.env["CI"],
+ timeout: 300_000,
+ },
+ timeout: 60_000,
+ expect: {
+ timeout: 10_000,
+ toHaveScreenshot: {
+ maxDiffPixelRatio: 0.01,
+ },
+ },
+})
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts b/packages/kilo-ui/tests/visual-regression.spec.ts
new file mode 100644
index 00000000000..42ef6eefa8e
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts
@@ -0,0 +1,74 @@
+import { test, expect, type Page } from "@playwright/test"
+
+type Story = {
+ id: string
+ title: string
+ name: string
+}
+
+type StoriesIndex = {
+ stories?: Record
+ entries?: Record
+}
+
+const STORYBOOK_URL = "http://localhost:6006"
+
+// Fetched once per worker process — cheap HTTP call to the already-running Storybook
+async function fetchStories(): Promise {
+ const res = await fetch(`${STORYBOOK_URL}/index.json`).catch(() =>
+ fetch(`${STORYBOOK_URL}/stories.json`),
+ )
+ if (!res.ok) throw new Error(`Storybook index fetch failed: ${res.status} ${res.statusText}`)
+ const data = (await res.json()) as StoriesIndex
+ const map = data.entries ?? data.stories ?? {}
+ return Object.values(map).filter((s) => s.id && !s.id.endsWith("--docs"))
+}
+
+async function disableAnimations(page: Page) {
+ await page.addStyleTag({
+ content: `
+ *, *::before, *::after {
+ animation-duration: 0s !important;
+ animation-delay: 0s !important;
+ transition-duration: 0s !important;
+ transition-delay: 0s !important;
+ }
+ `,
+ })
+}
+
+// Stories to skip from visual regression:
+// - Font/Favicon: inject into , no visible content in #storybook-root
+// - Typewriter: uses JS setTimeout + Math.random(), inherently non-deterministic
+const SKIP = new Set([
+ "components-font--default",
+ "components-font--nerd-fonts",
+ "components-favicon--default",
+ "components-typewriter--default",
+ "components-typewriter--short",
+ "components-typewriter--long",
+ "components-typewriter--as-heading",
+ "components-typewriter--with-class",
+])
+
+// Generate one test() per story so Playwright's scheduler can distribute
+// them freely across workers — no manual sharding needed.
+const stories = (await fetchStories()).filter((s) => !SKIP.has(s.id))
+
+for (const story of stories) {
+ test(`${story.title} / ${story.name}`, async ({ page }) => {
+ await page.goto(
+ `/iframe.html?id=${story.id}&viewMode=story&globals=colorScheme:dark;theme:kilo`,
+ { waitUntil: "load" },
+ )
+ await disableAnimations(page)
+ // Wait for Kobalte/SolidJS to finish hydrating interactive components
+ await page.waitForSelector("#storybook-root *", { state: "attached" })
+
+ // Screenshot just the story content, not the full 1280x720 canvas.
+ // Use [component, variant] path so snapshots are grouped per component dir.
+ const [component, variant] = story.id.split("--")
+ const root = page.locator("#storybook-root")
+ await expect(root).toHaveScreenshot([component, `${variant}.png`])
+ })
+}
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-accordion/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-accordion/default-chromium-linux.png
new file mode 100644
index 00000000000..1053c1582bb
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-accordion/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5a9cc941f1b53c84801131c244c5ed221e8cac90196b66a39f612af303d94c94
+size 8976
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-accordion/multiple-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-accordion/multiple-chromium-linux.png
new file mode 100644
index 00000000000..b3f6da8710a
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-accordion/multiple-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4f711edf59c220e6a51b6504bb2e8ecd8a7985788e043dd5909e2a242f034de
+size 6948
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/all-icons-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/all-icons-chromium-linux.png
new file mode 100644
index 00000000000..c7c2371cadd
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/all-icons-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e087e90137add1cf6b3b1a31e7110d00526a8dd5a7d0a79e9d7cecd334eaff01
+size 20440
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/cursor-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/cursor-chromium-linux.png
new file mode 100644
index 00000000000..4772a2515de
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/cursor-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f0386bc84951dc3e805b760c490cc26b68034f5fbe1c26719ce41225b2a9e4ca
+size 1125
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/vs-code-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/vs-code-chromium-linux.png
new file mode 100644
index 00000000000..027a3d5e6b9
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/vs-code-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a947b9aa3971baa684293e773785c2242bc5c6e29f1a55fe82a90af996fe0d20
+size 1311
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/zed-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/zed-chromium-linux.png
new file mode 100644
index 00000000000..8ecaec78b5e
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-appicon/zed-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:847d6427507680baf18dbf5bea94dafc8caa25fd81c2ea7528d40fd249d1e700
+size 743
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/all-sizes-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/all-sizes-chromium-linux.png
new file mode 100644
index 00000000000..b64ac537df7
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/all-sizes-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c083a3befc996442140690aa1205c9757e3a42a5319d9a2dde4c9752a6213e75
+size 1321
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/default-chromium-linux.png
new file mode 100644
index 00000000000..67a77ba3f3b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:61cb8e2353522bbcaa9a4620d99b38352a1541c3c5446a1a494aa98162bc5859
+size 373
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/large-chromium-linux.png
new file mode 100644
index 00000000000..d63e2e5a0c8
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:719b8329543d629a9243cbe929f2c2fc30b77d7a540c08678220f7653badb1c8
+size 366
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/normal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/normal-chromium-linux.png
new file mode 100644
index 00000000000..defb603e8b2
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/normal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dc3aa85936933993e0edbe56fe3e1b6337556bf913aa35edfd37caab62edfa74
+size 598
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/small-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/small-chromium-linux.png
new file mode 100644
index 00000000000..a14ce8ffc59
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/small-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6eec16318fdc68f8226db0230f38fb0b3282fb174e11495b8c50b2c09cb7ab1f
+size 383
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-custom-colors-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-custom-colors-chromium-linux.png
new file mode 100644
index 00000000000..42fafc8440a
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-custom-colors-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:befa25f36efd49672cad2eb6eb7ef0802269981ec4b7eafac343b55288c58fa1
+size 579
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-image-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-image-chromium-linux.png
new file mode 100644
index 00000000000..0e23ee9a5f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-image-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:79b80c13a1fa198f1602c85728a48467ac9b47c6430dadd6ff698f9c4d39980e
+size 809
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..20154d22df3
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dfd2a0c4eb4e848a61d1cc309b637980d71e09325fb330f4329df05e754464d0
+size 9497
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/default-chromium-linux.png
new file mode 100644
index 00000000000..ee216a48e27
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7ff2fc5b2f48973c4f217292fca770cb8fafafaf084d512d81486243656345b3
+size 2469
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/default-open-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/default-open-chromium-linux.png
new file mode 100644
index 00000000000..58e123c1840
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/default-open-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6213f881a8eaa9a6fde7e4f46fbced82a308afe426433330426469975e9d670e
+size 4292
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/generic-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/generic-chromium-linux.png
new file mode 100644
index 00000000000..4a3a76bcfd1
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/generic-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a9813f847aa72accf4f17d4b3359717274c34189606a0a8cfee203a8e32101c
+size 1622
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/locked-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/locked-chromium-linux.png
new file mode 100644
index 00000000000..8f118ea58aa
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/locked-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:afb54400b855748eac7722a9cef3877fa0b70fd56f466d396a93559d7634767c
+size 3637
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/no-children-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/no-children-chromium-linux.png
new file mode 100644
index 00000000000..d4efee41053
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/no-children-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:143ce0f9a640b0558d381485972f5818feacd84d2a626187dfe644f86d46244e
+size 1772
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/with-args-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/with-args-chromium-linux.png
new file mode 100644
index 00000000000..370a29bbb07
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-basictool/with-args-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:53f1ef3da39ca34fe50fe48f36a607c83e5b751a471812e1e3eb41d8aaeac5d1
+size 3433
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..94453ca7288
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d0f6231acb66fe78d5092a7225fd5614f27f4c77c61230bf7151db0e80d196b9
+size 6895
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/disabled-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/disabled-chromium-linux.png
new file mode 100644
index 00000000000..67104b9ab8f
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/disabled-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ce98be74244727ae4175aeb8d130be0b3f00fedb8dfa1443a45f9ceb909e1418
+size 1299
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/ghost-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/ghost-chromium-linux.png
new file mode 100644
index 00000000000..fde0cb1c706
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/ghost-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:56baa5ea0a41832ec201ed4ab51ac3889c5d55824c1629ab9bdbc9c3c9ae5637
+size 1310
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/large-chromium-linux.png
new file mode 100644
index 00000000000..5764e19effc
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:890aa247468b220824d4a9ad0f722b67aa85bc76291037bebd9c5c6539d56093
+size 1011
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/normal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/normal-chromium-linux.png
new file mode 100644
index 00000000000..1046968dd7c
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/normal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3607f7a671af286353127740a6fb704104d8be43e4425ad5e0d4f4f382987ff2
+size 1018
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/primary-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/primary-chromium-linux.png
new file mode 100644
index 00000000000..4e4ec7b6186
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/primary-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c7e36a11db6f6743c9be84ca587c353e90c24bd0077e810b3c7d7ba4f760283c
+size 1687
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/secondary-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/secondary-chromium-linux.png
new file mode 100644
index 00000000000..e6501cc9dd8
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/secondary-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7a39c19e03cc544fcc6282525921e5913d62492493737cfd61447e7b47a07116
+size 2172
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/small-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/small-chromium-linux.png
new file mode 100644
index 00000000000..ea360b52841
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/small-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:130d9bc651e1095ecad3a6b098c155c8e95e175c0f9a803d5e5fe15f1a7a41bd
+size 774
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/with-icon-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/with-icon-chromium-linux.png
new file mode 100644
index 00000000000..5ab19fcfd15
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-button/with-icon-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d1da9e2d525f04dd4fbc132b442a62df7a1160538bd77b21ae88a9c2c91239ad
+size 1344
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..6a708c7af28
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2ff01b76764db6c3d7cc014ddc6e3bfd7950383c5d224ae248a211b5c886be60
+size 9835
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/error-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/error-chromium-linux.png
new file mode 100644
index 00000000000..e03794a788b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/error-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7874b69d25efe0187c10d1c9b5cda8a2c6d835850be972a8088a3f09e9c3aa14
+size 1241
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/info-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/info-chromium-linux.png
new file mode 100644
index 00000000000..12a9e4f0c68
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/info-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2cf7f2e2c1f4428bede09a7ef87215d7cf8d6c9768349e401d69dead4b7d0b79
+size 1905
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/normal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/normal-chromium-linux.png
new file mode 100644
index 00000000000..14d67bfdb13
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/normal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:83f46a21051193f7f2a6f7238b676078bbd7df61adfa4c5b137363d87480e9d3
+size 1971
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/success-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/success-chromium-linux.png
new file mode 100644
index 00000000000..de04d2b5ad0
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/success-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:70944abc9206e888cd438dc821f6df80861d9950511a0da4282a39a740c5e50e
+size 2122
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/warning-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/warning-chromium-linux.png
new file mode 100644
index 00000000000..777c9864209
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-card/warning-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:27920c6e87bb1fe8f2869757f2d22eeb556bf16c032912bf765115b801aada3b
+size 2198
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..1924796bcb2
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea3ba6b80092fe196c8a9cb08ba5f832512d6833d1b5009bacc58788f228f8a1
+size 10807
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/checked-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/checked-chromium-linux.png
new file mode 100644
index 00000000000..06f7dd823f2
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/checked-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e9230dbb9be362552f70b1dfcd6600d8f34b184bb9139a13b8553f8270eef918
+size 1503
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/disabled-checked-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/disabled-checked-chromium-linux.png
new file mode 100644
index 00000000000..9509862f31f
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/disabled-checked-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:491fd50bf92a2ae04a2034e90c08cb47816cb9eb9454767a48b6d82041cde9da
+size 2170
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/disabled-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/disabled-chromium-linux.png
new file mode 100644
index 00000000000..b46530735e1
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/disabled-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b766d9c11157f59221ca5859c6242ac18f79b75d17b623aa05bfc36bfd0f043
+size 1427
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/indeterminate-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/indeterminate-chromium-linux.png
new file mode 100644
index 00000000000..458a114a642
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/indeterminate-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8bbadbb328b9aa2f85f3bd969133a57b24d62a23e4822c55b1971adf86408ed6
+size 1469
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/unchecked-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/unchecked-chromium-linux.png
new file mode 100644
index 00000000000..aef07539878
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/unchecked-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b30bf72cd92f70857347ef6dec6d6658637341b40844fbd26b4f2e2a1a955413
+size 1243
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/with-description-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/with-description-chromium-linux.png
new file mode 100644
index 00000000000..cce6dcd7c92
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-checkbox/with-description-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:97448267eece4d79b7ead1a7b7f28a27dbb1e3bec2defeb85256941f2f9a9425
+size 3312
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/default-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/no-line-numbers-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/no-line-numbers-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/no-line-numbers-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/python-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/python-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/python-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/short-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/short-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/short-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/split-overflow-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/split-overflow-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/split-overflow-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/type-script-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/type-script-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-code/type-script-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..e9b02457fe8
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:050b264c0a664953e665d855066cf2282f41ed8e2aeb449d833929ca09ff84c5
+size 5045
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/collapsed-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/collapsed-chromium-linux.png
new file mode 100644
index 00000000000..212b6e437df
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/collapsed-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fc575023f5ede7ba8d8dc0fd88146826d40efa9953e8aff6bc5222f1eed14864
+size 1572
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/ghost-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/ghost-chromium-linux.png
new file mode 100644
index 00000000000..6d9ab4af707
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/ghost-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:93a98b91f13adc8dd43b9116790cec95bba57cc71a99eda61bb911c0a7084a29
+size 4994
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/normal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/normal-chromium-linux.png
new file mode 100644
index 00000000000..a340163e990
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-collapsible/normal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4514352c4d34fce3cb09f2f16fcd7fc817a488bf2424aa09297532207ea1fad
+size 5199
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-contextmenu/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-contextmenu/default-chromium-linux.png
new file mode 100644
index 00000000000..a7f512e988c
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-contextmenu/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e97306d73cfcfa1f680fe8ee15d4d849a7b4f01ebd61c4873e0c44c4ac91dd00
+size 3405
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-contextmenu/with-groups-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-contextmenu/with-groups-chromium-linux.png
new file mode 100644
index 00000000000..0659da6abb1
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-contextmenu/with-groups-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4004e8e7fee1781f0cb89cdf878db530b0f20236b20c1f5d466bb4f9d4c4b2e3
+size 3777
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..aeb04a41ac1
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d15875f85359b44cf46c968032197ed12f7c8bd2c99c011df79a51be6dea2691
+size 4977
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/large-chromium-linux.png
new file mode 100644
index 00000000000..d3504bd5ba5
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:33ce241de394bdc80c8c233d40c32c137368dba840247a23041ce964c6b4b2c3
+size 2445
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/no-title-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/no-title-chromium-linux.png
new file mode 100644
index 00000000000..4361c43277f
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/no-title-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:77db8ea0e6e2dda4d9349f5a29fae0b2de506c7bb98325ddff238aab8d1907cd
+size 2274
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/normal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/normal-chromium-linux.png
new file mode 100644
index 00000000000..4361c43277f
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/normal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:77db8ea0e6e2dda4d9349f5a29fae0b2de506c7bb98325ddff238aab8d1907cd
+size 2274
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/x-large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/x-large-chromium-linux.png
new file mode 100644
index 00000000000..240ebd7d33b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dialog/x-large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ba9380f9a80f5b4a9e65ad4a87f97f42489ebbe9bc2067534335829e73414d25
+size 2658
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/added-file-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/added-file-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/added-file-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/config-change-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/config-change-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/config-change-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/default-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/deleted-file-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/deleted-file-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/deleted-file-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/split-view-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/split-view-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diff/split-view-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffchanges/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffchanges/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..c4521ed06df
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffchanges/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b1abc37138525d3a02e3f301c145437ee0e7391ee2a7d89de14d103139998b14
+size 2418
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffchanges/bars-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffchanges/bars-chromium-linux.png
new file mode 100644
index 00000000000..fc55dcdfb55
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffchanges/bars-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:db0522981066f0be4f212aa71cb0546356f6e9638d12bdd3605e08a981451cbf
+size 277
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffchanges/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffchanges/default-chromium-linux.png
new file mode 100644
index 00000000000..86a4f4c8642
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffchanges/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1aaffe98ff4254eebf75c623b3cf90fb6045495eb53dc1b2914f3847de55f55
+size 1019
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffssr/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffssr/default-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffssr/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffssr/with-split-style-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffssr/with-split-style-chromium-linux.png
new file mode 100644
index 00000000000..6e98198e2f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-diffssr/with-split-style-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b699a8e9672395ff692a8479eb40776516a4a580628c8df8c9d5f2b4c4b4c156
+size 1253
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/default-chromium-linux.png
new file mode 100644
index 00000000000..b53045b4f52
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4025108089ff661e325aa0eebdcf97ec640a1a688055362a9b80296f9d1ab7f6
+size 1756
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/with-checkbox-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/with-checkbox-chromium-linux.png
new file mode 100644
index 00000000000..3045964656d
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/with-checkbox-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:50d533da79b80fca9e763cced0d08f536b5af53c1fbe254b1038189f2e68ecbb
+size 2303
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/with-groups-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/with-groups-chromium-linux.png
new file mode 100644
index 00000000000..6cdfa178e30
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/with-groups-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fa6478301b5c9fb5950dd84e394a4a709b071ee8959e0ef504f0c932c6474407
+size 1047
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/with-sub-menu-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/with-sub-menu-chromium-linux.png
new file mode 100644
index 00000000000..91dcfe76056
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-dropdownmenu/with-sub-menu-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9af5220a6729832954a3836b8ff5de6c92434cb94c367f8aa764052d8fead514
+size 2259
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..575e71f6a8c
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f00c2f40d848d9bcdcbc18e3ead5538f2da184b5959f9b1e3b3118794322983d
+size 8162
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/folder-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/folder-chromium-linux.png
new file mode 100644
index 00000000000..65579c5dcb5
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/folder-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f26b4289f459a84fa3b24d5fb9304be8df6e2b0791d41314dfe5f746df84448b
+size 705
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/folder-expanded-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/folder-expanded-chromium-linux.png
new file mode 100644
index 00000000000..33b7e636880
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/folder-expanded-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:296784541ab8190b661988afddcf48637712cbde1fda144af9f5359d77818887
+size 818
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/java-script-file-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/java-script-file-chromium-linux.png
new file mode 100644
index 00000000000..05db3ef4205
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/java-script-file-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:66c2573489205426b52c2c2ec9f180349397196ea8f3488b05cf161a606c27b6
+size 404
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/markdown-file-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/markdown-file-chromium-linux.png
new file mode 100644
index 00000000000..7884a9692a3
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/markdown-file-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:da4c9cdc3b86c47bc6ff3da2d7c26928db1aa4a7aa8b6b1b10f639125fb810d5
+size 626
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/type-script-file-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/type-script-file-chromium-linux.png
new file mode 100644
index 00000000000..bc71a8ed0df
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-fileicon/type-script-file-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bb9d5d23e428ca0b005b578baee97ecf43f2bad0806b8c2a7233032d0d89311f
+size 394
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-hovercard/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-hovercard/default-chromium-linux.png
new file mode 100644
index 00000000000..7955be20aeb
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-hovercard/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bb99e0d22ec82f00d1014f0580fe0447550bb8bbb68e9e2c5c5b88d507ccf3cf
+size 2443
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-hovercard/with-user-card-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-hovercard/with-user-card-chromium-linux.png
new file mode 100644
index 00000000000..0e5d15dc9ec
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-hovercard/with-user-card-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9a29e49653f62f63bf6bd9b0643ad638e5a94015a577ae5da71b5b42dd07eae6
+size 896
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/all-icons-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/all-icons-chromium-linux.png
new file mode 100644
index 00000000000..6547e73ad08
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/all-icons-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e4d320a6bd301c5bd459a92e52099211e23e3886d7f3bfe4b55d004cc1aaf590
+size 30989
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/default-chromium-linux.png
new file mode 100644
index 00000000000..3cfa7a447af
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ddff801f888309335c766f37b4beae40ba2b1662a436fb814d999ca984c5fbd
+size 684
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/large-chromium-linux.png
new file mode 100644
index 00000000000..75cc8bab93e
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8b34e400c7550e29a41e785db080dd2a82d369d2ddd9a4bdddbeec3457dd81ab
+size 906
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/medium-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/medium-chromium-linux.png
new file mode 100644
index 00000000000..75cc8bab93e
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/medium-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8b34e400c7550e29a41e785db080dd2a82d369d2ddd9a4bdddbeec3457dd81ab
+size 906
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/small-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/small-chromium-linux.png
new file mode 100644
index 00000000000..f53c803377d
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-icon/small-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e3af872f3eccfba9ae566a1c6eab9e06db1ad0d324876c83d5a66d4f79a247e
+size 600
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..96e43d99dcf
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ba54779172cffc9067155476fa117b84c6d35f1c9de3d53aadecfac4c8760ff
+size 2129
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/ghost-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/ghost-chromium-linux.png
new file mode 100644
index 00000000000..b17968dfcf0
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/ghost-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d5993c628b55b8b10aa319680eedf7e46f010772940166ca9ea8018931cd01a9
+size 300
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/large-chromium-linux.png
new file mode 100644
index 00000000000..f0a1ffd8999
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:864798e18102b6a6070bcbcf881a4bc74af904fcd6156cc22e3b105166172a7a
+size 1047
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/primary-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/primary-chromium-linux.png
new file mode 100644
index 00000000000..99edb0c61df
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/primary-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6c1215fa90949a597b5af3892416ab99bd56354e7b986160ff3fc2be16945f35
+size 203
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/secondary-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/secondary-chromium-linux.png
new file mode 100644
index 00000000000..e6fcaefb0f2
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/secondary-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b35f393bf16db8570209ea1dd6de2b934155a5bb7aac4c7872158b2e7f4919b3
+size 729
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/small-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/small-chromium-linux.png
new file mode 100644
index 00000000000..a3a227ae7ac
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-iconbutton/small-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:964bcd498d0d5bfa4346e5eaf4702af769dee882b27a9ec84a907025967b2699
+size 750
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-imagepreview/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-imagepreview/default-chromium-linux.png
new file mode 100644
index 00000000000..fbad0115d19
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-imagepreview/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eddd165d1c76b11306f27ec5e8c6e101467bd9424f7aa8a8ec0a0e76105a45af
+size 2278
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-imagepreview/with-landscape-image-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-imagepreview/with-landscape-image-chromium-linux.png
new file mode 100644
index 00000000000..93204b74d8d
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-imagepreview/with-landscape-image-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5fa0d4ce2f4e2b64386589162341e400897c6130bec18b0d3b2dde2e1dcd6aba
+size 2666
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-imagepreview/with-portrait-image-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-imagepreview/with-portrait-image-chromium-linux.png
new file mode 100644
index 00000000000..2d42c334b2c
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-imagepreview/with-portrait-image-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6ca3197c0b19b991d5d12005c43b95b5e204fb560bc0ca981eacb4ac5b822bed
+size 2250
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/controlled-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/controlled-chromium-linux.png
new file mode 100644
index 00000000000..491ef587556
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/controlled-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bff2dbdb1769e2fc5ccfe34e03f52719935ec988f493ba068537535c50e2e2ad
+size 2627
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/default-chromium-linux.png
new file mode 100644
index 00000000000..3e26113d531
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:473cda7773f1c098782b1c883c9819ef80c3ab28006b7b8f6d7d31f75a6e6004
+size 1079
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/disabled-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/disabled-chromium-linux.png
new file mode 100644
index 00000000000..822a5f5ff64
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/disabled-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dc59bce18bced0b35cad077b29bec38f1d5d9d9d5a9f95029b73711366b9f4ec
+size 1576
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/with-width-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/with-width-chromium-linux.png
new file mode 100644
index 00000000000..d4ba4ca3fad
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-inlineinput/with-width-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:456f2727514d00bd6ccbae9ac88868cbc7aa11657979b6659c3ac32e0333aecb
+size 1362
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-keybind/combination-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-keybind/combination-chromium-linux.png
new file mode 100644
index 00000000000..c43bf3f78bb
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-keybind/combination-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bc45c27748e8d6d4e6d88e3e43243a20c290abfaa6b6ee68c4640fee44f5465c
+size 2315
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-keybind/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-keybind/default-chromium-linux.png
new file mode 100644
index 00000000000..af552cd97f9
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-keybind/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d146fdea24a45eec008b6097402d410af4609602bfa806244a7b959f40ae93cd
+size 869
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/anchor-closed-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/anchor-closed-chromium-linux.png
new file mode 100644
index 00000000000..b0321cde6e5
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/anchor-closed-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06aebd77fe4cfd1d5e614712f1e001505ee4d966f62b8f2d2b074329e5583b76
+size 1138
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/anchor-open-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/anchor-open-chromium-linux.png
new file mode 100644
index 00000000000..f20107a3348
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/anchor-open-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3da776ec846d1a803c76a50b8e2702bc141a7efb9a254afaf176c76bf3c4c5bb
+size 4700
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/comment-closed-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/comment-closed-chromium-linux.png
new file mode 100644
index 00000000000..b0321cde6e5
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/comment-closed-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06aebd77fe4cfd1d5e614712f1e001505ee4d966f62b8f2d2b074329e5583b76
+size 1138
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/comment-default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/comment-default-chromium-linux.png
new file mode 100644
index 00000000000..5bf4a51dfb5
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/comment-default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:366d69af86bd4e86ca884a115d8bd3705e803c355b3054e55542cbc26fb421f6
+size 6454
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/editor-default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/editor-default-chromium-linux.png
new file mode 100644
index 00000000000..9c0887c8486
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/editor-default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e3ea368c06c5399c012f673c6322567078f926ca407a9db0ed26c205f7a68634
+size 5143
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/editor-with-value-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/editor-with-value-chromium-linux.png
new file mode 100644
index 00000000000..cb27a3b0b9b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/editor-with-value-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fffbd8af2b7808663885800e0284201309e307bdec12e23e9ef5d7551c88efc7
+size 7175
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/interactive-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/interactive-chromium-linux.png
new file mode 100644
index 00000000000..7789ea63550
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-linecomment/interactive-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b7264e48be83e706067afee6b04bf49dd44552f53fc3afff6e7deb2476f86248
+size 2911
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/default-chromium-linux.png
new file mode 100644
index 00000000000..1ce24180868
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4d2d003c8fa5291a8a9f9edaef58944badda690513f6f46cd1995a9d3110c340
+size 10362
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/empty-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/empty-chromium-linux.png
new file mode 100644
index 00000000000..ffb455624f1
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/empty-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac05717230af21f295b7c7083f6ee3858419e3c976f1cdfdb96418bafa0b783a
+size 2529
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/with-current-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/with-current-chromium-linux.png
new file mode 100644
index 00000000000..9fcc38643a8
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/with-current-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5abe03f71a5a0cb421abf26a9f473cd488c7db1466cccec9bf9abda6d7eb1133
+size 6463
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/with-search-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/with-search-chromium-linux.png
new file mode 100644
index 00000000000..2101e870485
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-list/with-search-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a116a8c3fee761fa8cee336f5d920106564a909398d67bf23d59b7f4dae4c507
+size 8194
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..f064f00dd53
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0f1bee4033cc68f117ae7ed9c828e0ee77a802deba442b0c1798c6d4338b4c31
+size 1278
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/full-logo-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/full-logo-chromium-linux.png
new file mode 100644
index 00000000000..4f01d893d8e
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/full-logo-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e8d745f795494f1f39b217d8c19b4ccfdcbefb5631be25b09cc6f28f9186e308
+size 1032
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/mark-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/mark-chromium-linux.png
new file mode 100644
index 00000000000..1da4eb9357a
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/mark-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:030fee558a8cb8655b05800c955c7855798d48026f31d6e1b4213e3472ffb1ba
+size 221
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/splash-mark-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/splash-mark-chromium-linux.png
new file mode 100644
index 00000000000..2b2b3d8bf5a
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-logo/splash-mark-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8886c59d30d17b64e2b6181e71d7991755c1083d90304b60c99c82e1a6362ae4
+size 359
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/code-block-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/code-block-chromium-linux.png
new file mode 100644
index 00000000000..30cb48b6a64
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/code-block-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:53d4e02c516b96b6e5a85c678453a1338ad482559a169c1a8812556658275917
+size 7651
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/default-chromium-linux.png
new file mode 100644
index 00000000000..4c7cd3b461a
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:806549a46f37ecf0d4b4af87a2b22c7853e6cda99356e98adea54415b7e76497
+size 24022
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/lists-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/lists-chromium-linux.png
new file mode 100644
index 00000000000..227f0ffcab2
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/lists-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:02bcd8fff00820745dec840e9c45be7d8e1860252bd9e1a9fcf6381c0b4a81a4
+size 12581
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/short-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/short-chromium-linux.png
new file mode 100644
index 00000000000..eef15d518e9
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-markdown/short-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:379d3e0f6e0c6faf9cde52739ba8f5e49dd186475eb7a889a1779566752c2796
+size 4499
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagenav/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagenav/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..2e33537e16e
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagenav/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:38a366b425f06a59fa1c0d431dfa3c7931ec253e3d19a83fc6510df46b4e144a
+size 9055
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagenav/compact-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagenav/compact-chromium-linux.png
new file mode 100644
index 00000000000..8241a7991f8
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagenav/compact-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1d864e9e44116f3ff2bbd79a88a4b1f04053bdccf8f13108817dd24527d6cc51
+size 420
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagenav/normal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagenav/normal-chromium-linux.png
new file mode 100644
index 00000000000..3cb8695b453
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagenav/normal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b669cde59d3cff09e395975f836a1f133af7e0e236794261965bf313cf529498
+size 7804
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/assistant-message-story-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/assistant-message-story-chromium-linux.png
new file mode 100644
index 00000000000..96459b9b664
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/assistant-message-story-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f36283f93103024b8af2a93e6233cfff6dc8fbc2a5fe273de0f9e709e8f8bc13
+size 15965
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/full-conversation-turn-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/full-conversation-turn-chromium-linux.png
new file mode 100644
index 00000000000..e55234b4c33
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/full-conversation-turn-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a993599ddc1f6e3afd5e44f3d4b92d03d6d4e8699128055eeae0089ffabf80f
+size 20048
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/message-switch-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/message-switch-chromium-linux.png
new file mode 100644
index 00000000000..ce05279a333
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/message-switch-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a76639955a7a3e7c5f1369468db6bcbfa07451ebaed080738e3b321f03042490
+size 20048
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/user-message-story-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/user-message-story-chromium-linux.png
new file mode 100644
index 00000000000..810eebcae2b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/user-message-story-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f8e48fabc63ede1c9ff99614d852ceaeb60b3e53275ff20cd8f03b2dbda79749
+size 3990
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/with-error-tool-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/with-error-tool-chromium-linux.png
new file mode 100644
index 00000000000..10a1584458d
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/with-error-tool-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:61695c2c9760589c8f190dba0442de993cc8a362c360c1fa55cc23709979eabb
+size 3983
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/with-running-tool-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/with-running-tool-chromium-linux.png
new file mode 100644
index 00000000000..8c8412fcc44
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-messagepart/with-running-tool-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:96ead064ea9e170ae1323929aeba0734da99f5b1126f869ee6beaa0cd3f1353e
+size 2893
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-popover/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-popover/default-chromium-linux.png
new file mode 100644
index 00000000000..06047734672
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-popover/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:da4bbd1d5e64e58c65fca1b5dfd04477aab5c54c051df1aaf2162e56aed32b67
+size 2309
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-popover/no-title-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-popover/no-title-chromium-linux.png
new file mode 100644
index 00000000000..aee2cee0fe7
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-popover/no-title-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:307abeb00907e24a912d94f314afce46d65cc6d911575395a9292c277679717c
+size 1483
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-popover/with-description-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-popover/with-description-chromium-linux.png
new file mode 100644
index 00000000000..9cf5c0b0685
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-popover/with-description-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:664d774396c5cae6fc0928519e97aa445020796d61399769b6675296a7b33383
+size 1880
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..a358b53a795
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:88fe01c9b5afc7b16cae0bd43ae4b52629b87360dd8d5aa8796ed185123cc0a1
+size 9503
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/custom-range-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/custom-range-chromium-linux.png
new file mode 100644
index 00000000000..890d1f3ad32
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/custom-range-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1f4eb0944f426bf5dd48fa453951d45c11131c4107d94b074052b7947ebd5736
+size 1996
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/default-chromium-linux.png
new file mode 100644
index 00000000000..c0e21df9aba
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:efd1739cfef90195bb78013cfbebed94cee8a0011bf6890dae9916b3a555885f
+size 552
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/empty-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/empty-chromium-linux.png
new file mode 100644
index 00000000000..c5193217a1d
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/empty-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6fc93e64e00c935595674e7059c139257dbe6ddfc846d415d11bffba13f2cdfe
+size 500
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/full-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/full-chromium-linux.png
new file mode 100644
index 00000000000..617c3118afe
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/full-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5318b743ae9282b26e031974c5b54854b031f78c96dc0958c06b39b892bc8f2e
+size 512
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/hidden-label-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/hidden-label-chromium-linux.png
new file mode 100644
index 00000000000..4b97295efe6
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/hidden-label-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ed4288f3c41676f6ec21beeb377b95c9e19b2eaee85c25834861a5ca8a50f3d7
+size 563
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/with-label-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/with-label-chromium-linux.png
new file mode 100644
index 00000000000..4a4c72a053c
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/with-label-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dc10594f3131f10be24540f21055c518490537166cff938764aa5f8272f1b38c
+size 1688
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/with-value-label-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/with-value-label-chromium-linux.png
new file mode 100644
index 00000000000..c092e8994b8
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progress/with-value-label-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a70e88bda46509b66216b7e29a17310ecde900486ed0207ac901bcb379c7622
+size 2078
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..f677135de43
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d5daafb3623d95e9117ad5efed263f1b5f80cf4ce092fe1b83b542ad5ba88a1
+size 1816
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/complete-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/complete-chromium-linux.png
new file mode 100644
index 00000000000..1c6d450d9ab
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/complete-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:55f4ae51c37ecab86a9df8c2e937b0aa4ba90e339aa14a4e102665d4ea92e6c0
+size 545
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/empty-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/empty-chromium-linux.png
new file mode 100644
index 00000000000..b4ef31645a1
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/empty-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:229ff2b5a011dc1d92cc031c56f11a463ef7a15aaa3f401b9103fd0115fa606c
+size 458
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/half-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/half-chromium-linux.png
new file mode 100644
index 00000000000..df08e6f6a83
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/half-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6acc3683e375d40bd75431cf79e9729acb3883afc39a8a6a40675c31455a86d2
+size 524
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/large-chromium-linux.png
new file mode 100644
index 00000000000..7bba7871b4d
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0ed0d9e9ae7b4d8a0fb1fe62b9a1e606f1b826e4389ff5469cdc378c53a2b5ba
+size 1333
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/quarter-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/quarter-chromium-linux.png
new file mode 100644
index 00000000000..4333446d40a
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/quarter-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5df0a74b8903e711df388d2c0261666438bc68d9db9f54b9e380ed17f8917f33
+size 523
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/three-quarters-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/three-quarters-chromium-linux.png
new file mode 100644
index 00000000000..84debe9e6ac
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-progresscircle/three-quarters-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a7620abd2c93945ee459521b7b64f6cff492121bd998632de526da65bbff747
+size 544
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/all-icons-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/all-icons-chromium-linux.png
new file mode 100644
index 00000000000..86bff6ec174
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/all-icons-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d7c404628cd16da87b9b181f97961e45b3e6227b439d04ebf38cd4a50fc9b660
+size 44681
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/anthropic-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/anthropic-chromium-linux.png
new file mode 100644
index 00000000000..e14a2a54401
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/anthropic-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f57937ec560c4348d2dbaa9a1b6617cf030c6b52abc2e8f9d12fbba9605a83ec
+size 450
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/default-chromium-linux.png
new file mode 100644
index 00000000000..6df6321d8f9
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3a441fbb4b9e476e4407fe8f24a0515f7e3ae06c22d4af9399987453cb55bf55
+size 584
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/gallery-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/gallery-chromium-linux.png
new file mode 100644
index 00000000000..744347162e5
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/gallery-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8b4dbb7667a78b3c6386b2646afd12c5148796a23efe6ad352cf70667a4b0788
+size 11428
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/google-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/google-chromium-linux.png
new file mode 100644
index 00000000000..1d7996c7a21
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/google-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:494764d17e6ebf8f2bf6cc8f075e93159192c6af5f2d25ec6ee7531e95130424
+size 436
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/large-chromium-linux.png
new file mode 100644
index 00000000000..e14a2a54401
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f57937ec560c4348d2dbaa9a1b6617cf030c6b52abc2e8f9d12fbba9605a83ec
+size 450
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/small-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/small-chromium-linux.png
new file mode 100644
index 00000000000..6df6321d8f9
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-providericon/small-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3a441fbb4b9e476e4407fe8f24a0515f7e3ae06c22d4af9399987453cb55bf55
+size 584
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..5726a361e2b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:272dc9adc1b4976fc745093f2f53cc417d752fc860cda5fb2f1925451b02a310
+size 4367
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/medium-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/medium-chromium-linux.png
new file mode 100644
index 00000000000..584ec5dabbe
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/medium-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:20018c528d1309de6fae49202840db842f33dc6c91d44a61fe626af75a4b28f2
+size 2304
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/small-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/small-chromium-linux.png
new file mode 100644
index 00000000000..fe6b296529d
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/small-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:13bfc1116e9a74d948586318c2244538d7bc46ac7828a9d42a8f6224a72fa79b
+size 2392
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/with-custom-labels-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/with-custom-labels-chromium-linux.png
new file mode 100644
index 00000000000..e5e567718bc
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-radiogroup/with-custom-labels-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6211a79ead87b62943ae7723bd901de274d8c6705919f39680281022b3089aff
+size 1845
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-resizehandle/horizontal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-resizehandle/horizontal-chromium-linux.png
new file mode 100644
index 00000000000..cb3cd5d38ef
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-resizehandle/horizontal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7f64c99a23f9e31b2464b210e5529e6158f49535a1257d843c8c765dd13eca51
+size 3675
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-resizehandle/vertical-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-resizehandle/vertical-chromium-linux.png
new file mode 100644
index 00000000000..1c935e599c5
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-resizehandle/vertical-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c747a69c7018ecf0c7e4ffcdff33174eddee23ddb9a071508677d8ed75585b76
+size 4374
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/default-chromium-linux.png
new file mode 100644
index 00000000000..7984ad24a1f
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5159923f3a02901e6df79b3f252cb0bca0bd01edbd6ce4f3e8169182f9824ffd
+size 1796
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/disabled-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/disabled-chromium-linux.png
new file mode 100644
index 00000000000..1956b2721bc
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/disabled-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:71d7cf950126465aa41e9938b8a31a4c9437fd1b26b4776c7f360dd7b5ccbdb9
+size 1466
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/settings-variant-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/settings-variant-chromium-linux.png
new file mode 100644
index 00000000000..7bdde6a25f2
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/settings-variant-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f72f6283b187acc3f3b4b46dbcc8be82472d570bc3968d4973c4193a1b3dd456
+size 1658
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/with-current-value-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/with-current-value-chromium-linux.png
new file mode 100644
index 00000000000..86f93f59906
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/with-current-value-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fff90725c6f1a009486a92a02411f90c0dc56e8bf67990bc67510d1a18539efa
+size 1299
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/with-group-by-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/with-group-by-chromium-linux.png
new file mode 100644
index 00000000000..6fc8e5c78b0
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-select/with-group-by-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8785d23edaaa03e3313b046c3b1d0bc4c75808bbb5264d9b217294769083f502
+size 1355
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/default-chromium-linux.png
new file mode 100644
index 00000000000..0c4ad00ffbe
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:72d26db7d023167d88075ea8cf9a54faca7745146281727bd98810db105687d1
+size 1828
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/empty-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/empty-chromium-linux.png
new file mode 100644
index 00000000000..0c4ad00ffbe
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/empty-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:72d26db7d023167d88075ea8cf9a54faca7745146281727bd98810db105687d1
+size 1828
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/single-file-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/single-file-chromium-linux.png
new file mode 100644
index 00000000000..0c4ad00ffbe
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/single-file-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:72d26db7d023167d88075ea8cf9a54faca7745146281727bd98810db105687d1
+size 1828
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/split-view-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/split-view-chromium-linux.png
new file mode 100644
index 00000000000..0c4ad00ffbe
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionreview/split-view-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:72d26db7d023167d88075ea8cf9a54faca7745146281727bd98810db105687d1
+size 1828
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/default-chromium-linux.png
new file mode 100644
index 00000000000..f8d8fc65ab0
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6c67c7cc21cd458c632228bdcee310615fae82c6d4c76e4d1170fa00224a9ac3
+size 29215
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/with-steps-expanded-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/with-steps-expanded-chromium-linux.png
new file mode 100644
index 00000000000..f8d8fc65ab0
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/with-steps-expanded-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6c67c7cc21cd458c632228bdcee310615fae82c6d4c76e4d1170fa00224a9ac3
+size 29215
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/working-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/working-chromium-linux.png
new file mode 100644
index 00000000000..8cae41cddfd
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/working-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a42dc13ad821549cde50a3bc1b3178851498b1fb31618fc12054db9e77851e3a
+size 5755
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/colored-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/colored-chromium-linux.png
new file mode 100644
index 00000000000..8e07b31bb12
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/colored-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bfd18d0cb6fe832ac2bcdde94bc7bad523a404ca0afca0646f1fa8189ba07129
+size 988
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/default-chromium-linux.png
new file mode 100644
index 00000000000..b9eb3865b41
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c58e5334b53a5f19235810a18ae9540566e748e09464947f441dd86e6bf090e3
+size 714
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/large-chromium-linux.png
new file mode 100644
index 00000000000..3796f95ae69
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7843a7571c0bda83ecbdcd33918a31abd96f311a3a022b54ec394eb9a52ae910
+size 1418
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/small-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/small-chromium-linux.png
new file mode 100644
index 00000000000..e99640be55e
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-spinner/small-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b8e730efa18b27ce0bcf6d45f02fe598d19fd1f1292c20bad336e042615dff9c
+size 662
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-stickyaccordionheader/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-stickyaccordionheader/default-chromium-linux.png
new file mode 100644
index 00000000000..bd4efdaf14a
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-stickyaccordionheader/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c7cbe20f8b23f86c6938b422eb25c4c02bfabc73dad0623135c8297e3bef04ac
+size 4167
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-stickyaccordionheader/in-scroll-container-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-stickyaccordionheader/in-scroll-container-chromium-linux.png
new file mode 100644
index 00000000000..9e021988953
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-stickyaccordionheader/in-scroll-container-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:363cefddc1fae2e45662a8ccb702b3117f9ac20a9d19fd97e84bb4cc701e0ddf
+size 8897
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..45844b4b323
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dbd6f802b14028db6b5d5cf728002b127f3b7f9d1782edbeea558e8a7270dabb
+size 6473
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/disabled-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/disabled-chromium-linux.png
new file mode 100644
index 00000000000..f545286fdb3
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/disabled-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bea2138b03dc374c4cda3e7131f3a57a2d95e0598d143d8dae86d766da10cea2
+size 2058
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/disabled-on-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/disabled-on-chromium-linux.png
new file mode 100644
index 00000000000..309855f02f4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/disabled-on-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:40f091d107a43682bd3e073b69f007800d7078a855149548b5996ac54352880d
+size 1761
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/off-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/off-chromium-linux.png
new file mode 100644
index 00000000000..e8096deb9a5
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/off-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ef79c54dcaf5820d4f9cb9ec377563a4631168ab2ed708e050e5dc99fc3e0f37
+size 1746
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/on-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/on-chromium-linux.png
new file mode 100644
index 00000000000..8947c7a3fd1
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/on-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:96d144668c6eabcac120fda7eef04c8768ddc0fb054f74560c9f4b0b958c6749
+size 1690
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/with-description-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/with-description-chromium-linux.png
new file mode 100644
index 00000000000..9ffb8b7b4ff
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-switch/with-description-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1823a6ce12ddba0e9072403acb195235e5aae61817ef0267f35bb340d173c136
+size 3927
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..d2e5a8fd4b6
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:89538e969778659b039abf926d1c9b81aa233d799d88f8d32957a2d0fbeb443b
+size 19685
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/alt-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/alt-chromium-linux.png
new file mode 100644
index 00000000000..0c72153f0a3
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/alt-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8fe133ce58b8beedf535c8929b3cf483aa470dda2892d854dd131116d51056a0
+size 3670
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/normal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/normal-chromium-linux.png
new file mode 100644
index 00000000000..f5921441453
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/normal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:192408b0435322159b8ffcfa8eb312d7504e6f0cf71b5649b266ecb13006b1f3
+size 3719
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/pill-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/pill-chromium-linux.png
new file mode 100644
index 00000000000..3898b8a9d39
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/pill-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a82f82b2539df8f5d1ac643e0cc088ad3fa64d50332583fa4119468afb52765e
+size 3909
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/settings-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/settings-chromium-linux.png
new file mode 100644
index 00000000000..686dbdd769b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/settings-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:53bfaead2891c6606f2b378778531acd5d2f4576efe74e2c3583452b7aedf18e
+size 3844
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/vertical-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/vertical-chromium-linux.png
new file mode 100644
index 00000000000..ce8cb1b6832
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tabs/vertical-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:87cd65bd03ecd5c31d82af303a7d1ae74301fa7b3720f5128d9aba433993d907
+size 4822
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tag/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tag/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..8e9eecc022d
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tag/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:de56033706e1bc01b48099b81943a45d2ce3225c3736363c2a92b64a4c966099
+size 1503
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tag/large-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tag/large-chromium-linux.png
new file mode 100644
index 00000000000..5943509b17c
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tag/large-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c2b40a4d5c1ccfc24b0e25afa9b29880649c082ae9a5829b2922660f875d01aa
+size 1092
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tag/normal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tag/normal-chromium-linux.png
new file mode 100644
index 00000000000..62e2a241729
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tag/normal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:299c3f8245b3f87d8249579fffeb1e369af0e270f611d1f13c5fe38b096b4078
+size 750
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..3d70cb15363
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9ee5c41c2be7f188d1c158ae651a8bda1eb0ecc0880133c0e010a4e95e930b01
+size 12542
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/copyable-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/copyable-chromium-linux.png
new file mode 100644
index 00000000000..e8fc29c2189
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/copyable-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eb4a4dee2489bc3bd9d5a13f017e351ad1c3a569206573533dc658dd4bb67fc1
+size 3556
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/copyable-link-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/copyable-link-chromium-linux.png
new file mode 100644
index 00000000000..f6a0b6d5acc
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/copyable-link-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6cf1a4ae471333675e699f1125fbf667d87121353aeda3ae602a3402934124bc
+size 4889
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/disabled-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/disabled-chromium-linux.png
new file mode 100644
index 00000000000..cb8945e0897
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/disabled-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:94963acc0066dd9cfd1e34cc7fb5e5996ffea0b367d11b3b8deb7a0a4a5a8b45
+size 2732
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/ghost-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/ghost-chromium-linux.png
new file mode 100644
index 00000000000..144a13688b8
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/ghost-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0115d8de5f08cf8746fd7ea6183537e083c3a28457751d0ed09bb0614c0af7f0
+size 1581
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/multiline-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/multiline-chromium-linux.png
new file mode 100644
index 00000000000..96f4c38f2cf
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/multiline-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1759944d91d6206b8718931133e52c5e12d7a6a94f9b7cb8f264132c8733a78b
+size 3349
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/normal-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/normal-chromium-linux.png
new file mode 100644
index 00000000000..056ca4274e4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/normal-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1427f7a5fa49ab30339b4cd43fd49a713dc93ab8556e403d16282ceffbb7cdcc
+size 1297
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/with-description-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/with-description-chromium-linux.png
new file mode 100644
index 00000000000..c19b4537fde
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/with-description-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:12b21c1f1ed66f72fd3590a29c5825238f77a2794b6d34dff0ba772ba9c7ca57
+size 4001
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/with-error-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/with-error-chromium-linux.png
new file mode 100644
index 00000000000..24814bb825c
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/with-error-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2603dbbcfc6b16505dafe5514444f9055c5fecf58862171e39ff46d258270425
+size 4050
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/with-label-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/with-label-chromium-linux.png
new file mode 100644
index 00000000000..cae31027e91
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-textfield/with-label-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:895a727758d5cc2d48b99d44d1659ae66393ba54149ff62a94b1bdb33ff393f3
+size 2006
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/all-variants-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/all-variants-chromium-linux.png
new file mode 100644
index 00000000000..46daede590b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/all-variants-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:63729e68e574e3e23a97791d4da76e7d7a44b93a216e858cd9b78bdf8e2d059c
+size 3183
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/default-chromium-linux.png
new file mode 100644
index 00000000000..724b141be00
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:abd3879f2d1b210dcf5a4a7e910b1fb23d83196386eda6d452b01c5aab377016
+size 1658
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/error-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/error-chromium-linux.png
new file mode 100644
index 00000000000..efc7502c51d
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/error-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e103e96177f5dd983a0bbc43aaaabaa30d50f2deec6dcb7fc8f82bac809e57ba
+size 1824
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/loading-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/loading-chromium-linux.png
new file mode 100644
index 00000000000..6c38e96b14b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/loading-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:15db7ba1aa8d06b71f7e703bfad58b5fd04ee14be99b423f629cad6b0d77697b
+size 2347
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/success-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/success-chromium-linux.png
new file mode 100644
index 00000000000..cfa2a952d5c
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/success-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8d58f9f9f4a079a76bab0580f56e9e0fe3dd6232c314b67f83417431bec99180
+size 2470
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/with-actions-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/with-actions-chromium-linux.png
new file mode 100644
index 00000000000..ada693ba7d1
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/with-actions-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:47a2d16c980cba0fcd5894b52f8f88308985f3bf11f6d2255e0507ff3fbd1ca3
+size 2575
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/with-icon-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/with-icon-chromium-linux.png
new file mode 100644
index 00000000000..51df2dadfed
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-toast/with-icon-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a6dff4d9aaf5653fe7dfffe1c2df43852ef0a57307755aa0387456078326180
+size 2235
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/default-chromium-linux.png
new file mode 100644
index 00000000000..4bdfa04312b
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/default-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:52c8c7003351b230870805837b37c43fdeb65dcd4853d1e1d1abaf80b7cfea58
+size 1092
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/force-open-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/force-open-chromium-linux.png
new file mode 100644
index 00000000000..674b62d65c4
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/force-open-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:56e5565bd5a44500c8acd26f0e3d9752b3424e16190374aa0567b23790b69ca3
+size 2073
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/placement-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/placement-chromium-linux.png
new file mode 100644
index 00000000000..754a2a572ee
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/placement-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:084546376f16728b406c2e12ffb4a794583c5e6b5bde67f04636920a9787dc81
+size 6688
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/with-keybind-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/with-keybind-chromium-linux.png
new file mode 100644
index 00000000000..54f6f41dc3a
--- /dev/null
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-tooltip/with-keybind-chromium-linux.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2105ee9b0e481cff75a97ec150e69b7603de10697f562516799b9d621659d545
+size 489
diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json
index 3dfb902e2d4..a31aad7d90c 100644
--- a/packages/kilo-vscode/package.json
+++ b/packages/kilo-vscode/package.json
@@ -2,7 +2,7 @@
"name": "kilo-code",
"displayName": "Kilo Code: AI Coding Agent, Copilot, and Autocomplete",
"description": "Open Source AI coding agent that generates code from natural language, automates tasks, and runs terminal commands. Features inline autocomplete, browser automation, automated refactoring, and custom modes for planning, coding, and debugging. Supports 500+ AI models including Claude (Anthropic), Gemini, Grok, GPT, Codex and GLM.",
- "version": "7.0.32",
+ "version": "7.0.33",
"icon": "assets/icons/logo-outline-black.png",
"galleryBanner": {
"color": "#FFFFFF",
@@ -399,26 +399,26 @@
},
{
"command": "kilo-code.new.agentManager.previousSession",
- "key": "ctrl+up",
- "mac": "cmd+up",
+ "key": "ctrl+alt+up",
+ "mac": "cmd+alt+up",
"when": "activeWebviewPanelId == 'kilo-code.new.AgentManagerPanel'"
},
{
"command": "kilo-code.new.agentManager.nextSession",
- "key": "ctrl+down",
- "mac": "cmd+down",
+ "key": "ctrl+alt+down",
+ "mac": "cmd+alt+down",
"when": "activeWebviewPanelId == 'kilo-code.new.AgentManagerPanel'"
},
{
"command": "kilo-code.new.agentManager.previousTab",
- "key": "ctrl+left",
- "mac": "cmd+left",
+ "key": "ctrl+alt+left",
+ "mac": "cmd+alt+left",
"when": "activeWebviewPanelId == 'kilo-code.new.AgentManagerPanel'"
},
{
"command": "kilo-code.new.agentManager.nextTab",
- "key": "ctrl+right",
- "mac": "cmd+right",
+ "key": "ctrl+alt+right",
+ "mac": "cmd+alt+right",
"when": "activeWebviewPanelId == 'kilo-code.new.AgentManagerPanel'"
},
{
diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts
index c562ea05f2f..68e78813db9 100644
--- a/packages/kilo-vscode/src/KiloProvider.ts
+++ b/packages/kilo-vscode/src/KiloProvider.ts
@@ -1045,7 +1045,8 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
}
try {
- const { data: notifications } = await this.client.kilo.notifications(undefined, { throwOnError: true })
+ const { data: all } = await this.client.kilo.notifications(undefined, { throwOnError: true })
+ const notifications = all.filter((n) => !n.showIn || n.showIn.includes("extension"))
const existing = this.extensionContext?.globalState.get("kilo.dismissedNotificationIds", []) ?? []
const active = new Set(notifications.map((n) => n.id))
const dismissedIds = existing.filter((id) => active.has(id))
diff --git a/packages/kilo-vscode/src/agent-manager/SetupScriptRunner.ts b/packages/kilo-vscode/src/agent-manager/SetupScriptRunner.ts
index 3703c4bb6c7..040a48eb889 100644
--- a/packages/kilo-vscode/src/agent-manager/SetupScriptRunner.ts
+++ b/packages/kilo-vscode/src/agent-manager/SetupScriptRunner.ts
@@ -1,15 +1,12 @@
/**
* SetupScriptRunner - Executes worktree setup scripts
*
- * Runs setup scripts in VS Code integrated terminal before agent starts.
- * Uses VS Code shell integration to track execution and exit code.
- * Falls back to sendText + onDidCloseTerminal if shell integration is unavailable.
- * Cross-platform: Unix uses sh, Windows uses cmd.exe.
+ * Runs setup scripts as VS Code tasks before the agent starts.
+ * This relies on VS Code's task execution model instead of manual terminal command strings.
*/
import * as vscode from "vscode"
-import { SetupScriptService } from "./SetupScriptService"
-import { buildSetupCommand } from "./setup-script-command"
+import { SetupScriptService, type SetupScriptInfo } from "./SetupScriptService"
export interface SetupScriptEnvironment {
/** Absolute path to the worktree directory */
@@ -18,6 +15,37 @@ export interface SetupScriptEnvironment {
repoPath: string
}
+interface SetupTaskCommand {
+ command: string
+ args: string[]
+}
+
+const TASK_END_GRACE_MS = 250
+const TASK_TIMEOUT_MS = 5 * 60 * 1000
+
+function quoteCmdArg(value: string): string {
+ return `"${value.replaceAll('"', '""')}"`
+}
+
+function buildSetupTaskCommand(script: SetupScriptInfo): SetupTaskCommand {
+ if (script.kind === "powershell") {
+ return {
+ command: "powershell.exe",
+ args: ["-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", script.path],
+ }
+ }
+ if (script.kind === "cmd") {
+ return {
+ command: "cmd.exe",
+ args: ["/d", "/s", "/c", quoteCmdArg(script.path)],
+ }
+ }
+ return {
+ command: "sh",
+ args: [script.path],
+ }
+}
+
export class SetupScriptRunner {
constructor(
private readonly output: vscode.OutputChannel,
@@ -31,16 +59,16 @@ export class SetupScriptRunner {
* @returns true if script was executed, false if skipped (no script configured)
*/
async runIfConfigured(env: SetupScriptEnvironment): Promise {
- if (!this.service.hasScript()) {
+ const script = this.service.resolveScript()
+ if (!script) {
this.log("No setup script configured, skipping")
return false
}
- const script = this.service.getScriptPath()
- this.log(`Running setup script: ${script}`)
+ this.log(`Running setup script: ${script.path}`)
try {
- await this.executeInTerminal(script, env)
+ await this.executeTask(script, env)
this.log("Setup script completed")
return true
} catch (error) {
@@ -50,99 +78,96 @@ export class SetupScriptRunner {
}
}
- /** Execute the setup script in a VS Code terminal and wait for it to finish. */
- private async executeInTerminal(script: string, env: SetupScriptEnvironment): Promise {
- const terminal = vscode.window.createTerminal({
- name: "Worktree Setup",
+ /** Execute setup script as a VS Code task and wait for completion. */
+ private async executeTask(script: SetupScriptInfo, env: SetupScriptEnvironment): Promise {
+ const task = this.createTask(script, env)
+ const execution = await vscode.tasks.executeTask(task)
+ await this.waitForTaskEnd(execution)
+ }
+
+ private createTask(script: SetupScriptInfo, env: SetupScriptEnvironment): vscode.Task {
+ const cmd = buildSetupTaskCommand(script)
+ const execution = new vscode.ProcessExecution(cmd.command, cmd.args, {
cwd: env.worktreePath,
env: {
WORKTREE_PATH: env.worktreePath,
REPO_PATH: env.repoPath,
},
- iconPath: new vscode.ThemeIcon("gear"),
})
-
- terminal.show(true)
-
- // Try shell integration first — gives us proper exit code tracking
- const integration = await this.waitForShellIntegration(terminal, 5000)
- if (integration) {
- this.log("Using shell integration for setup script execution")
- await this.runViaShellIntegration(terminal, integration, script, env)
- } else {
- this.log("Shell integration unavailable, falling back to sendText")
- await this.runViaSendText(terminal, script, env)
+ const task = new vscode.Task(
+ {
+ type: "kilo-worktree-setup",
+ script: script.path,
+ },
+ vscode.TaskScope.Workspace,
+ "Worktree Setup",
+ "Kilo Code",
+ execution,
+ [],
+ )
+ task.presentationOptions = {
+ reveal: vscode.TaskRevealKind.Always,
+ panel: vscode.TaskPanelKind.Dedicated,
+ clear: true,
+ showReuseMessage: false,
}
+ return task
}
- /** Wait for shell integration to become available on a terminal, with timeout. */
- private waitForShellIntegration(
- terminal: vscode.Terminal,
- timeout: number,
- ): Promise {
- if (terminal.shellIntegration) return Promise.resolve(terminal.shellIntegration)
-
- return new Promise((resolve) => {
- const timer = setTimeout(() => {
- listener.dispose()
- resolve(undefined)
- }, timeout)
-
- const listener = vscode.window.onDidChangeTerminalShellIntegration((e) => {
- if (e.terminal !== terminal) return
- clearTimeout(timer)
- listener.dispose()
- resolve(e.shellIntegration)
- })
- })
- }
-
- /** Run script via shell integration — tracks execution and exit code properly. */
- private runViaShellIntegration(
- terminal: vscode.Terminal,
- integration: vscode.TerminalShellIntegration,
- script: string,
- env: SetupScriptEnvironment,
- ): Promise {
- return new Promise((resolve) => {
- const command = buildSetupCommand(script, env)
- const execution = integration.executeCommand(command)
-
- const cleanup = () => {
- execListener.dispose()
- closeListener.dispose()
+ private waitForTaskEnd(execution: vscode.TaskExecution): Promise {
+ return new Promise((resolve, reject) => {
+ const state = {
+ done: false,
+ grace: undefined as ReturnType | undefined,
+ timeout: undefined as ReturnType | undefined,
}
- // Primary: shell integration reports execution finished with exit code
- const execListener = vscode.window.onDidEndTerminalShellExecution((e) => {
- if (e.execution !== execution) return
- cleanup()
- this.log(`Setup script exited with code ${e.exitCode ?? "unknown"}`)
+ const finish = (error?: Error) => {
+ if (state.done) return
+ state.done = true
+ if (state.grace) {
+ clearTimeout(state.grace)
+ }
+ if (state.timeout) {
+ clearTimeout(state.timeout)
+ }
+ processListener.dispose()
+ endListener.dispose()
+ if (error) {
+ reject(error)
+ return
+ }
resolve()
+ }
+
+ const processListener = vscode.tasks.onDidEndTaskProcess((event) => {
+ if (event.execution !== execution) return
+ this.log(`Setup script exited with code ${event.exitCode ?? "unknown"}`)
+ const code = event.exitCode
+ if (typeof code !== "number") {
+ finish(new Error("Setup script exited without a valid exit code"))
+ return
+ }
+ if (code !== 0) {
+ finish(new Error(`Setup script exited with code ${code}`))
+ return
+ }
+ finish()
})
- // Fallback: terminal was closed externally (user, VS Code restart, etc.)
- const closeListener = vscode.window.onDidCloseTerminal((closed) => {
- if (closed !== terminal) return
- cleanup()
- this.log("Setup script terminal closed before execution event fired")
- resolve()
- })
- })
- }
-
- /** Fallback: run via sendText and wait for terminal to close. */
- private runViaSendText(terminal: vscode.Terminal, script: string, env: SetupScriptEnvironment): Promise {
- return new Promise((resolve) => {
- const listener = vscode.window.onDidCloseTerminal((closed) => {
- if (closed !== terminal) return
- listener.dispose()
- resolve()
+ const endListener = vscode.tasks.onDidEndTask((event) => {
+ if (event.execution !== execution) return
+ if (state.done) return
+ state.grace = setTimeout(() => {
+ this.log("Setup script finished without process exit event")
+ finish()
+ }, TASK_END_GRACE_MS)
})
- const command = buildSetupCommand(script, env) + (process.platform === "win32" ? "& exit" : "; exit")
- terminal.sendText(command)
- this.log("Setup script started in terminal, waiting for completion...")
+ state.timeout = setTimeout(() => {
+ this.log("Setup script timed out waiting for task completion")
+ finish(new Error("Setup script timed out after 5 minutes"))
+ }, TASK_TIMEOUT_MS)
})
}
diff --git a/packages/kilo-vscode/src/agent-manager/SetupScriptService.ts b/packages/kilo-vscode/src/agent-manager/SetupScriptService.ts
index 26f08eec22c..c48ea0d0189 100644
--- a/packages/kilo-vscode/src/agent-manager/SetupScriptService.ts
+++ b/packages/kilo-vscode/src/agent-manager/SetupScriptService.ts
@@ -1,66 +1,132 @@
/**
* SetupScriptService - Manages worktree setup scripts
*
- * Handles reading, creating, and checking for setup scripts stored in .kilocode/setup-script.
+ * Handles reading, creating, and checking for setup scripts stored in .kilocode/.
* Setup scripts run before an agent starts in a worktree (new sessions only).
*/
import * as vscode from "vscode"
import * as fs from "node:fs"
import * as path from "node:path"
-import { SETUP_SCRIPT_TEMPLATE } from "./setup-script-template"
+import { SETUP_SCRIPT_TEMPLATE, SETUP_SCRIPT_TEMPLATE_POWERSHELL } from "./setup-script-template"
const SETUP_SCRIPT_FILENAME = "setup-script"
+const SETUP_SCRIPT_SHELL_FILENAME = "setup-script.sh"
+const SETUP_SCRIPT_POWERSHELL_FILENAME = "setup-script.ps1"
+const SETUP_SCRIPT_CMD_FILENAME = "setup-script.cmd"
+const SETUP_SCRIPT_BAT_FILENAME = "setup-script.bat"
const KILOCODE_DIR = ".kilocode"
+export type SetupScriptKind = "posix" | "powershell" | "cmd"
+type SetupScriptDefaultKind = Exclude
+
+export interface SetupScriptInfo {
+ path: string
+ kind: SetupScriptKind
+}
+
+interface SetupScriptCandidate {
+ name: string
+ kind: SetupScriptKind
+}
+
+interface SetupScriptDefaultCandidate {
+ name: string
+ kind: SetupScriptDefaultKind
+}
+
export class SetupScriptService {
- private readonly root: string
- private readonly script: string
+ private readonly dir: string
constructor(root: string) {
- this.root = root
- this.script = path.join(root, KILOCODE_DIR, SETUP_SCRIPT_FILENAME)
+ this.dir = path.join(root, KILOCODE_DIR)
}
- /** Get the path to the setup script */
- getScriptPath(): string {
- return this.script
+ /** Resolve the setup script path and interpreter type for the current platform. */
+ resolveScript(platform: NodeJS.Platform = process.platform): SetupScriptInfo | undefined {
+ for (const candidate of this.candidates(platform)) {
+ const scriptPath = path.join(this.dir, candidate.name)
+ if (!fs.existsSync(scriptPath)) continue
+ return {
+ path: scriptPath,
+ kind: candidate.kind,
+ }
+ }
+ return undefined
+ }
+
+ /** Get the script path if configured, otherwise return the default path for this platform. */
+ getScriptPath(platform: NodeJS.Platform = process.platform): string {
+ const resolved = this.resolveScript(platform)
+ if (resolved) return resolved.path
+ return path.join(this.dir, this.defaultCandidate(platform).name)
}
/** Check if a setup script exists */
- hasScript(): boolean {
- return fs.existsSync(this.script)
+ hasScript(platform: NodeJS.Platform = process.platform): boolean {
+ return this.resolveScript(platform) !== undefined
}
/** Read the setup script content. Returns null if not found or read fails. */
- async getScript(): Promise {
- if (!this.hasScript()) return null
+ async getScript(platform: NodeJS.Platform = process.platform): Promise {
+ const script = this.resolveScript(platform)
+ if (!script) return null
try {
- return await fs.promises.readFile(this.script, "utf-8")
+ return await fs.promises.readFile(script.path, "utf-8")
} catch (error) {
this.log(`Failed to read setup script: ${error}`)
return null
}
}
- /** Create a default setup script with helpful comments */
- async createDefaultScript(): Promise {
- const dir = path.join(this.root, KILOCODE_DIR)
- if (!fs.existsSync(dir)) {
- await fs.promises.mkdir(dir, { recursive: true })
+ /** Create a default setup script with helpful comments for the current platform. */
+ async createDefaultScript(platform: NodeJS.Platform = process.platform): Promise {
+ if (!fs.existsSync(this.dir)) {
+ await fs.promises.mkdir(this.dir, { recursive: true })
}
- await fs.promises.writeFile(this.script, SETUP_SCRIPT_TEMPLATE, "utf-8")
+ const script = this.defaultCandidate(platform)
+ const scriptPath = path.join(this.dir, script.name)
+ const content = this.defaultTemplate(script.kind)
+ await fs.promises.writeFile(scriptPath, content, "utf-8")
}
/** Open the setup script in VS Code editor. Creates the default script if it doesn't exist. */
- async openInEditor(): Promise {
- if (!this.hasScript()) {
- await this.createDefaultScript()
+ async openInEditor(platform: NodeJS.Platform = process.platform): Promise {
+ if (!this.hasScript(platform)) {
+ await this.createDefaultScript(platform)
}
- const document = await vscode.workspace.openTextDocument(this.script)
+ const resolved = this.resolveScript(platform)
+ if (!resolved) return
+ const document = await vscode.workspace.openTextDocument(resolved.path)
await vscode.window.showTextDocument(document)
}
+ private candidates(platform: NodeJS.Platform): SetupScriptCandidate[] {
+ if (platform === "win32") {
+ return [
+ { name: SETUP_SCRIPT_POWERSHELL_FILENAME, kind: "powershell" },
+ { name: SETUP_SCRIPT_CMD_FILENAME, kind: "cmd" },
+ { name: SETUP_SCRIPT_BAT_FILENAME, kind: "cmd" },
+ ]
+ }
+ return [
+ { name: SETUP_SCRIPT_FILENAME, kind: "posix" },
+ { name: SETUP_SCRIPT_SHELL_FILENAME, kind: "posix" },
+ ]
+ }
+
+ private defaultCandidate(platform: NodeJS.Platform): SetupScriptDefaultCandidate {
+ if (platform === "win32") {
+ return { name: SETUP_SCRIPT_POWERSHELL_FILENAME, kind: "powershell" }
+ }
+ return { name: SETUP_SCRIPT_FILENAME, kind: "posix" }
+ }
+
+ private defaultTemplate(kind: SetupScriptDefaultKind): string {
+ if (kind === "powershell") return SETUP_SCRIPT_TEMPLATE_POWERSHELL
+ return SETUP_SCRIPT_TEMPLATE
+ }
+
private log(message: string): void {
// Log to console since we don't have an OutputChannel here
console.log(`[SetupScriptService] ${message}`)
diff --git a/packages/kilo-vscode/src/agent-manager/WorktreeManager.ts b/packages/kilo-vscode/src/agent-manager/WorktreeManager.ts
index 5cab8639e52..39393f3f066 100644
--- a/packages/kilo-vscode/src/agent-manager/WorktreeManager.ts
+++ b/packages/kilo-vscode/src/agent-manager/WorktreeManager.ts
@@ -240,6 +240,10 @@ export class WorktreeManager {
await this.addExcludeEntry(excludePath, ".kilocode/worktrees/", "Kilo Code agent worktrees")
await this.addExcludeEntry(excludePath, ".kilocode/agent-manager.json", "Kilo Agent Manager state")
await this.addExcludeEntry(excludePath, ".kilocode/setup-script", "Kilo Code worktree setup script")
+ await this.addExcludeEntry(excludePath, ".kilocode/setup-script.sh", "Kilo Code worktree setup script")
+ await this.addExcludeEntry(excludePath, ".kilocode/setup-script.ps1", "Kilo Code worktree setup script")
+ await this.addExcludeEntry(excludePath, ".kilocode/setup-script.cmd", "Kilo Code worktree setup script")
+ await this.addExcludeEntry(excludePath, ".kilocode/setup-script.bat", "Kilo Code worktree setup script")
}
private async ensureWorktreeExclude(worktreePath: string): Promise {
diff --git a/packages/kilo-vscode/src/agent-manager/__tests__/SetupScriptService.spec.ts b/packages/kilo-vscode/src/agent-manager/__tests__/SetupScriptService.spec.ts
new file mode 100644
index 00000000000..746ceed441f
--- /dev/null
+++ b/packages/kilo-vscode/src/agent-manager/__tests__/SetupScriptService.spec.ts
@@ -0,0 +1,120 @@
+import { describe, it, expect, vi } from "vitest"
+import * as fs from "node:fs"
+import * as os from "node:os"
+import * as path from "node:path"
+
+vi.mock("vscode", () => ({
+ workspace: {
+ openTextDocument: vi.fn(),
+ },
+ window: {
+ showTextDocument: vi.fn(),
+ },
+}))
+
+import { SetupScriptService } from "../SetupScriptService"
+
+function setupRoot(): string {
+ return fs.mkdtempSync(path.join(os.tmpdir(), "kilo-setup-script-"))
+}
+
+function scriptPath(root: string, name: string): string {
+ return path.join(root, ".kilocode", name)
+}
+
+function writeScript(root: string, name: string, content = "echo ok\n"): string {
+ const dir = path.join(root, ".kilocode")
+ fs.mkdirSync(dir, { recursive: true })
+ const script = path.join(dir, name)
+ fs.writeFileSync(script, content, "utf-8")
+ return script
+}
+
+describe("SetupScriptService", () => {
+ it("resolves POSIX setup script on macOS", () => {
+ const root = setupRoot()
+ try {
+ const file = writeScript(root, "setup-script")
+ const service = new SetupScriptService(root)
+ const resolved = service.resolveScript("darwin")
+ expect(resolved).toEqual({
+ path: file,
+ kind: "posix",
+ })
+ } finally {
+ fs.rmSync(root, { recursive: true, force: true })
+ }
+ })
+
+ it("prefers PowerShell script on Windows when multiple variants exist", () => {
+ const root = setupRoot()
+ try {
+ const ps1 = writeScript(root, "setup-script.ps1")
+ writeScript(root, "setup-script.cmd")
+ writeScript(root, "setup-script")
+ const service = new SetupScriptService(root)
+ const resolved = service.resolveScript("win32")
+ expect(resolved).toEqual({
+ path: ps1,
+ kind: "powershell",
+ })
+ } finally {
+ fs.rmSync(root, { recursive: true, force: true })
+ }
+ })
+
+ it("resolves cmd script on Windows when no PowerShell script exists", () => {
+ const root = setupRoot()
+ try {
+ const cmd = writeScript(root, "setup-script.cmd")
+ const service = new SetupScriptService(root)
+ const resolved = service.resolveScript("win32")
+ expect(resolved).toEqual({
+ path: cmd,
+ kind: "cmd",
+ })
+ } finally {
+ fs.rmSync(root, { recursive: true, force: true })
+ }
+ })
+
+ it("does not resolve POSIX setup scripts on Windows", () => {
+ const root = setupRoot()
+ try {
+ writeScript(root, "setup-script")
+ writeScript(root, "setup-script.sh")
+ const service = new SetupScriptService(root)
+ const resolved = service.resolveScript("win32")
+ expect(resolved).toBeUndefined()
+ expect(service.hasScript("win32")).toBe(false)
+ } finally {
+ fs.rmSync(root, { recursive: true, force: true })
+ }
+ })
+
+ it("creates default PowerShell script on Windows", async () => {
+ const root = setupRoot()
+ try {
+ const service = new SetupScriptService(root)
+ await service.createDefaultScript("win32")
+ const file = scriptPath(root, "setup-script.ps1")
+ expect(fs.existsSync(file)).toBe(true)
+ expect(service.hasScript("win32")).toBe(true)
+ } finally {
+ fs.rmSync(root, { recursive: true, force: true })
+ }
+ })
+
+ it("creates default POSIX script on macOS", async () => {
+ const root = setupRoot()
+ try {
+ const service = new SetupScriptService(root)
+ await service.createDefaultScript("darwin")
+ const file = scriptPath(root, "setup-script")
+ expect(fs.existsSync(file)).toBe(true)
+ expect(service.hasScript("darwin")).toBe(true)
+ } finally {
+ fs.rmSync(root, { recursive: true, force: true })
+ }
+ })
+})
diff --git a/packages/kilo-vscode/src/agent-manager/__tests__/buildSetupCommand.spec.ts b/packages/kilo-vscode/src/agent-manager/__tests__/buildSetupCommand.spec.ts
deleted file mode 100644
index ed69b1c37b6..00000000000
--- a/packages/kilo-vscode/src/agent-manager/__tests__/buildSetupCommand.spec.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { describe, it, expect } from "vitest"
-import { buildSetupCommand } from "../setup-script-command"
-
-const env = {
- worktreePath: "/repos/project/.kilocode/worktrees/wt-1",
- repoPath: "/repos/project",
-}
-
-const script = "/repos/project/.kilocode/setup-script"
-
-describe("buildSetupCommand", () => {
- it("builds unix command with inline env vars and sh", () => {
- const result = buildSetupCommand(script, env, "darwin")
- expect(result).toBe(
- `WORKTREE_PATH="/repos/project/.kilocode/worktrees/wt-1" REPO_PATH="/repos/project" sh "/repos/project/.kilocode/setup-script"`,
- )
- })
-
- it("builds linux command same as darwin", () => {
- const result = buildSetupCommand(script, env, "linux")
- expect(result).toContain("sh ")
- expect(result).not.toContain("set ")
- expect(result).not.toContain("call ")
- })
-
- it("builds windows command with set and call", () => {
- const result = buildSetupCommand(script, env, "win32")
- expect(result).toBe(
- `set "WORKTREE_PATH=/repos/project/.kilocode/worktrees/wt-1" && set "REPO_PATH=/repos/project" && call "/repos/project/.kilocode/setup-script"`,
- )
- })
-
- it("includes both env vars in unix command", () => {
- const result = buildSetupCommand(script, env, "darwin")
- expect(result).toContain(`WORKTREE_PATH="${env.worktreePath}"`)
- expect(result).toContain(`REPO_PATH="${env.repoPath}"`)
- })
-
- it("includes both env vars in windows command", () => {
- const result = buildSetupCommand(script, env, "win32")
- expect(result).toContain(`set "WORKTREE_PATH=${env.worktreePath}"`)
- expect(result).toContain(`set "REPO_PATH=${env.repoPath}"`)
- })
-
- it("handles paths with spaces", () => {
- const spaced = {
- worktreePath: "/Users/dev/my project/.kilocode/worktrees/wt-1",
- repoPath: "/Users/dev/my project",
- }
- const spacedScript = "/Users/dev/my project/.kilocode/setup-script"
-
- const unix = buildSetupCommand(spacedScript, spaced, "darwin")
- expect(unix).toContain(`sh "/Users/dev/my project/.kilocode/setup-script"`)
-
- const win = buildSetupCommand(spacedScript, spaced, "win32")
- expect(win).toContain(`call "/Users/dev/my project/.kilocode/setup-script"`)
- })
-
- it("escapes double quotes in unix paths", () => {
- const dangerous = {
- worktreePath: '/repos/proj"ect',
- repoPath: "/repos/safe",
- }
- const result = buildSetupCommand(script, dangerous, "darwin")
- expect(result).toContain(`WORKTREE_PATH="/repos/proj\\"ect"`)
- })
-
- it("escapes dollar signs in unix paths", () => {
- const dangerous = {
- worktreePath: "/repos/$HOME/project",
- repoPath: "/repos/safe",
- }
- const result = buildSetupCommand(script, dangerous, "darwin")
- expect(result).toContain(`WORKTREE_PATH="/repos/\\$HOME/project"`)
- })
-
- it("escapes backticks in unix paths", () => {
- const dangerous = {
- worktreePath: "/repos/`whoami`/project",
- repoPath: "/repos/safe",
- }
- const result = buildSetupCommand(script, dangerous, "darwin")
- expect(result).toContain('WORKTREE_PATH="/repos/\\`whoami\\`/project"')
- })
-})
diff --git a/packages/kilo-vscode/src/agent-manager/setup-script-command.ts b/packages/kilo-vscode/src/agent-manager/setup-script-command.ts
deleted file mode 100644
index 3d3dd147186..00000000000
--- a/packages/kilo-vscode/src/agent-manager/setup-script-command.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/** Escape characters that are special inside double-quoted shell strings. */
-function escapeShell(value: string): string {
- return value.replace(/["$`\\]/g, "\\$&")
-}
-
-/** Build the platform-appropriate command string for running a setup script. */
-export function buildSetupCommand(
- script: string,
- env: { worktreePath: string; repoPath: string },
- platform: NodeJS.Platform = process.platform,
-): string {
- if (platform === "win32") {
- // Windows cmd.exe: double quotes in set values don't need escaping the same way,
- // but we escape for the call argument
- return `set "WORKTREE_PATH=${env.worktreePath}" && set "REPO_PATH=${env.repoPath}" && call "${script}"`
- }
- const wt = escapeShell(env.worktreePath)
- const repo = escapeShell(env.repoPath)
- const path = escapeShell(script)
- return `WORKTREE_PATH="${wt}" REPO_PATH="${repo}" sh "${path}"`
-}
diff --git a/packages/kilo-vscode/src/agent-manager/setup-script-template.ts b/packages/kilo-vscode/src/agent-manager/setup-script-template.ts
index 8c59a63b6f9..64224d16137 100644
--- a/packages/kilo-vscode/src/agent-manager/setup-script-template.ts
+++ b/packages/kilo-vscode/src/agent-manager/setup-script-template.ts
@@ -1,5 +1,5 @@
-/** Default template for worktree setup scripts. */
-export const SETUP_SCRIPT_TEMPLATE = `#!/bin/bash
+/** Default POSIX template for worktree setup scripts. */
+export const SETUP_SCRIPT_TEMPLATE = `#!/bin/sh
# Kilo Code Worktree Setup Script
# This script runs before the agent starts in a worktree (new sessions only).
#
@@ -39,3 +39,44 @@ echo "Setting up worktree: $WORKTREE_PATH"
echo "Setup complete!"
`
+
+/** Default PowerShell template for worktree setup scripts on Windows. */
+export const SETUP_SCRIPT_TEMPLATE_POWERSHELL = `# Kilo Code Worktree Setup Script
+# This script runs before the agent starts in a worktree (new sessions only).
+#
+# Available environment variables:
+# $env:WORKTREE_PATH - Absolute path to the worktree directory
+# $env:REPO_PATH - Absolute path to the main repository
+#
+# Example tasks:
+# - Copy .env files from main repo
+# - Install dependencies
+# - Run database migrations
+# - Set up local configuration
+
+$ErrorActionPreference = "Stop"
+
+Write-Host "Setting up worktree: $env:WORKTREE_PATH"
+
+# Uncomment and modify as needed:
+
+# Copy environment files
+# if (Test-Path "$env:REPO_PATH/.env") {
+# Copy-Item "$env:REPO_PATH/.env" "$env:WORKTREE_PATH/.env" -Force
+# Write-Host "Copied .env"
+# }
+
+# Install dependencies (Node.js)
+# if (Test-Path "$env:WORKTREE_PATH/package.json") {
+# Set-Location "$env:WORKTREE_PATH"
+# npm install
+# }
+
+# Install dependencies (Python)
+# if (Test-Path "$env:WORKTREE_PATH/requirements.txt") {
+# Set-Location "$env:WORKTREE_PATH"
+# pip install -r requirements.txt
+# }
+
+Write-Host "Setup complete!"
+`
diff --git a/packages/kilo-vscode/src/services/autocomplete/continuedev/core/llm/llamaTokenizer.js b/packages/kilo-vscode/src/services/autocomplete/continuedev/core/llm/llamaTokenizer.js
index 14a2e2f264c..08d926a9aa2 100644
--- a/packages/kilo-vscode/src/services/autocomplete/continuedev/core/llm/llamaTokenizer.js
+++ b/packages/kilo-vscode/src/services/autocomplete/continuedev/core/llm/llamaTokenizer.js
@@ -395,10 +395,14 @@ class LlamaTokenizer {
function testCase(inputString, expectedTokenIds) {
const actualTokens = tokenizer.encode(inputString, true, true, true)
if (!isEqual(actualTokens, expectedTokenIds)) {
- throw new Error(`Test failed. LLaMA Tokenizer Encoder returned unexpected result: expected tokenize(${inputString}) === ${expectedTokenIds}, actual was: ${actualTokens}`)
+ throw new Error(
+ `Test failed. LLaMA Tokenizer Encoder returned unexpected result: expected tokenize(${inputString}) === ${expectedTokenIds}, actual was: ${actualTokens}`,
+ )
}
if (inputString !== tokenizer.decode(actualTokens)) {
- throw new Error(`Test failed. LLaMA Tokenizer Decoder returned unexpected result: expected decode(${actualTokens}) === ${inputString}, actual was: ${decode(actualTokens)}`)
+ throw new Error(
+ `Test failed. LLaMA Tokenizer Decoder returned unexpected result: expected decode(${actualTokens}) === ${inputString}, actual was: ${decode(actualTokens)}`,
+ )
}
}
diff --git a/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts b/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts
index 31bc97ea8b3..799c213fd57 100644
--- a/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts
+++ b/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts
@@ -27,6 +27,7 @@ const TSX_FILES = [
]
const TSX_FILE = TSX_FILES[0]
const PROVIDER_FILE = path.join(ROOT, "src/agent-manager/AgentManagerProvider.ts")
+const SETUP_SCRIPT_RUNNER_FILE = path.join(ROOT, "src/agent-manager/SetupScriptRunner.ts")
function readAllTsx(): string {
return TSX_FILES.map((f) => fs.readFileSync(f, "utf-8")).join("\n")
@@ -376,3 +377,25 @@ describe("KiloProvider — pending session refresh on reconnect", () => {
)
})
})
+
+describe("SetupScriptRunner — task execution model", () => {
+ const runner = fs.readFileSync(SETUP_SCRIPT_RUNNER_FILE, "utf-8")
+
+ it("uses VS Code tasks API for setup execution", () => {
+ expect(runner).toContain("vscode.tasks.executeTask")
+ expect(runner).toContain("onDidEndTaskProcess")
+ expect(runner).toContain("onDidEndTask")
+ })
+
+ it("uses process-based task execution with env options", () => {
+ expect(runner).toContain("new vscode.ProcessExecution")
+ expect(runner).toContain("WORKTREE_PATH")
+ expect(runner).toContain("REPO_PATH")
+ })
+
+ it("does not use manual terminal command injection", () => {
+ expect(runner).not.toContain("createTerminal")
+ expect(runner).not.toContain("sendText")
+ expect(runner).not.toContain("buildSetupCommand")
+ })
+})
diff --git a/packages/kilo-vscode/tests/unit/kilo-provider-session-refresh.test.ts b/packages/kilo-vscode/tests/unit/kilo-provider-session-refresh.test.ts
index d27def15642..a5909fdaad7 100644
--- a/packages/kilo-vscode/tests/unit/kilo-provider-session-refresh.test.ts
+++ b/packages/kilo-vscode/tests/unit/kilo-provider-session-refresh.test.ts
@@ -112,7 +112,7 @@ function createConnection(client: ReturnType) {
}
describe("KiloProvider pending session refresh", () => {
- it("flushes deferred refresh in initializeConnection without relying on connected event callback", async () => {
+ it.skip("flushes deferred refresh in initializeConnection without relying on connected event callback", async () => {
const client = createClient()
const connection = createConnection(client)
const provider = new KiloProvider({} as never, connection as never)
@@ -129,7 +129,7 @@ describe("KiloProvider pending session refresh", () => {
expect(internal.pendingSessionRefresh).toBe(false)
})
- it("does not post not-connected errors while still connecting", async () => {
+ it.skip("does not post not-connected errors while still connecting", async () => {
const client = createClient()
const connection = createConnection(client)
const provider = new KiloProvider({} as never, connection as never)
diff --git a/packages/kilo-vscode/tests/unit/kilo-ui-contract.test.ts b/packages/kilo-vscode/tests/unit/kilo-ui-contract.test.ts
new file mode 100644
index 00000000000..bebbac55310
--- /dev/null
+++ b/packages/kilo-vscode/tests/unit/kilo-ui-contract.test.ts
@@ -0,0 +1,113 @@
+/**
+ * Runtime contract tests for kilo-vscode's dependencies on @kilocode/kilo-ui.
+ *
+ * These tests import the upstream UI modules directly and verify at runtime
+ * that the exports kilo-vscode depends on still exist with the expected shape.
+ *
+ * Because the upstream modules use SolidJS JSX (jsxImportSource: "solid-js"),
+ * they must be loaded from within packages/kilo-ui/ where bun picks up the
+ * correct tsconfig. We use Bun.spawnSync to run a small check script in that
+ * context.
+ *
+ * TypeScript types (OpenFileFn, ToolProps, ToolInfo) are erased at runtime,
+ * so those are verified via source analysis on the upstream file.
+ */
+
+import { describe, it, expect } from "bun:test"
+import fs from "node:fs"
+import path from "node:path"
+
+const MONOREPO_ROOT = path.resolve(import.meta.dir, "../../../..")
+const KILO_UI_DIR = path.join(MONOREPO_ROOT, "packages/kilo-ui")
+const DATA_CONTEXT_FILE = path.join(MONOREPO_ROOT, "packages/ui/src/context/data.tsx")
+const MESSAGE_PART_FILE = path.join(MONOREPO_ROOT, "packages/ui/src/components/message-part.tsx")
+
+function check(code: string): { ok: boolean; output: string } {
+ const result = Bun.spawnSync(["bun", "--conditions=browser", "-e", code], {
+ cwd: KILO_UI_DIR,
+ stdout: "pipe",
+ stderr: "pipe",
+ })
+ const stdout = result.stdout.toString()
+ const stderr = result.stderr.toString()
+ return {
+ ok: result.exitCode === 0,
+ output: stdout + stderr,
+ }
+}
+
+/**
+ * Tool names that kilo-vscode overrides or uses directly.
+ * Sources:
+ * - VscodeToolOverrides.tsx: "bash"
+ * - TaskToolExpanded.tsx: "task"
+ * - TaskToolExpanded.tsx uses getToolInfo() which handles all of these
+ */
+const TOOL_NAMES_WE_DEPEND_ON = ["bash", "task", "read", "write", "glob", "edit", "todowrite"]
+
+describe("ToolRegistry tool name contract (runtime)", () => {
+ it("all tools used by kilo-vscode are registered in ToolRegistry", () => {
+ const names = JSON.stringify(TOOL_NAMES_WE_DEPEND_ON)
+ const result = check(`
+ import { ToolRegistry } from "./src/components/message-part.tsx"
+ const names = ${names}
+ const missing = names.filter(n => typeof ToolRegistry.render(n) !== "function")
+ if (missing.length) {
+ console.error("Missing tools: " + missing.join(", "))
+ process.exit(1)
+ }
+ console.log("ok")
+ `)
+ expect(result.ok, `ToolRegistry check failed: ${result.output}`).toBe(true)
+ })
+})
+
+describe("getToolInfo() export contract (runtime)", () => {
+ it("getToolInfo is an exported function", () => {
+ // Note: getToolInfo() calls useI18n() internally, so we cannot invoke it
+ // outside a SolidJS rendering context. We verify it exists as a function.
+ const result = check(`
+ import { getToolInfo } from "./src/components/message-part.tsx"
+ if (typeof getToolInfo !== "function") {
+ console.error("getToolInfo is " + typeof getToolInfo)
+ process.exit(1)
+ }
+ console.log("ok")
+ `)
+ expect(result.ok, `getToolInfo check failed: ${result.output}`).toBe(true)
+ })
+
+ it("ToolInfo type still declares icon and title fields (source)", () => {
+ // ToolInfo is a TypeScript type erased at runtime, so we verify via source
+ const src = fs.readFileSync(MESSAGE_PART_FILE, "utf-8")
+ expect(src).toMatch(/export type ToolInfo\s*=\s*\{[^}]*icon\s*:/s)
+ expect(src).toMatch(/export type ToolInfo\s*=\s*\{[^}]*title\s*:/s)
+ })
+})
+
+describe("DataProvider contract (runtime)", () => {
+ it("DataProvider and useData are exported functions", () => {
+ const result = check(`
+ import { DataProvider, useData } from "./src/context/data.tsx"
+ if (typeof DataProvider !== "function") {
+ console.error("DataProvider is " + typeof DataProvider)
+ process.exit(1)
+ }
+ if (typeof useData !== "function") {
+ console.error("useData is " + typeof useData)
+ process.exit(1)
+ }
+ console.log("ok")
+ `)
+ expect(result.ok, `DataProvider check failed: ${result.output}`).toBe(true)
+ })
+
+ it("DataProvider accepts onOpenFile prop and exports OpenFileFn (source)", () => {
+ // onOpenFile and OpenFileFn are kilocode_change additions — TypeScript types
+ // erased at runtime, so we verify via source analysis
+ const src = fs.readFileSync(DATA_CONTEXT_FILE, "utf-8")
+ expect(src).toContain("onOpenFile")
+ expect(src).toContain("OpenFileFn")
+ expect(src).toMatch(/openFile:\s*props\.onOpenFile/)
+ })
+})
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx
index 1f55120cdf6..1d65ef023b6 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx
+++ b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx
@@ -106,10 +106,10 @@ const isMac = typeof navigator !== "undefined" && /Mac|iPhone|iPad/.test(navigat
const MAX_JUMP_INDEX = 9
const defaultBindings: Record = {
- previousSession: isMac ? "⌘↑" : "Ctrl+↑",
- nextSession: isMac ? "⌘↓" : "Ctrl+↓",
- previousTab: isMac ? "⌘←" : "Ctrl+←",
- nextTab: isMac ? "⌘→" : "Ctrl+→",
+ previousSession: isMac ? "⌘⌥↑" : "Ctrl+Alt+↑",
+ nextSession: isMac ? "⌘⌥↓" : "Ctrl+Alt+↓",
+ previousTab: isMac ? "⌘⌥←" : "Ctrl+Alt+←",
+ nextTab: isMac ? "⌘⌥→" : "Ctrl+Alt+→",
showTerminal: isMac ? "⌘/" : "Ctrl+/",
newTab: isMac ? "⌘T" : "Ctrl+T",
closeTab: isMac ? "⌘W" : "Ctrl+W",
@@ -624,7 +624,7 @@ const AgentManagerContent: Component = () => {
if (el instanceof HTMLElement) scrollIntoView(el)
}
- // Navigate tabs with Cmd+Left/Right
+ // Navigate tabs with Cmd+Alt+Left/Right
const navigateTab = (direction: "left" | "right") => {
const ids = tabIds()
if (ids.length === 0) return
@@ -727,7 +727,8 @@ const AgentManagerContent: Component = () => {
// Prevent Cmd/Ctrl shortcuts from triggering native browser actions
const preventDefaults = (e: KeyboardEvent) => {
if (!(e.metaKey || e.ctrlKey)) return
- if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) {
+ // Arrow navigation requires Alt modifier (Cmd+Alt+Arrow for tabs/sessions)
+ if (e.altKey && ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) {
e.preventDefault()
}
// Prevent browser defaults for our shortcuts (new tab, close tab, new window, toggle diff, find)
diff --git a/packages/opencode/bin/kilo b/packages/opencode/bin/kilo
index 64c55295014..9f69ce669b1 100755
--- a/packages/opencode/bin/kilo
+++ b/packages/opencode/bin/kilo
@@ -25,11 +25,20 @@ if (envPath) {
const scriptPath = fs.realpathSync(__filename)
const scriptDir = path.dirname(scriptPath)
-//
+// kilocode_change start - fall through to findBinary() if cached binary fails
const cached = path.join(scriptDir, ".kilo")
if (fs.existsSync(cached)) {
- run(cached)
+ const result = childProcess.spawnSync(cached, process.argv.slice(2), {
+ stdio: "inherit",
+ })
+ if (!result.error) {
+ const code = typeof result.status === "number" ? result.status : 0
+ process.exit(code)
+ }
+ // cached binary failed (e.g. wrong platform/arch, missing dynamic linker),
+ // fall through to findBinary() which has better variant detection
}
+// kilocode_change end
const platformMap = {
darwin: "darwin",
@@ -166,9 +175,6 @@ function findBinary(startDir) {
}
}
-const scriptPath = fs.realpathSync(__filename)
-const scriptDir = path.dirname(scriptPath)
-
const resolved = findBinary(scriptDir)
if (!resolved) {
console.error(
@@ -179,4 +185,4 @@ if (!resolved) {
process.exit(1)
}
-run(resolved)
+run(resolved)
\ No newline at end of file
diff --git a/packages/opencode/package.json b/packages/opencode/package.json
index e17265df1eb..bf3b34d654a 100644
--- a/packages/opencode/package.json
+++ b/packages/opencode/package.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
- "version": "7.0.32",
+ "version": "7.0.33",
"name": "@kilocode/cli",
"type": "module",
"license": "MIT",
diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts
index 88444cb5f9f..919ee4244c2 100755
--- a/packages/opencode/script/build.ts
+++ b/packages/opencode/script/build.ts
@@ -188,6 +188,27 @@ for (const item of targets) {
},
})
+ // kilocode_change start - fix Nix-specific ELF interpreter paths for Linux binaries
+ if (item.os === "linux") {
+ const interpreters: Record = {
+ x64: "/lib64/ld-linux-x86-64.so.2",
+ arm64: "/lib/ld-linux-aarch64.so.1",
+ "x64-musl": "/lib/ld-musl-x86_64.so.1",
+ "arm64-musl": "/lib/ld-musl-aarch64.so.1",
+ }
+ const key = item.abi === "musl" ? `${item.arch}-musl` : item.arch
+ const interpreter = interpreters[key]
+ if (interpreter) {
+ try {
+ await $`patchelf --set-interpreter ${interpreter} dist/${name}/bin/kilo`
+ console.log(`patched interpreter for ${name} -> ${interpreter}`)
+ } catch {
+ console.warn(`patchelf not available, skipping interpreter fix for ${name}`)
+ }
+ }
+ }
+ // kilocode_change end
+
await $`rm -rf ./dist/${name}/bin/tui`
await Bun.file(`dist/${name}/package.json`).write(
JSON.stringify(
diff --git a/packages/opencode/script/postinstall.mjs b/packages/opencode/script/postinstall.mjs
index e2098cbbe8d..a95813d295c 100644
--- a/packages/opencode/script/postinstall.mjs
+++ b/packages/opencode/script/postinstall.mjs
@@ -3,129 +3,150 @@
import fs from "fs"
import path from "path"
import os from "os"
+import childProcess from "child_process"
import { fileURLToPath } from "url"
import { createRequire } from "module"
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const require = createRequire(import.meta.url)
+// kilocode_change start - variant detection matching bin/kilo logic
+const platformMap = {
+ darwin: "darwin",
+ linux: "linux",
+ win32: "windows",
+}
+const archMap = {
+ x64: "x64",
+ arm64: "arm64",
+ arm: "arm",
+}
+
function detectPlatformAndArch() {
- // Map platform names
- let platform
- switch (os.platform()) {
- case "darwin":
- platform = "darwin"
- break
- case "linux":
- platform = "linux"
- break
- case "win32":
- platform = "windows"
- break
- default:
- platform = os.platform()
- break
- }
-
- // Map architecture names
- let arch
- switch (os.arch()) {
- case "x64":
- arch = "x64"
- break
- case "arm64":
- arch = "arm64"
- break
- case "arm":
- arch = "arm"
- break
- default:
- arch = os.arch()
- break
- }
-
+ const platform = platformMap[os.platform()] || os.platform()
+ const arch = archMap[os.arch()] || os.arch()
return { platform, arch }
}
-function findBinary() {
+function supportsAvx2() {
const { platform, arch } = detectPlatformAndArch()
- const packageName = `@kilocode/cli-${platform}-${arch}`
- const binaryName = platform === "windows" ? "kilo.exe" : "kilo"
+ if (arch !== "x64") return false
- try {
- // Use require.resolve to find the package
- const packageJsonPath = require.resolve(`${packageName}/package.json`)
- const packageDir = path.dirname(packageJsonPath)
- const binaryPath = path.join(packageDir, "bin", binaryName)
-
- if (!fs.existsSync(binaryPath)) {
- throw new Error(`Binary not found at ${binaryPath}`)
- }
-
- return { binaryPath, binaryName }
- } catch (error) {
- throw new Error(`Could not find package ${packageName}: ${error.message}`)
- }
-}
-
-function prepareBinDirectory(binaryName) {
- const binDir = path.join(__dirname, "bin")
- const targetPath = path.join(binDir, binaryName)
-
- // Ensure bin directory exists
- if (!fs.existsSync(binDir)) {
- fs.mkdirSync(binDir, { recursive: true })
- }
-
- // Remove existing binary/symlink if it exists
- if (fs.existsSync(targetPath)) {
- fs.unlinkSync(targetPath)
- }
-
- return { binDir, targetPath }
-}
-
-function symlinkBinary(sourcePath, binaryName) {
- const { targetPath } = prepareBinDirectory(binaryName)
-
- fs.symlinkSync(sourcePath, targetPath)
- console.log(`kilo binary symlinked: ${targetPath} -> ${sourcePath}`)
-
- // Verify the file exists after operation
- if (!fs.existsSync(targetPath)) {
- throw new Error(`Failed to symlink binary to ${targetPath}`)
- }
-}
-
-async function main() {
- try {
- if (os.platform() === "win32") {
- // On Windows, the .exe is already included in the package and bin field points to it
- // No postinstall setup needed
- console.log("Windows detected: binary setup not needed (using packaged .exe)")
- return
- }
-
- // On non-Windows platforms, just verify the binary package exists
- // Don't replace the wrapper script - it handles binary execution
- const { binaryPath } = findBinary()
- const target = path.join(__dirname, "bin", ".kilo") // kilocode_change
- if (fs.existsSync(target)) fs.unlinkSync(target)
+ if (platform === "linux") {
try {
- fs.linkSync(binaryPath, target)
+ return /(^|\s)avx2(\s|$)/i.test(fs.readFileSync("/proc/cpuinfo", "utf8"))
} catch {
- fs.copyFileSync(binaryPath, target)
+ return false
}
- fs.chmodSync(target, 0o755)
- } catch (error) {
- console.error("Failed to setup kilo binary:", error.message)
- process.exit(1)
}
+
+ if (platform === "darwin") {
+ try {
+ const result = childProcess.spawnSync("sysctl", ["-n", "hw.optional.avx2_0"], {
+ encoding: "utf8",
+ timeout: 1500,
+ })
+ if (result.status !== 0) return false
+ return (result.stdout || "").trim() === "1"
+ } catch {
+ return false
+ }
+ }
+
+ return false
+}
+
+function isMusl() {
+ try {
+ if (fs.existsSync("/etc/alpine-release")) return true
+ } catch {
+ // ignore
+ }
+
+ try {
+ const result = childProcess.spawnSync("ldd", ["--version"], { encoding: "utf8" })
+ const text = ((result.stdout || "") + (result.stderr || "")).toLowerCase()
+ if (text.includes("musl")) return true
+ } catch {
+ // ignore
+ }
+
+ return false
+}
+
+function getPackageNames() {
+ const { platform, arch } = detectPlatformAndArch()
+ const base = `@kilocode/cli-${platform}-${arch}`
+ const avx2 = supportsAvx2()
+ const baseline = arch === "x64" && !avx2
+
+ if (platform === "linux") {
+ const musl = isMusl()
+ if (musl) {
+ if (arch === "x64") {
+ if (baseline) return [`${base}-baseline-musl`, `${base}-musl`, `${base}-baseline`, base]
+ return [`${base}-musl`, `${base}-baseline-musl`, base, `${base}-baseline`]
+ }
+ return [`${base}-musl`, base]
+ }
+ if (arch === "x64") {
+ if (baseline) return [`${base}-baseline`, base, `${base}-baseline-musl`, `${base}-musl`]
+ return [base, `${base}-baseline`, `${base}-musl`, `${base}-baseline-musl`]
+ }
+ return [base, `${base}-musl`]
+ }
+
+ if (arch === "x64") {
+ if (baseline) return [`${base}-baseline`, base]
+ return [base, `${base}-baseline`]
+ }
+ return [base]
+}
+
+function findBinary() {
+ const { platform } = detectPlatformAndArch()
+ const binaryName = platform === "windows" ? "kilo.exe" : "kilo"
+ const names = getPackageNames()
+
+ for (const packageName of names) {
+ try {
+ const packageJsonPath = require.resolve(`${packageName}/package.json`)
+ const packageDir = path.dirname(packageJsonPath)
+ const binaryPath = path.join(packageDir, "bin", binaryName)
+
+ if (fs.existsSync(binaryPath)) {
+ return { binaryPath, binaryName }
+ }
+ } catch {
+ // package not installed, try next variant
+ }
+ }
+
+ throw new Error(`Could not find any binary package. Tried: ${names.map((n) => `"${n}"`).join(", ")}`)
+}
+// kilocode_change end
+
+function main() {
+ if (os.platform() === "win32") {
+ // On Windows, the .exe is already included in the package and bin field points to it
+ console.log("Windows detected: binary setup not needed (using packaged .exe)")
+ return
+ }
+
+ const { binaryPath } = findBinary()
+ const target = path.join(__dirname, "bin", ".kilo") // kilocode_change
+ if (fs.existsSync(target)) fs.unlinkSync(target)
+ try {
+ fs.linkSync(binaryPath, target)
+ } catch {
+ fs.copyFileSync(binaryPath, target)
+ }
+ fs.chmodSync(target, 0o755)
}
try {
main()
} catch (error) {
- console.error("Postinstall script error:", error.message)
- process.exit(0)
+ console.error("Failed to setup kilo binary:", error.message)
+ process.exit(1)
}
diff --git a/packages/opencode/src/cli/cmd/import.ts b/packages/opencode/src/cli/cmd/import.ts
index 26869826589..9696d17add9 100644
--- a/packages/opencode/src/cli/cmd/import.ts
+++ b/packages/opencode/src/cli/cmd/import.ts
@@ -1,6 +1,7 @@
import type { Argv } from "yargs"
import type { Session as SDKSession, Message, Part } from "@kilocode/sdk/v2"
import { Session } from "../../session"
+import { Bus } from "../../bus"
import { cmd } from "./cmd"
import { bootstrap } from "../bootstrap"
import { Database } from "../../storage/db"
@@ -131,7 +132,10 @@ export const ImportCommand = cmd({
return
}
- Database.use((db) => db.insert(SessionTable).values(Session.toRow(exportData.info)).onConflictDoNothing().run())
+ Database.use((db) => {
+ db.insert(SessionTable).values(Session.toRow(exportData.info)).onConflictDoNothing().run()
+ Database.effect(() => Bus.publish(Session.Event.Created, { info: exportData.info }))
+ })
for (const msg of exportData.messages) {
Database.use((db) =>
diff --git a/packages/opencode/src/kilo-sessions/ingest-queue.ts b/packages/opencode/src/kilo-sessions/ingest-queue.ts
index 1ec105ea4af..47e1839c757 100644
--- a/packages/opencode/src/kilo-sessions/ingest-queue.ts
+++ b/packages/opencode/src/kilo-sessions/ingest-queue.ts
@@ -60,6 +60,7 @@ export namespace IngestQueue {
getClient: () => Promise
onAuthError?: () => void
log: {
+ info?: (message: string, data: Record) => void
error: (message: string, data: Record) => void
}
now?: () => number
@@ -198,6 +199,16 @@ export namespace IngestQueue {
const client = await options.getClient()
if (!client) return
+ if (options.log.info) {
+ const types = items.map((d) => d.type).join(",")
+ options.log.info("ingest flush", {
+ sessionId,
+ url: `${client.url}${share.ingestPath}?v=1`,
+ items: items.length,
+ types,
+ })
+ }
+
const response = await client
.fetch(`${client.url}${share.ingestPath}?v=1`, {
method: "POST",
@@ -218,12 +229,13 @@ export namespace IngestQueue {
const delay = backoff(count)
retry.set(sessionId, { count, until: now() + delay })
- options.log.error("share sync failed", { sessionId, error: "network", retryInMs: delay })
+ options.log.error("share sync failed", { sessionId, error: "network", attempt: count, retryInMs: delay })
enqueue(sessionId, items, "fill", now() + delay)
return
}
if (response.ok) {
+ options.log.info?.("ingest flush ok", { sessionId, items: items.length })
retry.delete(sessionId)
return
}
@@ -265,6 +277,7 @@ export namespace IngestQueue {
sessionId,
status: response.status,
statusText: response.statusText,
+ attempt: count,
retryInMs: delay,
})
enqueue(sessionId, items, "fill", now() + delay)
@@ -282,6 +295,11 @@ export namespace IngestQueue {
const client = await options.getClient()
if (!client) return
+ if (options.log.info) {
+ const types = data.map((d) => d.type).join(",")
+ options.log.info("ingest sync", { sessionId, types })
+ }
+
const until = retry.get(sessionId)?.until ?? 0
const base = queue.get(sessionId)?.due ?? now() + 1000
const due = Math.max(base, until)
diff --git a/packages/opencode/src/kilo-sessions/kilo-sessions.ts b/packages/opencode/src/kilo-sessions/kilo-sessions.ts
index 479bffed51e..7a22b3e78ce 100644
--- a/packages/opencode/src/kilo-sessions/kilo-sessions.ts
+++ b/packages/opencode/src/kilo-sessions/kilo-sessions.ts
@@ -107,10 +107,19 @@ export namespace KiloSessions {
})
}
+ const shareDisabled = process.env["KILO_DISABLE_SHARE"] === "true" || process.env["KILO_DISABLE_SHARE"] === "1"
+ const ingestDisabled =
+ process.env["KILO_DISABLE_SESSION_INGEST"] === "true" || process.env["KILO_DISABLE_SESSION_INGEST"] === "1"
+ const debugIngest =
+ process.env["KILO_DEBUG_SESSION_INGEST"] === "true" || process.env["KILO_DEBUG_SESSION_INGEST"] === "1"
+
const ingest = IngestQueue.create({
getShare: async (sessionId) => get(sessionId).catch(() => undefined),
getClient,
- log,
+ log: {
+ ...(debugIngest ? { info: log.info.bind(log) } : {}),
+ error: log.error.bind(log),
+ },
onAuthError: () => {
// Non-retryable until credentials are fixed.
// Clearing caches prevents repeated use of a now-invalid token/client.
@@ -118,10 +127,6 @@ export namespace KiloSessions {
},
})
- const shareDisabled = process.env["KILO_DISABLE_SHARE"] === "true" || process.env["KILO_DISABLE_SHARE"] === "1"
- const ingestDisabled =
- process.env["KILO_DISABLE_SESSION_INGEST"] === "true" || process.env["KILO_DISABLE_SESSION_INGEST"] === "1"
-
export async function init() {
if (ingestDisabled) return
diff --git a/packages/opencode/src/kilocode/components/kilo-news.tsx b/packages/opencode/src/kilocode/components/kilo-news.tsx
index 8f9e7acf731..dc74da69131 100644
--- a/packages/opencode/src/kilocode/components/kilo-news.tsx
+++ b/packages/opencode/src/kilocode/components/kilo-news.tsx
@@ -42,7 +42,7 @@ export function KiloNews() {
if (!isKiloConnected()) return
const result = await sdk.client.kilo.notifications()
- const items = result.data
+ const items = result.data?.filter(({ showIn }) => !showIn || showIn.includes("cli"))
if (items && items.length > 0) {
setNotifications(items)
}
diff --git a/packages/opencode/src/kilocode/plan-followup.ts b/packages/opencode/src/kilocode/plan-followup.ts
index 6aa0efa2f79..ab11e366f0c 100644
--- a/packages/opencode/src/kilocode/plan-followup.ts
+++ b/packages/opencode/src/kilocode/plan-followup.ts
@@ -111,7 +111,11 @@ export namespace PlanFollowup {
export const ANSWER_NEW_SESSION = "Start new session"
export const ANSWER_CONTINUE = "Continue here"
- async function resolvePlan(input: { assistant?: MessageV2.WithParts; messages: MessageV2.WithParts[]; sessionID: string }) {
+ async function resolvePlan(input: {
+ assistant?: MessageV2.WithParts
+ messages: MessageV2.WithParts[]
+ sessionID: string
+ }) {
// Fast path: check the last assistant message's text first (avoids array scanning)
if (input.assistant) {
const text = toText(input.assistant)
@@ -121,9 +125,7 @@ export namespace PlanFollowup {
// Fallback: scan all assistant messages after the last user message (handles
// cases where plan text is on an earlier assistant and the last one is empty)
const lastUserIdx = input.messages.findLastIndex((m) => m.info.role === "user")
- const assistantMessages = input.messages
- .slice(lastUserIdx + 1)
- .filter((m) => m.info.role === "assistant")
+ const assistantMessages = input.messages.slice(lastUserIdx + 1).filter((m) => m.info.role === "assistant")
const text = assistantMessages.map(toText).filter(Boolean).join("\n\n").trim()
if (text) return text
diff --git a/packages/plugin/package.json b/packages/plugin/package.json
index ec4a92bb91f..7aaff4c43c7 100644
--- a/packages/plugin/package.json
+++ b/packages/plugin/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/plugin",
- "version": "7.0.32",
+ "version": "7.0.33",
"type": "module",
"license": "MIT",
"repository": {
diff --git a/packages/script/package.json b/packages/script/package.json
index 2d1b4890e57..a0600588c77 100644
--- a/packages/script/package.json
+++ b/packages/script/package.json
@@ -8,7 +8,7 @@
"exports": {
".": "./src/index.ts"
},
- "version": "7.0.32",
+ "version": "7.0.33",
"dependencies": {},
"peerDependencies": {}
}
diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json
index f9c13a22146..f8eae8592e8 100644
--- a/packages/sdk/js/package.json
+++ b/packages/sdk/js/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/sdk",
- "version": "7.0.32",
+ "version": "7.0.33",
"type": "module",
"license": "MIT",
"repository": {
diff --git a/packages/ui/package.json b/packages/ui/package.json
index bc8acf9be54..8107fa4e6c0 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/ui",
- "version": "7.0.32",
+ "version": "7.0.33",
"type": "module",
"license": "MIT",
"exports": {
diff --git a/packages/util/package.json b/packages/util/package.json
index c5589efcc9a..31d79e01838 100644
--- a/packages/util/package.json
+++ b/packages/util/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/util",
- "version": "7.0.32",
+ "version": "7.0.33",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/script/beta.ts b/script/beta.ts
index b0e6c2dcc15..aa6659dac39 100755
--- a/script/beta.ts
+++ b/script/beta.ts
@@ -89,11 +89,11 @@ async function main() {
return
}
- console.log("Fetching latest dev branch...")
- await $`git fetch origin dev`
+ console.log("Fetching latest main branch...")
+ await $`git fetch origin main`
- console.log("Checking out beta branch...")
- await $`git checkout -B beta origin/dev`
+ console.log("Checking out main branch...")
+ await $`git checkout -B beta origin/main`
const applied: number[] = []
const failed: FailedPR[] = []
@@ -177,7 +177,7 @@ async function main() {
await $`git fetch origin beta`
const localTree = await $`git rev-parse beta^{tree}`.text()
- const remoteTrees = (await $`git log origin/dev..origin/beta --format=%T`.text()).split("\n")
+ const remoteTrees = (await $`git log origin/main..origin/beta --format=%T`.text()).split("\n")
const matchIdx = remoteTrees.indexOf(localTree.trim())
if (matchIdx !== -1) {
diff --git a/script/publish.ts b/script/publish.ts
index b7ed5c8221c..4ef6fb58046 100755
--- a/script/publish.ts
+++ b/script/publish.ts
@@ -62,7 +62,7 @@ if (Script.release) {
await $`git commit -am "release: v${Script.version}"`
await $`git tag v${Script.version}`
await $`git fetch origin`
- await $`git cherry-pick HEAD..origin/dev`.nothrow()
+ await $`git cherry-pick HEAD..origin/main`.nothrow() // kilocode_change
await $`git push origin HEAD --tags --no-verify --force-with-lease`
await new Promise((resolve) => setTimeout(resolve, 5_000))
}
@@ -79,5 +79,10 @@ await import(`../packages/sdk/js/script/publish.ts`)
console.log("\n=== plugin ===\n")
await import(`../packages/plugin/script/publish.ts`)
+// kilocode_change start
+console.log("\n=== vscode ===\n")
+await import(`../packages/kilo-vscode/script/publish.ts`)
+// kilocode_change end
+
const dir = fileURLToPath(new URL("..", import.meta.url))
process.chdir(dir)
diff --git a/script/upstream/package.json b/script/upstream/package.json
index d468e67c201..152b6f1e332 100644
--- a/script/upstream/package.json
+++ b/script/upstream/package.json
@@ -1,6 +1,6 @@
{
"name": "@kilocode/upstream-merge",
- "version": "7.0.32",
+ "version": "7.0.33",
"private": true,
"type": "module",
"description": "Scripts for automating upstream opencode merges into Kilo",
diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json
index 415fa6f1cd3..b2b6130fe20 100644
--- a/sdks/vscode/package.json
+++ b/sdks/vscode/package.json
@@ -2,7 +2,7 @@
"name": "opencode",
"displayName": "opencode",
"description": "opencode for VS Code",
- "version": "7.0.32",
+ "version": "7.0.33",
"publisher": "sst-dev",
"repository": {
"type": "git",