diff --git a/.changeset/brain-circuit-data-disclosure.md b/.changeset/brain-circuit-data-disclosure.md deleted file mode 100644 index 672b15b754c..00000000000 --- a/.changeset/brain-circuit-data-disclosure.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"kilo-code": patch -"@kilocode/kilo-ui": patch ---- - -Use a brain circuit icon for free-model data collection disclosures. diff --git a/.changeset/calm-icons-fetch.md b/.changeset/calm-icons-fetch.md new file mode 100644 index 00000000000..69a84091136 --- /dev/null +++ b/.changeset/calm-icons-fetch.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Prevent icon images fetched from the web from causing provider request errors. diff --git a/.changeset/calm-marketplace-skills-install.md b/.changeset/calm-marketplace-skills-install.md deleted file mode 100644 index e97b8182c8a..00000000000 --- a/.changeset/calm-marketplace-skills-install.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Make Marketplace skill installation resilient to missing project directories and overlapping install attempts. diff --git a/.changeset/clean-mcp-json.md b/.changeset/clean-mcp-json.md new file mode 100644 index 00000000000..8510a50073a --- /dev/null +++ b/.changeset/clean-mcp-json.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Write strict JSON when adding MCP servers to `kilo.json` configuration files. diff --git a/.changeset/console-diff-refresh.md b/.changeset/console-diff-refresh.md deleted file mode 100644 index 55389527fd9..00000000000 --- a/.changeset/console-diff-refresh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Keep Kilo Console terminals and worktree changes visible while refreshing diffs. diff --git a/.changeset/console-favicon.md b/.changeset/console-favicon.md deleted file mode 100644 index 6b02af98f89..00000000000 --- a/.changeset/console-favicon.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Use the updated favicon in Kilo Console. diff --git a/.changeset/fresh-compaction-order.md b/.changeset/fresh-compaction-order.md deleted file mode 100644 index 7d863475e6b..00000000000 --- a/.changeset/fresh-compaction-order.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@kilocode/cli": patch -"kilo-code": patch ---- - -Keep post-compaction tool calls and follow-up messages ordered after the compaction summary in the CLI and VS Code transcript. diff --git a/.changeset/ignore-control-scroll-intent.md b/.changeset/ignore-control-scroll-intent.md new file mode 100644 index 00000000000..50596487045 --- /dev/null +++ b/.changeset/ignore-control-scroll-intent.md @@ -0,0 +1,6 @@ +--- +"@kilocode/kilo-ui": patch +"kilo-code": patch +--- + +Keep chat auto-scroll active when interacting with question answers and other controls. diff --git a/.changeset/observe-chat-resize.md b/.changeset/observe-chat-resize.md new file mode 100644 index 00000000000..e3e3dbe7692 --- /dev/null +++ b/.changeset/observe-chat-resize.md @@ -0,0 +1,6 @@ +--- +"@kilocode/kilo-ui": patch +"kilo-code": patch +--- + +Keep chat pinned to the latest output when the visible message area resizes without overriding an intentional scroll position. diff --git a/.changeset/quiet-cloud-session-timeouts.md b/.changeset/quiet-cloud-session-timeouts.md deleted file mode 100644 index eaa5659e08b..00000000000 --- a/.changeset/quiet-cloud-session-timeouts.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@kilocode/cli": patch -"@kilocode/kilo-gateway": patch -"kilo-code": patch ---- - -Restore Cloud Agent transcripts in VS Code session previews and stop cloud session previews or continuation from loading indefinitely when a request stalls. diff --git a/.changeset/quiet-session-export.md b/.changeset/quiet-session-export.md new file mode 100644 index 00000000000..1ba5b89c7c1 --- /dev/null +++ b/.changeset/quiet-session-export.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Temporarily disable free-model session and Git workspace data export. diff --git a/.changeset/shell-permission-descriptions.md b/.changeset/shell-permission-descriptions.md deleted file mode 100644 index 91d3be3d9ff..00000000000 --- a/.changeset/shell-permission-descriptions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Show shell command descriptions in permission approval prompts. diff --git a/.changeset/stable-models-snapshot.md b/.changeset/stable-models-snapshot.md new file mode 100644 index 00000000000..d250120df49 --- /dev/null +++ b/.changeset/stable-models-snapshot.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Fail publication builds when the bundled models snapshot cannot be downloaded or validated, and load the snapshot as JSON data in compiled binaries. diff --git a/.changeset/stable-tool-scroll.md b/.changeset/stable-tool-scroll.md deleted file mode 100644 index 715e0c06482..00000000000 --- a/.changeset/stable-tool-scroll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Keep chat auto-scroll stable while edit, write, and patch tools hand off between assistant steps. diff --git a/.changeset/stable-working-indicator.md b/.changeset/stable-working-indicator.md new file mode 100644 index 00000000000..7b7aefd6522 --- /dev/null +++ b/.changeset/stable-working-indicator.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Reduce chat layout movement when live output finishes and session actions appear. diff --git a/.changeset/steady-review-drafts.md b/.changeset/steady-review-drafts.md deleted file mode 100644 index 2d7d09f8f01..00000000000 --- a/.changeset/steady-review-drafts.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Preserve unfinished inline review comments while diffs refresh. diff --git a/.changeset/steady-session-forks.md b/.changeset/steady-session-forks.md deleted file mode 100644 index 5e288868734..00000000000 --- a/.changeset/steady-session-forks.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Restore full-session forks in Agent Manager after the HTTP API migration. diff --git a/.changeset/steady-sidebar-reload.md b/.changeset/steady-sidebar-reload.md new file mode 100644 index 00000000000..5617e44ee8a --- /dev/null +++ b/.changeset/steady-sidebar-reload.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Keep the Explorer and other primary sidebar views open when VS Code reloads while Kilo Code is hidden. diff --git a/.changeset/user-driven-auto-scroll.md b/.changeset/user-driven-auto-scroll.md new file mode 100644 index 00000000000..514d360d21b --- /dev/null +++ b/.changeset/user-driven-auto-scroll.md @@ -0,0 +1,6 @@ +--- +"@kilocode/kilo-ui": patch +"kilo-code": patch +--- + +Keep chat auto-scroll following after programmatic or layout-driven scroll position changes. diff --git a/.changeset/vscode-lazy-historical-tool-details.md b/.changeset/vscode-lazy-historical-tool-details.md deleted file mode 100644 index c431fb3de1f..00000000000 --- a/.changeset/vscode-lazy-historical-tool-details.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Speed up VS Code session switching for long transcripts by lazily mounting collapsed historical tool details, sharing timeline hover infrastructure across activity bars, omitting transcript metadata that the webview does not use, and avoiding shimmer markup for inactive historical labels. diff --git a/.github/workflows/codeql-kotlin.yml b/.github/workflows/codeql-kotlin.yml new file mode 100644 index 00000000000..5f0cec56c87 --- /dev/null +++ b/.github/workflows/codeql-kotlin.yml @@ -0,0 +1,62 @@ +# kilocode_change - new file +name: "CodeQL Kotlin" + +on: + push: + branches: ["main"] + paths: + - "packages/kilo-jetbrains/**" + - ".github/workflows/codeql-kotlin.yml" + pull_request: + branches: ["main"] + paths: + - "packages/kilo-jetbrains/**" + - ".github/workflows/codeql-kotlin.yml" + schedule: + - cron: "29 10 * * 5" + workflow_dispatch: + +jobs: + analyze: + name: Analyze (java-kotlin) + runs-on: ubuntu-latest + permissions: + security-events: write + packages: read + actions: read + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Setup Bun + uses: ./.github/actions/setup-bun + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: ${{ github.ref != 'refs/heads/main' }} + + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: java-kotlin + build-mode: manual + config-file: ./.github/codeql/codeql-config.yml + + - name: Build Java/Kotlin + shell: bash + run: ./gradlew typecheck --rerun-tasks --no-build-cache + working-directory: packages/kilo-jetbrains + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + with: + category: "/language:java-kotlin" diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index b37055f328e..86b7a69a053 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -14,11 +14,11 @@ name: "CodeQL Advanced" on: push: - branches: [ "main" ] + branches: ["main"] pull_request: - branches: [ "main" ] + branches: ["main"] schedule: - - cron: '29 10 * * 5' + - cron: "29 10 * * 5" workflow_dispatch: jobs: @@ -45,12 +45,10 @@ jobs: fail-fast: false matrix: include: - - language: actions - build-mode: none - - language: java-kotlin - build-mode: manual - - language: javascript-typescript - build-mode: none + - language: actions + build-mode: none + - language: javascript-typescript + build-mode: none # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' # Use `c-cpp` to analyze code written in C, C++ or both # Use 'java-kotlin' to analyze code written in Java, Kotlin or both @@ -60,58 +58,24 @@ jobs: # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - - name: Checkout repository - uses: actions/checkout@v6 + - name: Checkout repository + uses: actions/checkout@v6 - # Add any setup steps before running the `github/codeql-action/init` action. - # This includes steps like installing compilers or runtimes (`actions/setup-node` - # or others). This is typically only required for manual builds. - # - name: Setup runtime (example) - # uses: actions/setup-example@v1 - - name: Setup Bun - if: matrix.language == 'java-kotlin' - uses: ./.github/actions/setup-bun + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + config-file: ./.github/codeql/codeql-config.yml + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. - - name: Setup Java - if: matrix.language == 'java-kotlin' - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "21" + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality - - name: Setup Gradle - if: matrix.language == 'java-kotlin' - uses: gradle/actions/setup-gradle@v4 - with: - cache-read-only: ${{ github.ref != 'refs/heads/main' }} - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v4 - with: - languages: ${{ matrix.language }} - build-mode: ${{ matrix.build-mode }} - config-file: ./.github/codeql/codeql-config.yml - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - # If the analyze step fails for one of the languages you are analyzing with - # "We were unable to automatically build your code", modify the matrix above - # to set the build mode to "manual" for that language. Then modify this step - # to build your code. - # ā„¹ļø Command-line programs to run using the OS shell. - # šŸ“š See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - name: Build Java/Kotlin - if: matrix.language == 'java-kotlin' - shell: bash - run: ./gradlew typecheck - working-directory: packages/kilo-jetbrains - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4 - with: - category: "/language:${{matrix.language}}" + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 93f79d63cb9..9bcd15b73df 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -118,8 +118,187 @@ jobs: outputs: version: ${{ needs.version.outputs.version }} - build-vscode: + # kilocode_change start - execute supported Unix CLI binaries before packaging VSIX artifacts + validate-cli-unix: + name: Validate CLI (${{ matrix.target }}) needs: build-cli + runs-on: ${{ matrix.runner }} + timeout-minutes: 15 + strategy: + fail-fast: false + matrix: + include: + - target: darwin-arm64 + runner: macos-15 + uname: arm64 + package: "@kilocode/cli-darwin-arm64" + mode: host + - target: darwin-x64 + runner: macos-13 + uname: x86_64 + package: "@kilocode/cli-darwin-x64" + mode: host + - target: linux-arm64 + runner: ubuntu-24.04-arm + uname: aarch64 + package: "@kilocode/cli-linux-arm64" + mode: host + - target: linux-x64 + runner: ubuntu-24.04 + uname: x86_64 + package: "@kilocode/cli-linux-x64" + mode: host + - target: alpine-arm64 + runner: ubuntu-24.04-arm + uname: aarch64 + package: "@kilocode/cli-linux-arm64-musl" + mode: alpine + platform: linux/arm64 + - target: alpine-x64 + runner: ubuntu-24.04 + uname: x86_64 + package: "@kilocode/cli-linux-x64-musl" + mode: alpine + platform: linux/amd64 + steps: + - uses: actions/download-artifact@v8 + with: + name: kilo-cli.tar.zst + path: /tmp + skip-decompress: true + + - name: Unpack CLI dist + run: | + mkdir -p dist + tar --zstd -xf /tmp/kilo-cli.tar.zst -C dist + + - name: Run CLI smoke test + run: | + test "$(uname -m)" = "${{ matrix.uname }}" + + smoke_host() { + binary="$1" + "$binary" --version + root="$(mktemp -d)" + trap 'rm -rf "$root"' RETURN + ( + unset KILO_MODELS_PATH KILO_MODELS_URL KILO_CONFIG KILO_CONFIG_DIR + export XDG_DATA_HOME="$root/data" + export XDG_CACHE_HOME="$root/cache" + export XDG_CONFIG_HOME="$root/config" + export XDG_STATE_HOME="$root/state" + export KILO_DISABLE_MODELS_FETCH=1 + export KILO_DISABLE_PROJECT_CONFIG=1 + export KILO_CONFIG_CONTENT='{"enabled_providers":["anthropic"]}' + export ANTHROPIC_API_KEY=dummy + "$binary" --pure models anthropic | grep -q '^anthropic/' + ) + } + + if [ "${{ matrix.mode }}" = "host" ]; then + smoke_host "./dist/${{ matrix.package }}/bin/kilo" + exit 0 + fi + + docker run --rm \ + --platform "${{ matrix.platform }}" \ + -v "$PWD/dist:/dist:ro" \ + -e PACKAGE="${{ matrix.package }}" \ + alpine:3.22 \ + sh -c ' + set -eu + # kilocode_change start - Bun musl binaries link against libstdc++ and libgcc_s + # (GCC C++ runtime). Alpine does not ship these by default; they are available + # as optional packages and must be installed for any Bun-compiled musl binary to run. + apk add --no-cache libstdc++ libgcc + # kilocode_change end + binary="/dist/$PACKAGE/bin/kilo" + "$binary" --version + root="$(mktemp -d)" + trap '\''rm -rf "$root"'\'' EXIT + unset KILO_MODELS_PATH KILO_MODELS_URL KILO_CONFIG KILO_CONFIG_DIR + export XDG_DATA_HOME="$root/data" + export XDG_CACHE_HOME="$root/cache" + export XDG_CONFIG_HOME="$root/config" + export XDG_STATE_HOME="$root/state" + export KILO_DISABLE_MODELS_FETCH=1 + export KILO_DISABLE_PROJECT_CONFIG=1 + export KILO_CONFIG_CONTENT='\''{"enabled_providers":["anthropic"]}'\'' + export ANTHROPIC_API_KEY=dummy + "$binary" --pure models anthropic | grep -q "^anthropic/" + ' + + validate-cli-windows: + name: Validate CLI (windows-${{ matrix.arch }}) + needs: build-cli + runs-on: ${{ matrix.runner }} + timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + include: + - arch: arm64 + runner: windows-11-arm + package: "@kilocode/cli-windows-arm64" + - arch: x64 + runner: windows-2025 + package: "@kilocode/cli-windows-x64" + steps: + - uses: actions/download-artifact@v8 + with: + name: kilo-cli.tar.zst + path: ${{ runner.temp }} + skip-decompress: true + + - name: Install zstd + shell: pwsh + run: | + if (-not (Get-Command zstd -ErrorAction SilentlyContinue)) { + choco install zstandard -y --no-progress + } + + - name: Unpack CLI dist + shell: pwsh + run: | + New-Item -ItemType Directory -Force -Path dist | Out-Null + zstd -d --stdout "$env:RUNNER_TEMP\kilo-cli.tar.zst" | tar -xf - -C dist + + - name: Run CLI smoke test + shell: pwsh + run: | + $package = "${{ matrix.package }}".Replace("/", "\") + $binary = ".\dist\$package\bin\kilo.exe" + & $binary --version + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + + $root = Join-Path $env:RUNNER_TEMP ([guid]::NewGuid().ToString()) + New-Item -ItemType Directory -Force -Path $root | Out-Null + try { + foreach ($name in "KILO_MODELS_PATH", "KILO_MODELS_URL", "KILO_CONFIG", "KILO_CONFIG_DIR") { + Remove-Item "Env:$name" -ErrorAction SilentlyContinue + } + $env:XDG_DATA_HOME = Join-Path $root "data" + $env:XDG_CACHE_HOME = Join-Path $root "cache" + $env:XDG_CONFIG_HOME = Join-Path $root "config" + $env:XDG_STATE_HOME = Join-Path $root "state" + $env:KILO_DISABLE_MODELS_FETCH = "1" + $env:KILO_DISABLE_PROJECT_CONFIG = "1" + $env:KILO_CONFIG_CONTENT = '{"enabled_providers":["anthropic"]}' + $env:ANTHROPIC_API_KEY = "dummy" + $output = & $binary --pure models anthropic + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + if (-not ($output -match "(?m)^anthropic/")) { + throw "Compiled Windows binary did not list Anthropic models from the sidecar snapshot" + } + } finally { + Remove-Item -Recurse -Force $root -ErrorAction SilentlyContinue + } + # kilocode_change end + build-vscode: + needs: + - build-cli + - validate-cli-unix + - validate-cli-windows runs-on: blacksmith-4vcpu-ubuntu-2404 if: github.repository == 'Kilo-Org/kilocode' steps: @@ -181,6 +360,8 @@ jobs: - version - build-cli - build-vscode + - validate-cli-unix # kilocode_change + - validate-cli-windows # kilocode_change - smoke-test runs-on: ubuntu-24.04 steps: diff --git a/.kilo/plans/1780256109130-stellar-forest.md b/.kilo/plans/1780256109130-stellar-forest.md new file mode 100644 index 00000000000..3aafa6c0dd9 --- /dev/null +++ b/.kilo/plans/1780256109130-stellar-forest.md @@ -0,0 +1,109 @@ +# Plan: JetBrains Feedback & Support Button + +## Goal +Add the VS Code empty-state `Feedback & Support` affordance to the JetBrains plugin, including a non-modal popup with the same three destinations: + +- GitHub issues: `https://github.com/Kilo-Org/kilocode/issues/new/choose` +- Discord: `https://kilo.ai/discord` +- Customer support: `https://kilo.ai/support` + +The popup must hide when clicking outside or pressing Escape. + +## Findings + +- The JetBrains empty state is `packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/EmptySessionPanel.kt`. +- It already renders the logo, welcome copy, recents, and `Show History`; this is the right place to add the button. +- The VS Code implementation is: + - Button: `packages/kilo-vscode/webview-ui/src/components/chat/MessageList.tsx` + - Popup content: `packages/kilo-vscode/webview-ui/src/components/chat/FeedbackDialog.tsx` + - Styling: `packages/kilo-vscode/webview-ui/src/styles/welcome.css` +- Local IntelliJ API source is available at `$INTELLIJ_REPO=/Users/kirillk/products/intellij-community`. +- IntelliJ popup API confirmed in local source: + - `JBPopupFactory.getInstance().createComponentPopupBuilder(content, focusComponent)` + - `setModalContext(false)` for non-modal context + - `setRequestFocus(false)` / `setFocusable(false)` if we want the popup not to steal focus + - `setCancelOnClickOutside(true)` for outside-click dismissal + - `setCancelKeyEnabled(true)` for Escape dismissal + - `setCancelOnWindowDeactivation(true)` and `setCancelOnOtherWindowOpen(true)` are available and appropriate for cleanup +- IntelliJ platform icons found in `AllIcons`: + - Feedback button: `AllIcons.Ide.Feedback` + - GitHub action: `AllIcons.Vcs.Vendors.Github` + - Support/help action: `AllIcons.Actions.Help` or `AllIcons.General.ContextHelp` + - Discord: no platform icon found. Add a Discord icon by borrowing the existing VS Code/kilo-ui Discord SVG artwork and adapting it into the JetBrains plugin resources with IntelliJ-compatible SVG colors and dark variant if needed. + +## Implementation Steps + +1. Add localized JetBrains bundle keys. + - Add base English strings to `frontend/src/main/resources/messages/KiloBundle.properties`: + - `feedback.button=Feedback & Support` + - `feedback.dialog.message=We'd love to hear your feedback or help with any issues you're experiencing.` + - `feedback.dialog.github=Report an issue on GitHub` + - `feedback.dialog.discord=Join our Discord community` + - `feedback.dialog.support=Customer Support` + - Reuse existing cancel text if present; otherwise add `common.cancel=Cancel` only if needed. + - Add matching keys to localized `KiloBundle_*.properties` files. If accurate translations are not already available from the VS Code i18n files, copy the VS Code translations for matching locales where practical and leave English fallback only if the JetBrains bundle mechanism supports it cleanly. + +2. Extend `EmptySessionPanel` UI. + - Add a new retained `FeedbackButton`, styled to match VS Code conceptually: + - feedback icon + `Feedback & Support` text + - dashed link-colored border + - transparent background + - hand cursor + - hover state fills with link color and flips foreground/background for contrast + - Use IntelliJ theme APIs instead of raw colors: + - link color: `JBUI.CurrentTheme.Link.Foreground.ENABLED` + - hover link color: `JBUI.CurrentTheme.Link.Foreground.HOVERED` if useful + - editor/panel background from existing session style or `UiStyle.Colors.editorBackground()` / component background + - spacing via `UiStyle.Gap` / `JBUI.Borders` + - rounded arc via `UiStyle.Arc.component()` or `JBUI.getInt("Button.arc", 6)` at paint time + - Add the feedback button below the existing `Show History` button in the empty-state south area, keeping the current centered layout. + - Keep Swing mutations on EDT and preserve retained-component behavior. + +3. Implement the feedback popup in frontend Swing code. + - Add a small popup builder method/class inside `EmptySessionPanel.kt` or a new nearby UI file if the file would become too large. + - Content should mirror VS Code: + - Kilo logo at top using existing `/icons/kilo-content.svg` + - message text + - three action buttons/rows for GitHub, Discord, and Customer Support + - every action should have an icon: `AllIcons.Vcs.Vendors.Github` for GitHub, the borrowed Discord SVG for Discord, and `AllIcons.Actions.Help` or `AllIcons.General.ContextHelp` for Customer Support + - optional Cancel button if it fits the JetBrains UX; Escape/outside click already dismisses + - Add the Discord icon asset under `frontend/src/main/resources/icons/` using the plugin's existing icon naming pattern, for example `discord.svg` and `discord_dark.svg` if the borrowed asset needs separate theme variants. + - Load the Discord icon with `IconLoader.getIcon("/icons/discord.svg", EmptySessionPanel::class.java)` or a small Kilo-owned icon object if multiple call sites need it. + - Use `BrowserUtil.browse(url)` to open links. + - Close the popup after opening a URL. + - Use `JBPopupFactory.createComponentPopupBuilder(content, null)` and configure: + - `.setModalContext(false)` + - `.setRequestFocus(false)` + - `.setFocusable(false)` unless keyboard tabbing inside popup is desired; if buttons need keyboard focus, use `.setFocusable(true)` with `.setRequestFocus(false)` + - `.setCancelOnClickOutside(true)` + - `.setCancelKeyEnabled(true)` + - `.setCancelOnWindowDeactivation(true)` + - `.setCancelOnOtherWindowOpen(true)` + - `.setResizable(false)` + - `.setMovable(false)` + - Show with `popup.showUnderneathOf(feedbackButton)`. + +4. Add test coverage in `EmptySessionPanelTest.kt`. + - Assert feedback button text uses `KiloBundle.message("feedback.button")`. + - Assert feedback button has hand cursor and visible border semantics. + - Add an injectable browse callback or popup action callback only if needed for testing without launching browsers; keep it minimal and avoid production-only test hooks if component traversal can exercise enough behavior. + - Add a test that clicking the feedback button creates/shows popup content, if feasible in `BasePlatformTestCase`; otherwise test the retained popup content builder/action rows directly through package-internal methods. + - Assert the three action labels exist and URL callbacks map to the same URLs as VS Code. + - Assert the Discord action has an icon, so the plan cannot regress to a text-only Discord row. + +5. Add release note. + - This is user-facing for the JetBrains plugin, so add a patch changeset under `.changeset/` unless the repo has a JetBrains-specific release-note mechanism that supersedes changesets. + - Suggested text: `Add Feedback & Support to the JetBrains empty session screen.` + +6. Verify. + - Run the focused frontend/JetBrains tests first, preferably from `packages/kilo-jetbrains/`: + - `./gradlew :frontend:test --tests "ai.kilocode.client.session.ui.EmptySessionPanelTest"` + - Run JetBrains typecheck from `packages/kilo-jetbrains/`: + - `bun run typecheck` or `./gradlew typecheck` + - If touching only frontend UI and tests pass, no backend/SDK generation is needed. + +## Notes + +- Do not add Kotlin UI DSL, Compose, or JCEF. +- Do not modify shared opencode files; this work is entirely under `packages/kilo-jetbrains/` plus a changeset. +- Prefer platform icons where available, but explicitly borrow/add the Discord icon because `AllIcons` does not provide one and the popup should match the VS Code button set visually. diff --git a/.kilo/skills/release-jetbrains/SKILL.md b/.kilo/skills/release-jetbrains/SKILL.md new file mode 100644 index 00000000000..1d749bc416a --- /dev/null +++ b/.kilo/skills/release-jetbrains/SKILL.md @@ -0,0 +1,133 @@ +--- +name: release-jetbrains +description: Use when releasing the Kilo JetBrains plugin -- resolve a version ("next rc" or explicit), run the prepare workflow, edit and commit a filtered human-readable changelog on the release PR, then watch publish to completion. +--- + +# JetBrains Release + +Use this skill when releasing the Kilo JetBrains plugin. + +This skill drives the existing JetBrains release workflows. It must not move, delete, or recreate JetBrains release tags. It must always confirm the resolved version with the user before dispatching the prepare workflow because the prepare workflow creates an immutable `jetbrains/v` tag. + +## Preconditions + +- Run from the repository root. +- `gh` must be authenticated for `Kilo-Org/kilocode` with permission to dispatch workflows, read PRs, and write contents. Merge permission is only required if the user asks the skill to merge the release PR automatically. +- Check auth with `gh auth status`. For GitHub CLI OAuth, refresh common release scopes with `gh auth refresh -s repo -s workflow`; `repo` covers private-repo contents and PR operations, and `workflow` allows workflow dispatch. If using a fine-grained token instead, grant repository permissions for Actions read/write, Contents read/write, and Pull requests read/write. Merging still requires normal repository collaborator permission or a token/user allowed by branch protection. +- Reference `packages/kilo-jetbrains/RELEASING.md` for manual recovery rules. +- Do not locally check out the generated release branch. The helper scripts update the release branch through GitHub to avoid disturbing the current worktree. + +## Version Resolution + +Resolve the user's version request: + +```bash +bun .kilo/skills/release-jetbrains/script/resolve-version.ts --spec "next rc" +``` + +Accepted specs: + +| Spec | Meaning | +|---|---| +| `next rc` | If the latest JetBrains tag is an RC, increment its `rc.n`; otherwise start the next patch RC at `rc.1`. | +| `next stable` | If the latest JetBrains tag is an RC, use its base version; otherwise use the next patch stable. | +| `x.y.z-rc.n` | Explicit RC release. | +| `x.y.z` | Explicit stable release. | + +Show the resolved `version`, `kind`, and default `fromTagDefault` to the user and ask for confirmation before continuing. + +## Prepare Workflow + +After confirmation, dispatch and watch the prepare workflow: + +```bash +bun .kilo/skills/release-jetbrains/script/dispatch-prepare.ts --kind rc --version 7.0.1-rc.7 +``` + +Pass a generous Bash timeout, such as `1800000` ms, because the script blocks on `gh run watch --exit-status`. If the shell times out but the workflow is still running, re-attach with: + +```bash +bun .kilo/skills/release-jetbrains/script/dispatch-prepare.ts --kind rc --version 7.0.1-rc.7 --run-id +``` + +The script prints `prNumber`, `prUrl`, `runUrl`, and `branch` on success. + +## Changelog Draft + +Create a changelog draft after the prepare PR exists: + +1. Read the PR body with `gh pr view --json body`. +2. Extract `JetBrains-From-Tag`, `JetBrains-Tag`, and `## Generated Notes`. +3. Use the release range and path filter as the primary relevance signal: + +```bash +git log --oneline .. -- packages/opencode packages/kilo-jetbrains +``` + +Keep JetBrains and CLI/runtime changes. Drop unrelated VS Code, docs, gateway, telemetry, i18n, desktop, and webview-only changes unless they affect the CLI bundled into the JetBrains plugin. + +Rewrite terse commit or PR titles into user-facing bullets grouped under `### Added`, `### Fixed`, and `### Changed`. Keep the exact generated header format: + +```markdown +## [] - +``` + +Write the editable draft to: + +```text +packages/kilo-jetbrains/build/release/-changelog.md +``` + +Include source context in an HTML comment so it is easy to edit but not shipped: + +```markdown + +``` + +Ask the user to edit the file and confirm when done. + +## Commit Changelog + +After the user confirms the draft is ready, strip the `` block into a temporary cleaned file, then commit the cleaned section to the release branch: + +```bash +bun .kilo/skills/release-jetbrains/script/update-changelog.ts --version 7.0.1-rc.7 --file /path/to/clean-section.md +``` + +The script updates `packages/kilo-jetbrains/CHANGELOG.md` on `jetbrains/release/v` through the GitHub contents API and commits with: + +```text +docs(jetbrains): edit changelog for v +``` + +## Approve And Publish + +Ask the user to approve the release changelog and metadata. By default, have the user merge the release PR manually in GitHub, then watch the publish workflow: + +```bash +bun .kilo/skills/release-jetbrains/script/watch-publish.ts --pr --version 7.0.1-rc.7 +``` + +Only merge automatically when the user explicitly asks for it and `gh` has merge permission: + +```bash +bun .kilo/skills/release-jetbrains/script/watch-publish.ts --pr --version 7.0.1-rc.7 --merge +``` + +Pass a generous Bash timeout, such as `1800000` ms. If the shell times out, re-attach with: + +```bash +bun .kilo/skills/release-jetbrains/script/watch-publish.ts --pr --version 7.0.1-rc.7 --run-id +``` + +Report the Marketplace channel and GitHub Release URL. RC versions publish to the `eap` channel; stable versions publish to the default Marketplace channel. + +## Recovery + +- If prepare created the tag but failed before creating a PR, rerun prepare for the same version. The existing workflow reuses the tag if it points to the same commit. +- If a tag points to an unexpected SHA, stop and inspect manually. Do not move or delete release tags casually. +- If publish fails after merge, rerun the failed workflow only if Marketplace did not already accept the version. +- If Marketplace succeeds but GitHub Release upload fails, manually create or edit the GitHub Release for `jetbrains/v` using the reviewed changelog. diff --git a/.kilo/skills/release-jetbrains/script/dispatch-prepare.ts b/.kilo/skills/release-jetbrains/script/dispatch-prepare.ts new file mode 100644 index 00000000000..9589c795416 --- /dev/null +++ b/.kilo/skills/release-jetbrains/script/dispatch-prepare.ts @@ -0,0 +1,73 @@ +#!/usr/bin/env bun + +import { $ } from "bun" +import { parseArgs } from "util" + +const repo = process.env.GH_REPO ?? process.env.GITHUB_REPOSITORY ?? "Kilo-Org/kilocode" +const workflow = "prepare-jetbrains-release.yml" +const { values } = parseArgs({ + args: Bun.argv.slice(2), + options: { + kind: { type: "string" }, + version: { type: "string" }, + "from-tag": { type: "string" }, + "run-id": { type: "string" }, + help: { type: "boolean", short: "h", default: false }, + }, +}) + +if (values.help) { + console.log(`Usage: bun .kilo/skills/release-jetbrains/script/dispatch-prepare.ts --kind --version [--from-tag ] [--run-id ]`) + process.exit(0) +} + +const kind = values.kind +const ver = values.version +const branch = `jetbrains/release/v${ver}` + +if (kind !== "rc" && kind !== "stable") throw new Error("--kind must be rc or stable") +if (!ver) throw new Error("--version is required") + +const id = values["run-id"] ?? (await dispatch()) +const url = `https://github.com/${repo}/actions/runs/${id}` + +console.log(`prepareRunId=${id}`) +console.log(`runUrl=${url}`) + +await $`gh run watch ${id} --repo ${repo} --exit-status` + +const pr = (await $`gh pr view ${branch} --repo ${repo} --json number,url`.json()) as { number: number; url: string } +console.log( + JSON.stringify( + { + prNumber: pr.number, + prUrl: pr.url, + runUrl: url, + branch, + }, + null, + 2, + ), +) + +async function dispatch() { + const before = new Set((await runs()).map((run) => run.databaseId)) + const args = ["workflow", "run", workflow, "--repo", repo, "-f", `kind=${kind}`, "-f", `version=${ver}`] + if (values["from-tag"]) args.push("-f", `from_tag=${values["from-tag"]}`) + await $`gh ${args}` + + for (const _ of Array.from({ length: 60 })) { + const run = (await runs()).find((item) => !before.has(item.databaseId)) + if (run) return String(run.databaseId) + await Bun.sleep(1000) + } + throw new Error(`No new ${workflow} run appeared after dispatch`) +} + +async function runs() { + return (await $`gh run list --repo ${repo} --workflow ${workflow} --event workflow_dispatch --json databaseId,createdAt,status --limit 100`.json()) as { + databaseId: number + createdAt: string + status: string + }[] +} diff --git a/.kilo/skills/release-jetbrains/script/resolve-version.ts b/.kilo/skills/release-jetbrains/script/resolve-version.ts new file mode 100644 index 00000000000..57799b66f65 --- /dev/null +++ b/.kilo/skills/release-jetbrains/script/resolve-version.ts @@ -0,0 +1,107 @@ +#!/usr/bin/env bun + +import { $ } from "bun" +import semver from "semver" +import { parseArgs } from "util" + +const { values } = parseArgs({ + args: Bun.argv.slice(2), + options: { + spec: { type: "string" }, + help: { type: "boolean", short: "h", default: false }, + }, +}) + +if (values.help) { + console.log(`Usage: bun .kilo/skills/release-jetbrains/script/resolve-version.ts --spec `) + process.exit(0) +} + +const spec = values.spec?.trim().toLowerCase() +if (!spec) throw new Error("--spec is required") + +await $`git fetch origin main --tags`.quiet() + +const tags = await list() +const hit = explicit(spec) ?? next(spec, tags) +const from = base(hit.version, hit.kind, tags) + +console.log( + JSON.stringify( + { + version: hit.version, + kind: hit.kind, + fromTagDefault: from, + }, + null, + 2, + ), +) + +type Kind = "rc" | "stable" +type Tag = { tag: string; version: string } + +function explicit(spec: string) { + if (/^\d+\.\d+\.\d+-rc\.\d+$/.test(spec)) return { version: spec, kind: "rc" as Kind } + if (/^\d+\.\d+\.\d+$/.test(spec)) return { version: spec, kind: "stable" as Kind } + return undefined +} + +function next(spec: string, tags: Tag[]) { + const latest = [...tags].sort((a, b) => semver.rcompare(a.version, b.version))[0] + if (!latest) throw new Error("No JetBrains release tags found; pass an explicit version") + const parsed = semver.parse(latest.version) + if (!parsed) throw new Error(`Invalid latest JetBrains tag: ${latest.tag}`) + + if (spec === "next rc") return rc(parsed) + if (spec === "next stable") return stable(parsed) + throw new Error("--spec must be 'next rc', 'next stable', x.y.z-rc.n, or x.y.z") +} + +function rc(ver: semver.SemVer) { + const pre = ver.prerelease + if (pre[0] === "rc" && typeof pre[1] === "number") { + return { version: `${ver.major}.${ver.minor}.${ver.patch}-rc.${pre[1] + 1}`, kind: "rc" as Kind } + } + return { version: `${ver.major}.${ver.minor}.${ver.patch + 1}-rc.1`, kind: "rc" as Kind } +} + +function stable(ver: semver.SemVer) { + if (ver.prerelease.length) return { version: `${ver.major}.${ver.minor}.${ver.patch}`, kind: "stable" as Kind } + return { version: `${ver.major}.${ver.minor}.${ver.patch + 1}`, kind: "stable" as Kind } +} + +function base(ver: string, kind: Kind, tags: Tag[]) { + const want = semver.parse(ver) + if (!want) throw new Error(`Invalid semver: ${ver}`) + const prior = tags + .filter((item) => !semver.prerelease(item.version) && semver.lt(item.version, ver)) + .sort((a, b) => semver.rcompare(a.version, b.version)) + + if (kind === "stable") { + const hit = prior[0] + if (!hit) return null + return hit.tag + } + + const prerelease = tags + .filter((item) => { + const parsed = semver.parse(item.version) + if (!parsed) return false + if (parsed.major !== want.major || parsed.minor !== want.minor || parsed.patch !== want.patch) return false + return Boolean(semver.prerelease(item.version)) && semver.lt(item.version, ver) + }) + .sort((a, b) => semver.rcompare(a.version, b.version)) + + return (prerelease[0] ?? prior[0])?.tag ?? null +} + +async function list() { + const text = await $`git tag --list ${"jetbrains/v*"}`.text() + return text + .split(/\r?\n/) + .map((item) => item.trim()) + .filter(Boolean) + .map((tag) => ({ tag, version: tag.replace(/^jetbrains\/v/, "") })) + .filter((item) => semver.valid(item.version)) +} diff --git a/.kilo/skills/release-jetbrains/script/update-changelog.ts b/.kilo/skills/release-jetbrains/script/update-changelog.ts new file mode 100644 index 00000000000..d7dca8b3a75 --- /dev/null +++ b/.kilo/skills/release-jetbrains/script/update-changelog.ts @@ -0,0 +1,78 @@ +#!/usr/bin/env bun + +import { $ } from "bun" +import { parseArgs } from "util" + +const repo = process.env.GH_REPO ?? process.env.GITHUB_REPOSITORY ?? "Kilo-Org/kilocode" +const path = "packages/kilo-jetbrains/CHANGELOG.md" +const { values } = parseArgs({ + args: Bun.argv.slice(2), + options: { + version: { type: "string" }, + file: { type: "string" }, + help: { type: "boolean", short: "h", default: false }, + }, +}) + +if (values.help) { + console.log(`Usage: bun .kilo/skills/release-jetbrains/script/update-changelog.ts --version --file `) + process.exit(0) +} + +const ver = values.version +const file = values.file +if (!ver) throw new Error("--version is required") +if (!file) throw new Error("--file is required") + +const branch = `jetbrains/release/v${ver}` +const section = strip((await Bun.file(file).text()).trim()) +validate(section, ver) + +const current = (await $`gh api ${`repos/${repo}/contents/${path}`} -f ref=${branch}`.json()) as { + content: string + encoding: string + sha: string +} +if (current.encoding !== "base64") throw new Error(`Unexpected content encoding: ${current.encoding}`) + +const text = Buffer.from(current.content.replace(/\s/g, ""), "base64").toString("utf8") +const pattern = regex(ver) +if (!pattern.test(text)) throw new Error(`${path} is missing a section for ${ver} on ${branch}`) + +const next = text.replace(pattern, `\n${section}\n`).replace(/\n{3,}/g, "\n\n").trimEnd() + "\n" +if (next === text) { + console.log("CHANGELOG.md already contains the provided section") + process.exit(0) +} + +const body = { + message: `docs(jetbrains): edit changelog for v${ver}`, + content: Buffer.from(next).toString("base64"), + sha: current.sha, + branch, +} +const tmp = await temp(body) +await $`gh api ${`repos/${repo}/contents/${path}`} --method PUT --input ${tmp}` +console.log(`Committed changelog update to ${branch}`) + +function strip(text: string) { + return text.replace(//g, "").trim() +} + +function validate(section: string, ver: string) { + if (!section.startsWith(`## [${ver}]`)) throw new Error(`Section must start with ## [${ver}]`) + if (!/^### (Added|Fixed|Changed)$/m.test(section)) { + throw new Error("Section must contain at least one Added, Fixed, or Changed heading") + } +} + +function regex(ver: string) { + const safe = ver.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + return new RegExp(`\n?## \\[${safe}\\][\\s\\S]*?(?=\n## \\[|$)`) +} + +async function temp(body: object) { + const file = `/tmp/kilo-jetbrains-changelog-${Date.now()}.json` + await Bun.write(file, JSON.stringify(body)) + return file +} diff --git a/.kilo/skills/release-jetbrains/script/watch-publish.ts b/.kilo/skills/release-jetbrains/script/watch-publish.ts new file mode 100644 index 00000000000..719d46c4c1c --- /dev/null +++ b/.kilo/skills/release-jetbrains/script/watch-publish.ts @@ -0,0 +1,87 @@ +#!/usr/bin/env bun + +import { $ } from "bun" +import { parseArgs } from "util" + +const repo = process.env.GH_REPO ?? process.env.GITHUB_REPOSITORY ?? "Kilo-Org/kilocode" +const workflow = "publish-jetbrains.yml" +const { values } = parseArgs({ + args: Bun.argv.slice(2), + options: { + pr: { type: "string" }, + version: { type: "string" }, + merge: { type: "boolean", default: false }, + "run-id": { type: "string" }, + help: { type: "boolean", short: "h", default: false }, + }, +}) + +if (values.help) { + console.log(`Usage: bun .kilo/skills/release-jetbrains/script/watch-publish.ts --pr --version [--merge] [--run-id ]`) + process.exit(0) +} + +const pr = values.pr +const ver = values.version +if (!pr) throw new Error("--pr is required") +if (!ver) throw new Error("--version is required") + +const branch = `jetbrains/release/v${ver}` +const id = values["run-id"] ?? (values.merge ? await merge() : await find()) +const url = `https://github.com/${repo}/actions/runs/${id}` + +console.log(`publishRunId=${id}`) +console.log(`runUrl=${url}`) + +await $`gh run watch ${id} --repo ${repo} --exit-status` + +const rel = (await $`gh release view ${`jetbrains/v${ver}`} --repo ${repo} --json url,isPrerelease`.json()) as { + url: string + isPrerelease: boolean +} +console.log( + JSON.stringify( + { + version: ver, + marketplaceChannel: rel.isPrerelease ? "eap" : "default", + releaseUrl: rel.url, + runUrl: url, + }, + null, + 2, + ), +) + +async function merge() { + const before = new Set((await runs()).map((run) => run.databaseId)) + await $`gh pr merge ${pr} --repo ${repo} --merge` + + for (const _ of Array.from({ length: 120 })) { + const run = (await runs()).find((item) => item.headBranch === branch && !before.has(item.databaseId)) + if (run) return String(run.databaseId) + await Bun.sleep(1000) + } + throw new Error(`No new ${workflow} run appeared after merging PR ${pr}`) +} + +async function find() { + for (const _ of Array.from({ length: 120 })) { + const run = (await runs()).find((item) => item.headBranch === branch && active(item.status)) + if (run) return String(run.databaseId) + await Bun.sleep(1000) + } + throw new Error(`No ${workflow} run found for ${branch}. Merge PR ${pr} first, or pass --merge to merge it automatically.`) +} + +function active(status: string) { + return status === "queued" || status === "in_progress" || status === "waiting" || status === "requested" || status === "pending" +} + +async function runs() { + return (await $`gh run list --repo ${repo} --workflow ${workflow} --event pull_request --json databaseId,createdAt,headBranch,status --limit 100`.json()) as { + databaseId: number + createdAt: string + headBranch: string + status: string + }[] +} diff --git a/.opencode-version b/.opencode-version index 5ceca955de6..dfbc2e65373 100644 --- a/.opencode-version +++ b/.opencode-version @@ -1 +1 @@ -v1.14.42 +v1.14.46 diff --git a/.opencode/tui.json b/.opencode/tui.json index bb472d8e23b..f52ed17f410 100644 --- a/.opencode/tui.json +++ b/.opencode/tui.json @@ -1,4 +1,3 @@ { - "$schema": "https://opencode.ai/tui.json", - "keybinds": {} -} + "$schema": "https://opencode.ai/tui.json" +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 41ecbcb24ea..53d08204098 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,7 +16,7 @@ The Kilo Community is [on Discord](https://kilo.ai/discord). ## Prerequisites -- **Bun 1.3.13+** — required for all packages. +- **Bun 1.3.14+** — required for all packages. - **Java 21** — required by the JetBrains plugin. The root `bun turbo typecheck` and `bun turbo test:ci` commands include `@kilocode/kilo-jetbrains` and will fail without Java 21. The preferred way to install Java is via [SDKMAN](https://sdkman.io/install): @@ -41,7 +41,7 @@ The Kilo Community is [on Discord](https://kilo.ai/discord). ## Developing Kilo CLI -- **Requirements:** Bun 1.3.13+, Java 21 (see [Prerequisites](#prerequisites) above) +- **Requirements:** Bun 1.3.14+, Java 21 (see [Prerequisites](#prerequisites) above) - Install dependencies and start the CLI from the repo root: ```bash diff --git a/bun.lock b/bun.lock index 3938c57547f..1a9a3ac49bd 100644 --- a/bun.lock +++ b/bun.lock @@ -33,7 +33,7 @@ }, "packages/core": { "name": "@opencode-ai/core", - "version": "7.3.22", + "version": "7.3.33", "bin": { "opencode": "./bin/opencode", }, @@ -68,7 +68,7 @@ }, "packages/http-recorder": { "name": "@opencode-ai/http-recorder", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@effect/platform-node": "catalog:", "effect": "catalog:", @@ -81,10 +81,11 @@ }, "packages/kilo-console": { "name": "@kilocode/kilo-console", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@kilocode/kilo-web-ui": "workspace:*", "@kilocode/sdk": "workspace:*", + "@lottiefiles/dotlottie-web": "0.74.0", "@opencode-ai/ui": "workspace:*", "@solidjs/router": "catalog:", "ghostty-web": "0.4.0", @@ -102,7 +103,7 @@ }, "packages/kilo-docs": { "name": "@kilocode/kilo-docs", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@docsearch/css": "^4", "@docsearch/js": "^4", @@ -132,12 +133,13 @@ }, "packages/kilo-gateway": { "name": "@kilocode/kilo-gateway", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@ai-sdk/alibaba": "1.0.17", "@ai-sdk/anthropic": "3.0.71", + "@ai-sdk/mistral": "3.0.27", "@ai-sdk/openai": "3.0.53", - "@ai-sdk/openai-compatible": "2.0.37", + "@ai-sdk/openai-compatible": "2.0.41", "@clack/prompts": "1.0.0-alpha.1", "@kilocode/plugin": "workspace:*", "@kilocode/sdk": "workspace:*", @@ -168,7 +170,7 @@ }, "packages/kilo-i18n": { "name": "@kilocode/kilo-i18n", - "version": "7.3.22", + "version": "7.3.33", "devDependencies": { "@tsconfig/node22": "catalog:", "@types/bun": "catalog:", @@ -178,7 +180,7 @@ }, "packages/kilo-indexing": { "name": "@kilocode/kilo-indexing", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@aws-sdk/client-bedrock-runtime": "3.1005.0", "@aws-sdk/credential-provider-ini": "3.972.31", @@ -210,11 +212,11 @@ }, "packages/kilo-jetbrains": { "name": "@kilocode/kilo-jetbrains", - "version": "7.3.22", + "version": "7.3.33", }, "packages/kilo-telemetry": { "name": "@kilocode/kilo-telemetry", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@kilocode/kilo-gateway": "workspace:*", "posthog-node": "4.4.0", @@ -228,7 +230,7 @@ }, "packages/kilo-ui": { "name": "@kilocode/kilo-ui", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@kilocode/sdk": "workspace:*", "@kobalte/core": "0.13.11", @@ -265,7 +267,7 @@ }, "packages/kilo-vscode": { "name": "kilo-code", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@anthropic-ai/sdk": "^0.39.0", "@kilocode/kilo-gateway": "workspace:*", @@ -331,7 +333,7 @@ }, "packages/kilo-web-ui": { "name": "@kilocode/kilo-web-ui", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@kilocode/kilo-ui": "workspace:*", "@kobalte/core": "catalog:", @@ -346,7 +348,7 @@ }, "packages/llm": { "name": "@opencode-ai/llm", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@smithy/eventstream-codec": "4.2.14", "@smithy/util-utf8": "4.2.2", @@ -364,7 +366,7 @@ }, "packages/opencode": { "name": "@kilocode/cli", - "version": "7.3.22", + "version": "7.3.33", "bin": { "kilo": "./bin/kilo", "kilocode": "./bin/kilo", @@ -407,6 +409,7 @@ "@kilocode/kilo-indexing": "workspace:*", "@kilocode/kilo-telemetry": "workspace:*", "@kilocode/plugin": "workspace:*", + "@kilocode/plugin-atomic-chat": "workspace:*", "@kilocode/sdk": "workspace:*", "@lydell/node-pty": "catalog:", "@modelcontextprotocol/sdk": "1.29.0", @@ -509,6 +512,7 @@ "@types/bun": "catalog:", "@types/cross-spawn": "catalog:", "@types/mime-types": "3.0.1", + "@types/node": "catalog:", "@types/npm-package-arg": "6.1.4", "@types/npmcli__arborist": "6.3.3", "@types/semver": "^7.5.8", @@ -527,7 +531,7 @@ }, "packages/plugin": { "name": "@kilocode/plugin", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@kilocode/sdk": "workspace:*", "effect": "catalog:", @@ -553,9 +557,23 @@ "@opentui/solid", ], }, + "packages/plugin-atomic-chat": { + "name": "@kilocode/plugin-atomic-chat", + "version": "7.3.33", + "dependencies": { + "@kilocode/plugin": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "catalog:", + "@types/node": "catalog:", + "@typescript/native-preview": "catalog:", + "typescript": "catalog:", + "vitest": "^4.0.16", + }, + }, "packages/script": { "name": "@opencode-ai/script", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "semver": "^7.6.3", }, @@ -566,7 +584,7 @@ }, "packages/sdk/js": { "name": "@kilocode/sdk", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "cross-spawn": "catalog:", }, @@ -581,7 +599,7 @@ }, "packages/storybook": { "name": "@opencode-ai/storybook", - "version": "7.3.22", + "version": "7.3.33", "devDependencies": { "@opencode-ai/ui": "workspace:*", "@solidjs/meta": "catalog:", @@ -604,7 +622,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "7.3.22", + "version": "7.3.33", "dependencies": { "@kilocode/sdk": "workspace:*", "@kobalte/core": "catalog:", @@ -707,10 +725,10 @@ "@tailwindcss/vite": "4.1.11", "@tsconfig/bun": "1.0.9", "@tsconfig/node22": "22.0.2", - "@types/bun": "1.3.12", + "@types/bun": "1.3.14", "@types/cross-spawn": "6.0.6", "@types/luxon": "3.7.1", - "@types/node": "24.12.2", + "@types/node": "24.12.4", "@types/semver": "7.7.1", "@typescript/native-preview": "7.0.0-dev.20260316.1", "ai": "6.0.168", @@ -1326,6 +1344,8 @@ "@kilocode/plugin": ["@kilocode/plugin@workspace:packages/plugin"], + "@kilocode/plugin-atomic-chat": ["@kilocode/plugin-atomic-chat@workspace:packages/plugin-atomic-chat"], + "@kilocode/sdk": ["@kilocode/sdk@workspace:packages/sdk/js"], "@kobalte/core": ["@kobalte/core@0.13.11", "", { "dependencies": { "@floating-ui/dom": "^1.5.1", "@internationalized/date": "^3.4.0", "@internationalized/number": "^3.2.1", "@kobalte/utils": "^0.9.1", "@solid-primitives/props": "^3.1.8", "@solid-primitives/resize-observer": "^2.0.26", "solid-presence": "^0.1.8", "solid-prevent-scroll": "^0.1.4" }, "peerDependencies": { "solid-js": "^1.8.15" } }, "sha512-hK7TYpdib/XDb/r/4XDBFaO9O+3ZHz4ZWryV4/3BfES+tSQVgg2IJupDnztKXB0BqbSRy/aWlHKw1SPtNPYCFQ=="], @@ -1354,6 +1374,8 @@ "@leichtgewicht/ip-codec": ["@leichtgewicht/ip-codec@2.0.5", "", {}, "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="], + "@lottiefiles/dotlottie-web": ["@lottiefiles/dotlottie-web@0.74.0", "", {}, "sha512-rG12+dJSVhQDdleGr9epR7zU/UJ6hh8jzBDHAurClHP5t5dSrOh3eP3UCFxolpVPcobaRVYsBnYg4HQokQewpg=="], + "@lukeed/ms": ["@lukeed/ms@2.0.2", "", {}, "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA=="], "@lydell/node-pty": ["@lydell/node-pty@1.2.0-beta.10", "", { "optionalDependencies": { "@lydell/node-pty-darwin-arm64": "1.2.0-beta.10", "@lydell/node-pty-darwin-x64": "1.2.0-beta.10", "@lydell/node-pty-linux-arm64": "1.2.0-beta.10", "@lydell/node-pty-linux-x64": "1.2.0-beta.10", "@lydell/node-pty-win32-arm64": "1.2.0-beta.10", "@lydell/node-pty-win32-x64": "1.2.0-beta.10" } }, "sha512-Fv+A3+MZVA8qhkBIZsM1E6dCdHNMyXXz22mAYiMWd03LlyK///F3OH6CKPX9mj4id7LUlxpr45yPzyBVy9aDPw=="], @@ -2088,7 +2110,7 @@ "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], - "@types/bun": ["@types/bun@1.3.12", "", { "dependencies": { "bun-types": "1.3.12" } }, "sha512-DBv81elK+/VSwXHDlnH3Qduw+KxkTIWi7TXkAeh24zpi5l0B2kUg9Ga3tb4nJaPcOFswflgi/yAvMVBPrxMB+A=="], + "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], "@types/cacache": ["@types/cacache@20.0.1", "", { "dependencies": { "@types/node": "*", "minipass": "*" } }, "sha512-QlKW3AFoFr/hvPHwFHMIVUH/ZCYeetBNou3PCmxu5LaNDvrtBlPJtIA6uhmU9JRt9oxj7IYoqoLcpxtzpPiTcw=="], @@ -2196,7 +2218,7 @@ "@types/mssql": ["@types/mssql@9.1.11", "", { "dependencies": { "@types/node": "*", "tarn": "^3.0.1", "tedious": "*" } }, "sha512-vcujgrDbDezCxNDO4KY6gjwduLYOKfrexpRUwhoysRvcXZ3+IgZ/PMYFDgh8c3cQIxZ6skAwYo+H6ibMrBWPjQ=="], - "@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "@types/node": ["@types/node@24.12.4", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA=="], "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], @@ -2534,7 +2556,7 @@ "bun-pty": ["bun-pty@0.4.8", "", {}, "sha512-rO70Mrbr13+jxHHHu2YBkk2pNqrJE5cJn29WE++PUr+GFA0hq/VgtQPZANJ8dJo6d7XImvBk37Innt8GM7O28w=="], - "bun-types": ["bun-types@1.3.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-HqOLj5PoFajAQciOMRiIZGNoKxDJSr6qigAttOX40vJuSp6DN/CxWp9s3C1Xwm4oH7ybueITwiaOcWXoYVoRkA=="], + "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], @@ -4532,6 +4554,8 @@ "@antfu/install-pkg/package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + "@anthropic-ai/sdk/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "@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=="], @@ -4592,10 +4616,10 @@ "@kilocode/kilo-docs/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "@kilocode/kilo-gateway/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="], - "@kilocode/kilo-indexing/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + "@manypkg/find-root/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], @@ -4736,6 +4760,30 @@ "@textlint/linter-formatter/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@types/cacache/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/cross-spawn/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/mssql/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/node-fetch/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/npm-registry-fetch/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/npmcli__arborist/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/npmlog/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/pacote/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/qrcode/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/readable-stream/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/ssri/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "@types/ws/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "@vitest/expect/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], @@ -4774,6 +4822,8 @@ "ai-gateway-provider/@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@2.5.1", "", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-r1fJL1Cb3gQDa2MpWH/sfx1BsEW0uzlRriJM6eihaKqbtKDmZoBisF32VcVaQYassighX7NGCkF68EsrZA43uQ=="], + "apache-arrow/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], "archiver-utils/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], @@ -4808,6 +4858,8 @@ "buffer/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "bun-types/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "c12/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "c12/dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="], @@ -5022,6 +5074,8 @@ "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + "protobufjs/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "proxy-addr/ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], "qrcode/yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], @@ -5092,6 +5146,8 @@ "tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + "tedious/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "tedious/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "tedious/sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], @@ -5170,12 +5226,12 @@ "@hey-api/openapi-ts/open/wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], - "@kilocode/kilo-gateway/@ai-sdk/openai-compatible/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], - "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "@morphllm/morphsdk/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.95", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZmUNNbZl3V42xwQzPaNUi+s8eqR2lnrxf0bvB6YbLXpLjHYv0k2Y78t12cNOfY0bxGeuVVTLyk856uLuQIuXEQ=="], + "@morphllm/morphsdk/openai/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "@morphllm/morphsdk/openai/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="], @@ -5468,6 +5524,8 @@ "jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "kilo-code/openai/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -5578,8 +5636,6 @@ "@eslint/eslintrc/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "@kilocode/kilo-gateway/@ai-sdk/openai-compatible/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "@morphllm/morphsdk/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], diff --git a/flake.nix b/flake.nix index 541454f9746..56438ab332e 100644 --- a/flake.nix +++ b/flake.nix @@ -21,26 +21,26 @@ devShells = forEachSystem (pkgs: { default = let - # Pin bun to the version declared in package.json (packageManager: "bun@1.3.13"). - # nixpkgs-unstable currently ships 1.3.11, so we fetch the official release directly. + # Pin bun to the version declared in package.json (packageManager: "bun@1.3.14"). + # The locked nixpkgs revision ships 1.3.11, so we fetch the official release directly. bun = let sources = { "aarch64-linux" = { name = "bun-linux-aarch64"; - hash = "sha256-cLrkGzkIsKEg4eWMXIrzDnSvrjuNEbDT/djnh937SyI="; + hash = "sha256-on/7Y6gxA3WDbg1vZorhf6jY0YuIw3yCHGUzGXOhmjs="; }; "x86_64-linux" = { name = "bun-linux-x64"; - hash = "sha256-ecB3H6i5LDOq5B4VoODTB+qZ0OLwAxfHHGxTI3p44lo="; + hash = "sha256-lR7iruhV8IWVruxiJSJqKY0/6oOj3NZGXAnLzN9+hI8="; }; "aarch64-darwin" = { name = "bun-darwin-aarch64"; - hash = "sha256-VGfj9l26Umuf6pjwzOBO+vwMY+Fpcz7Ce4dqOtMtoZA="; + hash = "sha256-2LliIYKK1vl6x6wKt+lYcjQa92MAHogD6CZ2UsJlJiA="; }; "x86_64-darwin" = { name = "bun-darwin-x64"; - hash = "sha256-5abItk9BmSUjLREeyxPiXwq/VeVPeSNB+YdiP9B3gAk="; + hash = "sha256-QYPfM3RiPlurMVxUfPoJdFM81FfYa3O2OfeoeXTNZjM="; }; }; source = @@ -49,7 +49,7 @@ in pkgs.stdenv.mkDerivation rec { pname = "bun"; - version = "1.3.13"; + version = "1.3.14"; src = pkgs.fetchurl { url = "https://github.com/oven-sh/bun/releases/download/bun-v${version}/${source.name}.zip"; inherit (source) hash; diff --git a/nix/hashes.json b/nix/hashes.json index db617d736bd..62bd2f52fa4 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-STfDdoDiRwXnQ3B8lueNSZp4iJFL9TAME6R+dnxI1eU=", - "aarch64-linux": "sha256-v/N0eCo1pa3n5QTMdLHBYICIEdI0BiNEsMzgRbOEXfA=", - "aarch64-darwin": "sha256-gC6iPlR+UTo336ukkHIzHKQMwxFOdyTIl9UCIh/XVdw=", - "x86_64-darwin": "sha256-es6bcIwldn0sKHnC7TqOaL+IST3zZ3JrHbH8ojGbQQ0=" + "x86_64-linux": "sha256-NSqthrARPWAxKVFfHuiUp3SqBqHzjVHFdEezBvZNm3c=", + "aarch64-linux": "sha256-DMgFksIgPHSgScquewbdiVcXxWsa3Zf0sFFqaVWYtgw=", + "aarch64-darwin": "sha256-uvoPjl4VBh7ErdmWlDD/chyXSc9KYDye3Fht0V6XD+A=", + "x86_64-darwin": "sha256-O4Mn1R2YrhHvizOZomST8p7PU/IpUj7+zr0SHis6QN0=" } } diff --git a/package.json b/package.json index 2c24470b0cf..922ae41505f 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "AI-powered development tool", "private": true, "type": "module", - "packageManager": "bun@1.3.13", + "packageManager": "bun@1.3.14", "scripts": { "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts", "dev:storybook": "bun --cwd packages/storybook storybook", @@ -28,7 +28,7 @@ "@effect/opentelemetry": "4.0.0-beta.57", "@effect/platform-node": "4.0.0-beta.57", "@npmcli/arborist": "9.4.0", - "@types/bun": "1.3.12", + "@types/bun": "1.3.14", "@types/cross-spawn": "6.0.6", "@octokit/rest": "22.0.0", "@hono/zod-validator": "0.4.2", @@ -37,7 +37,7 @@ "ulid": "3.0.1", "@kobalte/core": "0.13.11", "@types/luxon": "3.7.1", - "@types/node": "24.12.2", + "@types/node": "24.12.4", "@types/semver": "7.7.1", "@tsconfig/node22": "22.0.2", "@tsconfig/bun": "1.0.9", @@ -151,6 +151,6 @@ "solid-js@1.9.10": "patches/solid-js@1.9.10.patch", "mammoth@1.12.0": "patches/mammoth@1.12.0.patch" }, - "version": "7.3.22", + "version": "7.3.33", "peerDependencies": {} } diff --git a/packages/containers/bun-node/Dockerfile b/packages/containers/bun-node/Dockerfile index 6998577bd53..8c93e45502a 100644 --- a/packages/containers/bun-node/Dockerfile +++ b/packages/containers/bun-node/Dockerfile @@ -6,7 +6,7 @@ FROM ${REGISTRY}/build/base:24.04 SHELL ["/bin/bash", "-lc"] ARG NODE_VERSION=24.4.0 -ARG BUN_VERSION=1.3.13 +ARG BUN_VERSION=1.3.14 ENV BUN_INSTALL=/opt/bun ENV PATH=/opt/bun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin diff --git a/packages/core/package.json b/packages/core/package.json index ddfaf9d4af0..3def0c590ee 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.3.22", + "version": "7.3.33", "name": "@opencode-ai/core", "type": "module", "license": "MIT", diff --git a/packages/opencode/src/util/effect-zod.ts b/packages/core/src/effect-zod.ts similarity index 100% rename from packages/opencode/src/util/effect-zod.ts rename to packages/core/src/effect-zod.ts diff --git a/packages/core/src/flag/flag.ts b/packages/core/src/flag/flag.ts index 262d8919cf0..95c8e01634e 100644 --- a/packages/core/src/flag/flag.ts +++ b/packages/core/src/flag/flag.ts @@ -1,4 +1,5 @@ import { Config } from "effect" +import { InstallationChannel } from "../installation/version" function truthy(key: string) { const value = process.env[key]?.toLowerCase() @@ -10,6 +11,13 @@ function falsy(key: string) { return value === "false" || value === "0" } +// Channels where new experiments default to ON (unstable / internal users). +// Stable channels (`prod`, `latest`) stay opt-in. +const UNSTABLE_CHANNELS = new Set(["dev", "beta", "local"]) +function unstableDefault(key: string) { + return truthy(key) || (!falsy(key) && UNSTABLE_CHANNELS.has(InstallationChannel)) +} + function number(key: string) { const value = process.env[key] if (!value) return undefined @@ -47,6 +55,9 @@ export const Flag = { KILO_DISABLE_CLAUDE_CODE_PROMPT: KILO_DISABLE_CLAUDE_CODE || truthy("KILO_DISABLE_CLAUDE_CODE_PROMPT"), KILO_DISABLE_CLAUDE_CODE_SKILLS, KILO_DISABLE_EXTERNAL_SKILLS: truthy("KILO_DISABLE_EXTERNAL_SKILLS"), // kilocode_change + // Default-on for dev/beta/local; opt-in for stable. Set + // KILO_EXPERIMENTAL_CUSTOMIZE_SKILL=false to force off, =true to force on. + KILO_EXPERIMENTAL_CUSTOMIZE_SKILL: unstableDefault("KILO_EXPERIMENTAL_CUSTOMIZE_SKILL"), KILO_FAKE_VCS: process.env["KILO_FAKE_VCS"], KILO_SERVER_PASSWORD: process.env["KILO_SERVER_PASSWORD"], KILO_SERVER_USERNAME: process.env["KILO_SERVER_USERNAME"], diff --git a/packages/opencode/src/util/schema.ts b/packages/core/src/schema.ts similarity index 100% rename from packages/opencode/src/util/schema.ts rename to packages/core/src/schema.ts diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index 6a2272ebf34..f0ebb5542cb 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.3.22" +version = "7.3.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.3.22/opencode-darwin-arm64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.3.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.3.22/opencode-darwin-x64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.3.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.3.22/opencode-linux-arm64.tar.gz" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.3.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.3.22/opencode-linux-x64.tar.gz" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.3.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.3.22/opencode-windows-x64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.3.33/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/http-recorder/package.json b/packages/http-recorder/package.json index 6c852c38d35..713c816cb1f 100644 --- a/packages/http-recorder/package.json +++ b/packages/http-recorder/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.3.22", + "version": "7.3.33", "name": "@opencode-ai/http-recorder", "type": "module", "license": "MIT", diff --git a/packages/kilo-console/package.json b/packages/kilo-console/package.json index 45539070c38..55a4728b42e 100644 --- a/packages/kilo-console/package.json +++ b/packages/kilo-console/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/kilo-console", - "version": "7.3.22", + "version": "7.3.33", "private": true, "type": "module", "scripts": { @@ -13,6 +13,7 @@ "dependencies": { "@kilocode/kilo-web-ui": "workspace:*", "@kilocode/sdk": "workspace:*", + "@lottiefiles/dotlottie-web": "0.74.0", "@opencode-ai/ui": "workspace:*", "@solidjs/router": "catalog:", "ghostty-web": "0.4.0", @@ -26,5 +27,6 @@ "typescript": "catalog:", "vite": "catalog:", "vite-plugin-solid": "catalog:" - } + }, + "peerDependencies": {} } diff --git a/packages/kilo-console/public/logo.lottie b/packages/kilo-console/public/logo.lottie new file mode 100644 index 00000000000..d16c02faf11 Binary files /dev/null and b/packages/kilo-console/public/logo.lottie differ diff --git a/packages/kilo-console/src/components/LoadingLogo.tsx b/packages/kilo-console/src/components/LoadingLogo.tsx new file mode 100644 index 00000000000..6e261e69fab --- /dev/null +++ b/packages/kilo-console/src/components/LoadingLogo.tsx @@ -0,0 +1,34 @@ +import { DotLottie } from "@lottiefiles/dotlottie-web" +import { onCleanup, onMount } from "solid-js" + +const src = `${import.meta.env.BASE_URL}logo.lottie` + +export function LoadingLogo(props: { class?: string }) { + let canvas: HTMLCanvasElement | undefined + + onMount(() => { + if (!canvas) return + + const motion = !window.matchMedia("(prefers-reduced-motion: reduce)").matches + const player = new DotLottie({ + autoplay: motion, + canvas, + loop: motion, + src, + renderConfig: { + autoResize: true, + }, + }) + + onCleanup(() => player.destroy()) + }) + + return ( + (canvas = node)} + class={`console-loading-logo${props.class ? ` ${props.class}` : ""}`} + role="img" + aria-label="Kilo loading animation" + /> + ) +} diff --git a/packages/kilo-console/src/components/LoadingScreen.tsx b/packages/kilo-console/src/components/LoadingScreen.tsx new file mode 100644 index 00000000000..e1ffc181d0f --- /dev/null +++ b/packages/kilo-console/src/components/LoadingScreen.tsx @@ -0,0 +1,20 @@ +import { LoadingLogo } from "./LoadingLogo" + +type Variant = "fullscreen" | "content" + +export function LoadingScreen(props: { variant: Variant }) { + return ( +
+ +
+ ) +} diff --git a/packages/kilo-console/src/layouts/ConfigLayout.tsx b/packages/kilo-console/src/layouts/ConfigLayout.tsx index 09ce8141bd8..8f779b93283 100644 --- a/packages/kilo-console/src/layouts/ConfigLayout.tsx +++ b/packages/kilo-console/src/layouts/ConfigLayout.tsx @@ -1,6 +1,7 @@ import { Show } from "solid-js" import type { JSX } from "solid-js" import { Card } from "@kilocode/kilo-web-ui/card" +import { LoadingScreen } from "../components/LoadingScreen" import { ConfigProvider } from "../context/ConfigProvider" import { useConfig } from "../context/config" import { ConfigSidebar } from "../routes/config/ConfigSidebar" @@ -43,9 +44,7 @@ function ConfigContent(props: { children?: JSX.Element }) { - + {props.children} diff --git a/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx b/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx index 294b1ca2e07..7f576e7fb60 100644 --- a/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx +++ b/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx @@ -2,6 +2,7 @@ import { A, useLocation, useParams } from "@solidjs/router" import { createEffect, createMemo, createResource, createSignal, For, onCleanup, Show } from "solid-js" import { Card } from "@kilocode/kilo-web-ui/card" import { Icon } from "@kilocode/kilo-web-ui/icon" +import { LoadingScreen } from "../../components/LoadingScreen" import { createProjectPty, createProjectWorktree, @@ -677,14 +678,10 @@ export function ProjectConsoleRoute() {
- + - +