mirror of
https://github.com/Kilo-Org/kilocode.git
synced 2026-09-21 05:52:35 +08:00
Merge branch 'main' into pie-parmesan
This commit is contained in:
@@ -29,7 +29,7 @@
|
||||
},
|
||||
"packages/app": {
|
||||
"name": "@opencode-ai/app",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@kilocode/kilo-i18n": "workspace:*",
|
||||
"@kilocode/kilo-ui": "workspace:*",
|
||||
@@ -85,7 +85,7 @@
|
||||
},
|
||||
"packages/desktop": {
|
||||
"name": "@opencode-ai/desktop",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@opencode-ai/app": "workspace:*",
|
||||
"@opencode-ai/ui": "workspace:*",
|
||||
@@ -118,7 +118,7 @@
|
||||
},
|
||||
"packages/desktop-electron": {
|
||||
"name": "@opencode-ai/desktop-electron",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@opencode-ai/app": "workspace:*",
|
||||
"@opencode-ai/ui": "workspace:*",
|
||||
@@ -150,7 +150,7 @@
|
||||
},
|
||||
"packages/kilo-docs": {
|
||||
"name": "@kilocode/kilo-docs",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@docsearch/css": "^4",
|
||||
"@docsearch/js": "^4",
|
||||
@@ -179,7 +179,7 @@
|
||||
},
|
||||
"packages/kilo-gateway": {
|
||||
"name": "@kilocode/kilo-gateway",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@ai-sdk/anthropic": "3.0.64",
|
||||
"@ai-sdk/openai": "3.0.48",
|
||||
@@ -214,7 +214,7 @@
|
||||
},
|
||||
"packages/kilo-i18n": {
|
||||
"name": "@kilocode/kilo-i18n",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"devDependencies": {
|
||||
"@tsconfig/node22": "catalog:",
|
||||
"@types/bun": "catalog:",
|
||||
@@ -227,7 +227,7 @@
|
||||
},
|
||||
"packages/kilo-telemetry": {
|
||||
"name": "@kilocode/kilo-telemetry",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@kilocode/kilo-gateway": "workspace:*",
|
||||
"@opentelemetry/api": "1.9.0",
|
||||
@@ -247,7 +247,7 @@
|
||||
},
|
||||
"packages/kilo-ui": {
|
||||
"name": "@kilocode/kilo-ui",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@kobalte/core": "0.13.11",
|
||||
"@opencode-ai/util": "workspace:*",
|
||||
@@ -282,7 +282,7 @@
|
||||
},
|
||||
"packages/kilo-vscode": {
|
||||
"name": "kilo-code",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@anthropic-ai/sdk": "^0.39.0",
|
||||
"@kilocode/kilo-i18n": "workspace:*",
|
||||
@@ -335,7 +335,7 @@
|
||||
},
|
||||
"packages/opencode": {
|
||||
"name": "@kilocode/cli",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"bin": {
|
||||
"kilo": "./bin/kilo",
|
||||
"kilocode": "./bin/kilo",
|
||||
@@ -475,7 +475,7 @@
|
||||
},
|
||||
"packages/plugin": {
|
||||
"name": "@kilocode/plugin",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@kilocode/sdk": "workspace:*",
|
||||
"zod": "catalog:",
|
||||
@@ -499,7 +499,7 @@
|
||||
},
|
||||
"packages/script": {
|
||||
"name": "@opencode-ai/script",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"semver": "^7.6.3",
|
||||
},
|
||||
@@ -510,7 +510,7 @@
|
||||
},
|
||||
"packages/sdk/js": {
|
||||
"name": "@kilocode/sdk",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"cross-spawn": "catalog:",
|
||||
},
|
||||
@@ -525,7 +525,7 @@
|
||||
},
|
||||
"packages/storybook": {
|
||||
"name": "@opencode-ai/storybook",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"devDependencies": {
|
||||
"@opencode-ai/ui": "workspace:*",
|
||||
"@solidjs/meta": "catalog:",
|
||||
@@ -548,7 +548,7 @@
|
||||
},
|
||||
"packages/ui": {
|
||||
"name": "@opencode-ai/ui",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"@kilocode/sdk": "workspace:*",
|
||||
"@kobalte/core": "catalog:",
|
||||
@@ -597,7 +597,7 @@
|
||||
},
|
||||
"packages/util": {
|
||||
"name": "@opencode-ai/util",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {
|
||||
"zod": "catalog:",
|
||||
},
|
||||
|
||||
+1
-1
@@ -134,6 +134,6 @@
|
||||
"@ai-sdk/provider-utils@4.0.21": "patches/@ai-sdk%2Fprovider-utils@4.0.21.patch",
|
||||
"@ai-sdk/anthropic@3.0.64": "patches/@ai-sdk%2Fanthropic@3.0.64.patch"
|
||||
},
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"peerDependencies": {}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@opencode-ai/app",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"description": "",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@opencode-ai/desktop-electron",
|
||||
"private": true,
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"homepage": "https://opencode.ai",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@opencode-ai/desktop",
|
||||
"private": true,
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
id = "kilo"
|
||||
name = "Kilo"
|
||||
description = "The open source coding agent."
|
||||
version = "1.3.17"
|
||||
version = "7.2.6"
|
||||
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/v1.3.17/opencode-darwin-arm64.zip"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.6/opencode-darwin-arm64.zip"
|
||||
cmd = "./opencode"
|
||||
args = ["acp"]
|
||||
|
||||
[agent_servers.opencode.targets.darwin-x86_64]
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v1.3.17/opencode-darwin-x64.zip"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.6/opencode-darwin-x64.zip"
|
||||
cmd = "./opencode"
|
||||
args = ["acp"]
|
||||
|
||||
[agent_servers.opencode.targets.linux-aarch64]
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v1.3.17/opencode-linux-arm64.tar.gz"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.6/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/v1.3.17/opencode-linux-x64.tar.gz"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.6/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/v1.3.17/opencode-windows-x64.zip"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.6/opencode-windows-x64.zip"
|
||||
cmd = "./opencode.exe"
|
||||
args = ["acp"]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@kilocode/kilo-docs",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev --webpack --port 3002",
|
||||
|
||||
@@ -23,6 +23,16 @@ Approvals are enforced locally on the execution host and sit on top of tool poli
|
||||
| `allowlist` | Allow only commands matching the allowlist |
|
||||
| `full` | Allow everything (equivalent to elevated mode) |
|
||||
|
||||
## Allow Everything from Settings
|
||||
|
||||
If you want to skip per-command approvals entirely, you can set the security policy to **Allow Everything** directly from the [KiloClaw Settings dashboard](https://app.kilo.ai/claw/settings). This applies the `full` policy globally, allowing your agent to execute any host command without prompts — equivalent to elevated mode.
|
||||
|
||||
{% callout type="warning" %}
|
||||
Enabling **Allow Everything** removes all exec safety checks. Only use this in trusted environments where you are comfortable with your agent running arbitrary commands.
|
||||
{% /callout %}
|
||||
|
||||
{% image src="/docs/img/kiloclaw/allow-everything-settings.png" alt="Allow Everything setting in KiloClaw Settings Dashboard" width="800" caption="The Allow Everything toggle in KiloClaw Settings" /%}
|
||||
|
||||
## Ask Behavior
|
||||
|
||||
The `ask` setting controls when the user is prompted for approval:
|
||||
|
||||
@@ -7,8 +7,10 @@ description: "Connect a dedicated Google account to KiloClaw for access to Gmail
|
||||
|
||||
Connect a dedicated Google account to KiloClaw so it can interact with Google Workspace services — Gmail, Calendar, Drive, Docs, Sheets, Slides, Tasks, People, Forms, Chat, Classroom, and Apps Script.
|
||||
|
||||
{% callout type="warning" title="Use a standalone Google account" %}
|
||||
We strongly recommend creating a **dedicated Google account** specifically for KiloClaw rather than connecting your personal Google account. This keeps your personal data separate and gives you full control over what KiloClaw can access. Throughout this guide, "the KiloClaw Google account" refers to this dedicated account.
|
||||
{% callout type="warning" title="Use a dedicated Google account" %}
|
||||
We recommend creating a **dedicated Google account** for KiloClaw. This keeps your personal data separate and gives you full control over what KiloClaw can access.
|
||||
|
||||
If you are using Google Workspace, we recommend creating the bot account inside the Google Workspace.
|
||||
{% /callout %}
|
||||
|
||||
## What You Get
|
||||
|
||||
@@ -46,6 +46,12 @@ Before configuring, take these preflight steps:
|
||||
|
||||
1. **Create a Google Account for your Claw** — Go to [google.com](https://www.google.com/) and create a new Google/Gmail account dedicated to your KiloClaw. Something like `yourname.bot@gmail.com` works well.
|
||||
|
||||
{% callout type="tip" title="Google Workspace users" %}
|
||||
If your organization uses Google Workspace, create the dedicated bot account inside your Workspace domain (e.g., `claw@yourcompany.com`) rather than as a standalone `@gmail.com` account.
|
||||
|
||||
A Workspace-managed account benefits from your organization's admin policies, making configuration easier.
|
||||
{% /callout %}
|
||||
|
||||
2. **Set up Google Cloud** — Visit [console.cloud.google.com](https://console.cloud.google.com). Accept the terms of service and click "Start my free tier". You may need to add a credit card for identity verification.
|
||||
|
||||
{% callout type="info" %}
|
||||
|
||||
@@ -1,171 +0,0 @@
|
||||
---
|
||||
title: "Setup walkthrough"
|
||||
description: "Start-to-finish guide for configuring your KiloClaw instance"
|
||||
---
|
||||
|
||||
# Setup walkthrough
|
||||
|
||||
This guide walks you through a full KiloClaw setup — from creating accounts to scheduling your first automated workflow. Plan for about 60 minutes.
|
||||
|
||||
---
|
||||
|
||||
## Planning your setup
|
||||
|
||||
For most users, a useful KiloClaw configuration involves:
|
||||
|
||||
1. A **chat platform** (called a "channel" in OpenClaw) so you can message your Claw
|
||||
2. **Google services** for email, calendar, and Drive
|
||||
3. **GitHub** for code and markdown syncing
|
||||
|
||||
### Use dedicated accounts for your Claw
|
||||
|
||||
We recommend creating **separate accounts** for your KiloClaw rather than connecting it to your personal accounts. This applies to Google, GitHub, and any other services you connect. A dedicated account improves isolation — your personal data stays separate, and you can control exactly what access the Claw has by sharing or delegating only what you want.
|
||||
|
||||
### Chat platform options
|
||||
|
||||
- **[Kilo Chat](https://app.kilo.ai)** — available in the web app and coming soon to iOS and Android; requires zero configuration
|
||||
- **[Telegram](/docs/kiloclaw/chat-platforms/telegram)** — easy to set up, private by default
|
||||
- **[Discord](/docs/kiloclaw/chat-platforms/discord)** — moderate setup
|
||||
- **[Slack](/docs/kiloclaw/chat-platforms/slack)** — most involved setup
|
||||
|
||||
{% callout type="warning" title="Chain-of-connection security" %}
|
||||
If your Claw has access to sensitive data (like your email), be careful which chat platform you connect it to. On broadly-accessible platforms like Slack or Discord, anyone on the server could potentially message your Claw and access that data. If you're connecting sensitive integrations, use a private platform like Kilo Chat or Telegram.
|
||||
{% /callout %}
|
||||
|
||||
The steps below walk you through this configuration.
|
||||
|
||||
---
|
||||
|
||||
## Preflight Steps
|
||||
|
||||
Take these steps before configuring your Claw.
|
||||
|
||||
If you are doing a [1-1 configuration call with Kilo](https://kilo.ai/kiloclaw/config-service), please complete these steps before the call.
|
||||
|
||||
### Google
|
||||
|
||||
Configuring Google services is by far the most involved part of setting up your Claw.
|
||||
|
||||
Before configuring, take these preflight steps:
|
||||
|
||||
1. **Create a Google Account for your Claw** — Go to [google.com](https://www.google.com/) and create a new Google/Gmail account dedicated to your KiloClaw. Something like `yourname.bot@gmail.com` works well.
|
||||
|
||||
2. **Set up Google Cloud** — Visit [console.cloud.google.com](https://console.cloud.google.com). Accept the terms of service and click "Start my free tier". You may need to add a credit card for identity verification.
|
||||
|
||||
{% callout type="info" %}
|
||||
Nothing KiloClaw does costs any money with Google.
|
||||
{% /callout %}
|
||||
|
||||
3. **Install Docker** — KiloClaw configures Google by running a Docker container on your machine. Download Docker at [docker.com](https://www.docker.com/), then open it. You don't need to sign in or create a Docker account.
|
||||
|
||||
## Other Services
|
||||
|
||||
1. **Create a GitHub account for your Claw** — Using your new Gmail address, create a matching GitHub account for your Claw.
|
||||
|
||||
---
|
||||
|
||||
## Set up a messaging platform
|
||||
|
||||
Your Claw needs a way to communicate with you. **[Kilo Chat](https://app.kilo.ai)** requires no setup — just open the web app. For other platforms, follow the relevant guide:
|
||||
|
||||
- [Telegram](/docs/kiloclaw/chat-platforms/telegram) — about 2 minutes
|
||||
- [Discord](/docs/kiloclaw/chat-platforms/discord) — about 10 minutes
|
||||
- [Slack](/docs/kiloclaw/chat-platforms/slack) — about 15 minutes; always use the manifest
|
||||
|
||||
{% callout type="tip" %}
|
||||
If you're not sure which to pick, Kilo Chat (no setup) or Telegram (2 minutes) are the easiest options.
|
||||
{% /callout %}
|
||||
|
||||
---
|
||||
|
||||
## Set up Google OAuth
|
||||
|
||||
This lets your Claw act as the bot Google account — sending email, reading calendar, and more. Takes about 15 minutes.
|
||||
|
||||
Prerequisites: Docker is installed and running, and your bot Google account is already created.
|
||||
|
||||
1. In the KiloClaw dashboard, go to **Settings → Google Account** and copy the Docker command shown.
|
||||
2. Open a terminal and run the command.
|
||||
3. Follow the steps in the console:
|
||||
- At each step, confirm you're logged in to the bot account (check the top-right corner of the screen).
|
||||
- After project creation, confirm you're in the correct project.
|
||||
- The last step may look like it failed — this is expected.
|
||||
|
||||
For full details, see the [Google setup guide](/docs/kiloclaw/development-tools/google).
|
||||
|
||||
---
|
||||
|
||||
## Set up GitHub
|
||||
|
||||
A dedicated bot GitHub account is strongly recommended. Takes about 7 minutes.
|
||||
|
||||
**Create a Personal Access Token (PAT):**
|
||||
|
||||
1. In GitHub, go to **Settings → Developer Settings → Personal Access Tokens → Classic → Generate new token**.
|
||||
2. Select these scopes: `repo`, `workflow`, `write:org`, `read:user`.
|
||||
|
||||
For full details, see the [GitHub setup guide](/docs/kiloclaw/development-tools/github).
|
||||
|
||||
**Set up a private workspace repo:**
|
||||
|
||||
Once GitHub is connected, ask your Claw to back up its workspace:
|
||||
|
||||
```
|
||||
Use your GitHub access to back up your workspace. Make it a GitHub repo and push it as a private repo. Add me as a member so I can see it. Then set up a cron job to pull, rebase, and push any changes at least once an hour.
|
||||
```
|
||||
|
||||
After sending that, redeploy from the dashboard to pick up the changes.
|
||||
|
||||
---
|
||||
|
||||
## Grant email and calendar access
|
||||
|
||||
After OAuth is set up, decide how much access to give your Claw to your personal accounts.
|
||||
|
||||
| Option | What it does | Best for | Configured from |
|
||||
| ----------------------- | --------------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------- |
|
||||
| Forward select emails | A Gmail filter forwards specific senders or labels to the bot account | Targeted use cases like newsletter digests | Your personal account |
|
||||
| Forward all email | Forwards your full inbox to the bot | Simpler setups where noise is acceptable | Bot account (destination) |
|
||||
| Full account delegation | Gives the bot direct read/write access to your personal account | Maximum capability | Your personal account — Gmail Settings → Add a delegate |
|
||||
|
||||
{% callout type="info" %}
|
||||
Email forwarding is configured from the **destination** (bot) account. Account delegation is configured from the **source** (personal) account.
|
||||
{% /callout %}
|
||||
|
||||
**Push notifications:** by default, your Claw wakes up on every incoming email. If you'd prefer a digest (e.g., once at 7am), disable push notifications in **Settings → Google Account** on the [dashboard](/docs/kiloclaw/dashboard) — otherwise it processes each email as it arrives.
|
||||
|
||||
**Google Calendar:** share your personal calendar from your personal Google account. Go to **Google Calendar → Settings → Settings for my calendars → [your calendar] → Share with specific people**, and add the bot account.
|
||||
|
||||
---
|
||||
|
||||
## Enable auto-approval
|
||||
|
||||
By default, KiloClaw asks for confirmation before every tool call. To let it act freely, go to the [KiloClaw dashboard](https://app.kilo.ai/claw) and enable auto-approval in the **Default Permissions** section.
|
||||
|
||||
---
|
||||
|
||||
## Prompt and schedule work
|
||||
|
||||
**How to prompt your Claw:** just tell it in plain language what you want. Be specific. If you want it to remember something across sessions, tell it to write it down in a specific file.
|
||||
|
||||
**Scheduling jobs:** tell your Claw when and what to do — for example:
|
||||
|
||||
```
|
||||
Every day at 7am, summarize my emails and send me a digest.
|
||||
```
|
||||
|
||||
Mentioning "cron job" helps it understand you want a recurring scheduled task.
|
||||
|
||||
**Skills:** the OpenClaw Skills hub has pre-built capabilities you can add. The easiest way to install a skill is to just ask your Claw by name:
|
||||
|
||||
```
|
||||
Install the [skill name] skill.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Manage inference
|
||||
|
||||
**Model picker:** Balanced is a good starting point. Frontier is more capable but significantly more expensive.
|
||||
|
||||
You can also use your KiloPass credits — find this under **Profile** in the dashboard.
|
||||
@@ -825,4 +825,14 @@ module.exports = [
|
||||
basePath: false,
|
||||
permanent: true,
|
||||
},
|
||||
|
||||
// ============================================
|
||||
// KILOCLAW
|
||||
// ============================================
|
||||
{
|
||||
source: "/docs/kiloclaw/suggested-configuration",
|
||||
destination: "/docs/kiloclaw/end-to-end",
|
||||
basePath: false,
|
||||
permanent: true,
|
||||
},
|
||||
]
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 141 KiB |
@@ -1,7 +1,7 @@
|
||||
# Source Code Links
|
||||
|
||||
<!-- Auto-generated by script/extract-source-links.ts — DO NOT EDIT -->
|
||||
<!-- 77 unique URLs extracted from extension and CLI source -->
|
||||
<!-- 78 unique URLs extracted from extension and CLI source -->
|
||||
|
||||
- <https://api.apertis.ai/v1>
|
||||
<!-- packages/opencode/src/provider/model-cache.ts -->
|
||||
@@ -55,6 +55,8 @@
|
||||
<!-- packages/kilo-vscode/webview-ui/src/components/settings/AboutKiloCodeTab.tsx -->
|
||||
- <https://github.com/Kilo-Org/kilocode/issues/6986>
|
||||
<!-- packages/kilo-vscode/src/agent-manager/constants.ts -->
|
||||
- <https://github.com/Kilo-Org/kilocode/issues/new?template=bug-report.yml>
|
||||
<!-- packages/opencode/src/cli/cmd/tui/app.tsx -->
|
||||
- <https://github.com/Kilo-Org/kilocode/issues/new/choose>
|
||||
<!-- packages/kilo-vscode/webview-ui/src/components/chat/FeedbackDialog.tsx -->
|
||||
- <https://github.com/microsoft/vscode-eslint/archive/refs/heads/main.zip>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/kilo-gateway",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"description": "Unified Kilo Gateway package for OpenCode - authentication, provider, and API integration",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/kilo-i18n",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"description": "Kilo-specific i18n translations and overrides",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/kilo-telemetry",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"description": "Telemetry for Kilo CLI - PostHog analytics integration",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@kilocode/kilo-ui",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"exports": {
|
||||
|
||||
@@ -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.2.5",
|
||||
"version": "7.2.6",
|
||||
"icon": "assets/icons/logo-outline-black.png",
|
||||
"galleryBanner": {
|
||||
"color": "#FFFFFF",
|
||||
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b57a543bd799f92b35d2c6037a4ffc932a37f59790213006a021bebef9e94b38
|
||||
size 6897
|
||||
@@ -3016,10 +3016,11 @@ const AgentManagerContent: Component = () => {
|
||||
onClose={() => setSidePanel(null)}
|
||||
onExpand={selection() !== null ? openReviewTab : undefined}
|
||||
onRequestDiff={requestDiffFile}
|
||||
onOpenFile={(file) => {
|
||||
onOpenFile={(file, line) => {
|
||||
const id = currentDiffSessionId()
|
||||
if (id) vscode.postMessage({ type: "agentManager.openFile", sessionId: id, filePath: file })
|
||||
else if (selection() === LOCAL) vscode.postMessage({ type: "openFile", filePath: file })
|
||||
if (id)
|
||||
vscode.postMessage({ type: "agentManager.openFile", sessionId: id, filePath: file, line })
|
||||
else if (selection() === LOCAL) vscode.postMessage({ type: "openFile", filePath: file, line })
|
||||
}}
|
||||
onRevertFile={revertCtl.revert}
|
||||
revertingFiles={revertCtl.reverting()}
|
||||
@@ -3044,10 +3045,10 @@ const AgentManagerContent: Component = () => {
|
||||
diffStyle={reviewDiffStyle()}
|
||||
onDiffStyleChange={setSharedDiffStyle}
|
||||
onRequestDiff={requestDiffFile}
|
||||
onOpenFile={(file) => {
|
||||
onOpenFile={(file, line) => {
|
||||
const id = currentDiffSessionId()
|
||||
if (id) vscode.postMessage({ type: "agentManager.openFile", sessionId: id, filePath: file })
|
||||
else if (selection() === LOCAL) vscode.postMessage({ type: "openFile", filePath: file })
|
||||
if (id) vscode.postMessage({ type: "agentManager.openFile", sessionId: id, filePath: file, line })
|
||||
else if (selection() === LOCAL) vscode.postMessage({ type: "openFile", filePath: file, line })
|
||||
}}
|
||||
onRevertFile={revertCtl.revert}
|
||||
revertingFiles={revertCtl.reverting()}
|
||||
|
||||
@@ -40,7 +40,7 @@ interface DiffPanelProps {
|
||||
onClose: () => void
|
||||
onExpand?: () => void
|
||||
onRequestDiff?: (file: string) => void
|
||||
onOpenFile?: (relativePath: string) => void
|
||||
onOpenFile?: (relativePath: string, line?: number) => void
|
||||
onRevertFile?: (file: string) => void
|
||||
revertingFiles?: Set<string>
|
||||
}
|
||||
@@ -520,6 +520,10 @@ export const DiffPanel: Component<DiffPanelProps> = (props) => {
|
||||
renderAnnotation={buildAnnotation}
|
||||
enableGutterUtility={true}
|
||||
onGutterUtilityClick={(result) => handleGutterClick(diff.file, result)}
|
||||
onLineNumberClick={(event) => {
|
||||
if (event.annotationSide === "deletions") return
|
||||
props.onOpenFile?.(diff.file, event.lineNumber)
|
||||
}}
|
||||
/>
|
||||
</Show>
|
||||
</Show>
|
||||
|
||||
@@ -40,7 +40,7 @@ interface FullScreenDiffViewProps {
|
||||
diffStyle: DiffStyle
|
||||
onDiffStyleChange: (style: DiffStyle) => void
|
||||
onRequestDiff?: (file: string) => void
|
||||
onOpenFile?: (relativePath: string) => void
|
||||
onOpenFile?: (relativePath: string, line?: number) => void
|
||||
onRevertFile?: (file: string) => void
|
||||
revertingFiles?: Set<string>
|
||||
onClose: () => void
|
||||
@@ -596,6 +596,10 @@ export const FullScreenDiffView: Component<FullScreenDiffViewProps> = (props) =>
|
||||
renderAnnotation={buildAnnotation}
|
||||
enableGutterUtility={true}
|
||||
onGutterUtilityClick={(result) => handleGutterClick(diff.file, result)}
|
||||
onLineNumberClick={(event) => {
|
||||
if (event.annotationSide === "deletions") return
|
||||
props.onOpenFile?.(diff.file, event.lineNumber)
|
||||
}}
|
||||
/>
|
||||
</Show>
|
||||
</Show>
|
||||
|
||||
@@ -130,6 +130,7 @@ export const ChatView: Component<ChatViewProps> = (props) => {
|
||||
onSelectSession={props.onSelectSession}
|
||||
onShowHistory={props.onShowHistory}
|
||||
questions={standaloneQuestions}
|
||||
readonly={props.readonly}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -44,6 +44,8 @@ interface MessageListProps {
|
||||
onShowHistory?: () => void
|
||||
/** Non-tool question requests to render inline at the bottom of the message list */
|
||||
questions?: () => QuestionRequest[]
|
||||
/** When true (subagent viewer), replace the welcome screen with an initializing indicator */
|
||||
readonly?: boolean
|
||||
}
|
||||
|
||||
export const MessageList: Component<MessageListProps> = (props) => {
|
||||
@@ -114,7 +116,12 @@ export const MessageList: Component<MessageListProps> = (props) => {
|
||||
<span>{language.t("session.messages.loading")}</span>
|
||||
</div>
|
||||
</Show>
|
||||
<Show when={isEmpty()}>
|
||||
<Show when={isEmpty() && props.readonly}>
|
||||
<div class="message-list-empty">
|
||||
<p class="kilo-about-text">{language.t("session.messages.initializing")}</p>
|
||||
</div>
|
||||
</Show>
|
||||
<Show when={isEmpty() && !props.readonly}>
|
||||
<div class="message-list-empty">
|
||||
<KiloLogo />
|
||||
<p class="kilo-about-text">{language.t("session.messages.welcome")}</p>
|
||||
|
||||
@@ -13,6 +13,7 @@ import { BasicTool } from "@kilocode/kilo-ui/basic-tool"
|
||||
import { Icon } from "@kilocode/kilo-ui/icon"
|
||||
import { IconButton } from "@kilocode/kilo-ui/icon-button"
|
||||
import { useData } from "@kilocode/kilo-ui/context/data"
|
||||
import { useLanguage } from "../../context/language"
|
||||
import { useI18n } from "@kilocode/kilo-ui/context/i18n"
|
||||
import { createAutoScroll } from "@kilocode/kilo-ui/hooks"
|
||||
import { useSession } from "../../context/session"
|
||||
@@ -39,6 +40,7 @@ function getSessionToolParts(store: ReturnType<typeof useData>["store"], session
|
||||
const TaskToolRenderer: Component<ToolProps> = (props) => {
|
||||
const data = useData()
|
||||
const i18n = useI18n()
|
||||
const language = useLanguage()
|
||||
const session = useSession()
|
||||
const vscode = useVSCode()
|
||||
|
||||
@@ -117,6 +119,11 @@ const TaskToolRenderer: Component<ToolProps> = (props) => {
|
||||
<BasicTool icon="task" status={props.status} trigger={trigger()} defaultOpen>
|
||||
<div ref={autoScroll.scrollRef} onScroll={autoScroll.handleScroll} data-component="tool-output" data-scrollable>
|
||||
<div ref={autoScroll.contentRef} data-component="task-tools">
|
||||
<Show when={running() && childToolParts().length === 0}>
|
||||
<div data-slot="task-tool-item" data-state="starting">
|
||||
<span data-slot="task-tool-title">{language.t("session.messages.taskStarting")}</span>
|
||||
</div>
|
||||
</Show>
|
||||
<For each={childToolParts()}>
|
||||
{(item) => {
|
||||
const info = createMemo(() => getToolInfo(item.tool, item.state?.input))
|
||||
|
||||
@@ -196,7 +196,7 @@ export const VscodeSessionTurn: Component<VscodeSessionTurnProps> = (props) => {
|
||||
<Collapsible.Trigger>
|
||||
<div data-component="session-turn-diffs-trigger">
|
||||
<div data-slot="session-turn-diffs-title">
|
||||
<span data-slot="session-turn-diffs-label">{i18n.t("ui.sessionReview.change.modified")}</span>
|
||||
<span data-slot="session-turn-diffs-label">{i18n.t("ui.sessionReview.change.modified")}</span>{" "}
|
||||
<span data-slot="session-turn-diffs-count">
|
||||
{diffs().length} {i18n.t(diffs().length === 1 ? "ui.common.file.one" : "ui.common.file.other")}
|
||||
</span>
|
||||
|
||||
+2
@@ -930,6 +930,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code هو مساعد ترميز بالذكاء الاصطناعي. اطلب منه بناء ميزات أو إصلاح أخطاء أو شرح قاعدة الشيفرة.",
|
||||
"session.messages.scrollToBottom": "التمرير إلى الأسفل",
|
||||
"session.messages.initializing": "جاري التهيئة...",
|
||||
"session.messages.taskStarting": "جاري البدء...",
|
||||
"session.status.writingResponse": "...جارٍ كتابة الرد",
|
||||
"session.status.retry": "جارٍ إعادة المحاولة…",
|
||||
"session.status.retrying": "...إعادة المحاولة (المحاولة {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -938,6 +938,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code é um assistente de programação com IA. Peça para criar funcionalidades, corrigir bugs ou explicar sua base de código.",
|
||||
"session.messages.scrollToBottom": "Rolar para o final",
|
||||
"session.messages.initializing": "O teraouiñ...",
|
||||
"session.messages.taskStarting": "O kregiñ...",
|
||||
"session.status.writingResponse": "Escrevendo resposta…",
|
||||
"session.status.retry": "Tentando novamente…",
|
||||
"session.status.retrying": "Tentando novamente (tentativa {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -943,6 +943,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code je AI asistent za programiranje. Zatražite da gradi funkcionalnosti, ispravlja greške ili objasni vašu bazu koda.",
|
||||
"session.messages.scrollToBottom": "Pomakni se na dno",
|
||||
"session.messages.initializing": "Inicijalizacija...",
|
||||
"session.messages.taskStarting": "Pokretanje...",
|
||||
"session.status.writingResponse": "Pisanje odgovora…",
|
||||
"session.status.retry": "Ponovni pokušaj…",
|
||||
"session.status.retrying": "Ponovni pokušaj (pokušaj {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -936,6 +936,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code er en AI-kodningsassistent. Bed den om at bygge funktioner, rette fejl eller forklare din kodebase.",
|
||||
"session.messages.scrollToBottom": "Rul til bunden",
|
||||
"session.messages.initializing": "Initialiserer...",
|
||||
"session.messages.taskStarting": "Starter...",
|
||||
"session.status.writingResponse": "Skriver svar…",
|
||||
"session.status.retry": "Prøver igen…",
|
||||
"session.status.retrying": "Prøver igen (forsøg {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -948,6 +948,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code ist ein KI-Programmierassistent. Bitten Sie ihn, Funktionen zu erstellen, Fehler zu beheben oder Ihre Codebasis zu erklären.",
|
||||
"session.messages.scrollToBottom": "Nach unten scrollen",
|
||||
"session.messages.initializing": "Initialisierung...",
|
||||
"session.messages.taskStarting": "Wird gestartet...",
|
||||
"session.status.writingResponse": "Antwort wird geschrieben…",
|
||||
"session.status.retry": "Erneuter Versuch…",
|
||||
"session.status.retrying": "Erneuter Versuch ({{ attempt }})… {{ message }}",
|
||||
|
||||
@@ -936,6 +936,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code is an AI coding assistant. Ask it to build features, fix bugs, or explain your codebase.",
|
||||
"session.messages.scrollToBottom": "Scroll to bottom",
|
||||
"session.messages.initializing": "Initializing...",
|
||||
"session.messages.taskStarting": "Starting...",
|
||||
"session.status.writingResponse": "Writing response...",
|
||||
"session.status.retry": "Retrying…",
|
||||
"session.status.retrying": "Retrying (attempt {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -944,6 +944,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code es un asistente de programación con IA. Pídele que cree funcionalidades, corrija errores o explique tu código.",
|
||||
"session.messages.scrollToBottom": "Desplazar al final",
|
||||
"session.messages.initializing": "Inicializando...",
|
||||
"session.messages.taskStarting": "Iniciando...",
|
||||
"session.status.writingResponse": "Escribiendo respuesta…",
|
||||
"session.status.retry": "Reintentando…",
|
||||
"session.status.retrying": "Reintentando (intento {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -950,6 +950,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code est un assistant de programmation IA. Demandez-lui de créer des fonctionnalités, corriger des bugs ou expliquer votre code.",
|
||||
"session.messages.scrollToBottom": "Défiler vers le bas",
|
||||
"session.messages.initializing": "Initialisation...",
|
||||
"session.messages.taskStarting": "Démarrage...",
|
||||
"session.status.writingResponse": "Rédaction de la réponse…",
|
||||
"session.status.retry": "Nouvelle tentative…",
|
||||
"session.status.retrying": "Nouvelle tentative (essai {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -935,6 +935,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo CodeはAIコーディングアシスタントです。機能の構築、バグの修正、コードベースの説明を依頼できます。",
|
||||
"session.messages.scrollToBottom": "下にスクロール",
|
||||
"session.messages.initializing": "初期化中...",
|
||||
"session.messages.taskStarting": "開始中...",
|
||||
"session.status.writingResponse": "応答を作成中…",
|
||||
"session.status.retry": "再試行中…",
|
||||
"session.status.retrying": "再試行中({{ attempt }}回目)… {{ message }}",
|
||||
|
||||
+2
@@ -935,6 +935,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code는 AI 코딩 어시스턴트입니다. 기능 구축, 버그 수정 또는 코드베이스 설명을 요청하세요.",
|
||||
"session.messages.scrollToBottom": "하단으로 스크롤",
|
||||
"session.messages.initializing": "초기화 중...",
|
||||
"session.messages.taskStarting": "시작 중...",
|
||||
"session.status.writingResponse": "응답 작성 중...",
|
||||
"session.status.retry": "재시도 중…",
|
||||
"session.status.retrying": "재시도 중 ({{ attempt }}번째 시도)… {{ message }}",
|
||||
|
||||
+2
@@ -937,6 +937,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code is een AI-codeerassistent. Vraag het om features te bouwen, bugs op te lossen of je codebase uit te leggen.",
|
||||
"session.messages.scrollToBottom": "Scroll naar beneden",
|
||||
"session.messages.initializing": "Initialiseren...",
|
||||
"session.messages.taskStarting": "Starten...",
|
||||
"session.status.writingResponse": "Antwoord schrijven...",
|
||||
"session.status.retry": "Opnieuw proberen...",
|
||||
"session.status.retrying": "Opnieuw proberen (poging {{ attempt }})... {{ message }}",
|
||||
|
||||
+2
@@ -940,6 +940,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code er en AI-kodingsassistent. Be den om å bygge funksjoner, fikse feil eller forklare kodebasen din.",
|
||||
"session.messages.scrollToBottom": "Rull til bunnen",
|
||||
"session.messages.initializing": "Initialiserer...",
|
||||
"session.messages.taskStarting": "Starter...",
|
||||
"session.status.writingResponse": "Skriver svar…",
|
||||
"session.status.retry": "Prøver på nytt…",
|
||||
"session.status.retrying": "Prøver på nytt (forsøk {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -940,6 +940,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code to asystent programowania AI. Poproś go o tworzenie funkcji, naprawę błędów lub wyjaśnienie bazy kodu.",
|
||||
"session.messages.scrollToBottom": "Przewiń na dół",
|
||||
"session.messages.initializing": "Inicjalizacja...",
|
||||
"session.messages.taskStarting": "Uruchamianie...",
|
||||
"session.status.writingResponse": "Pisanie odpowiedzi…",
|
||||
"session.status.retry": "Ponawianie…",
|
||||
"session.status.retrying": "Ponawiam próbę ({{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -943,6 +943,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code — это AI-помощник для программирования. Попросите его создать функции, исправить ошибки или объяснить вашу кодовую базу.",
|
||||
"session.messages.scrollToBottom": "Прокрутить вниз",
|
||||
"session.messages.initializing": "Инициализация...",
|
||||
"session.messages.taskStarting": "Запуск...",
|
||||
"session.status.writingResponse": "Пишу ответ…",
|
||||
"session.status.retry": "Повторная попытка…",
|
||||
"session.status.retrying": "Повторная попытка ({{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -931,6 +931,8 @@ export const dict = {
|
||||
"session.messages.empty": "เริ่มการสนทนาโดยพิมพ์ข้อความด้านล่าง",
|
||||
"session.messages.welcome": "Kilo Code เป็นผู้ช่วยเขียนโค้ด AI ขอให้สร้างฟีเจอร์ แก้ไขบัก หรืออธิบายโค้ดเบสของคุณ",
|
||||
"session.messages.scrollToBottom": "เลื่อนไปด้านล่าง",
|
||||
"session.messages.initializing": "กำลังเริ่มต้น...",
|
||||
"session.messages.taskStarting": "กำลังเริ่มทำงาน...",
|
||||
"session.status.writingResponse": "กำลังเขียนคำตอบ...",
|
||||
"session.status.retry": "กำลังลองใหม่…",
|
||||
"session.status.retrying": "กำลังลองใหม่ (ครั้งที่ {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -939,6 +939,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code bir yapay zeka kodlama asistanıdır. Özellik geliştirmesini, hata düzeltmesini veya kod tabanınızı açıklamasını isteyin.",
|
||||
"session.messages.scrollToBottom": "En alta kaydır",
|
||||
"session.messages.initializing": "Başlatılıyor...",
|
||||
"session.messages.taskStarting": "Başlıyor...",
|
||||
"session.status.writingResponse": "Yanıt yazılıyor...",
|
||||
"session.status.retry": "Yeniden deneniyor…",
|
||||
"session.status.retrying": "Yeniden deneniyor (deneme {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -940,6 +940,8 @@ export const dict = {
|
||||
"session.messages.welcome":
|
||||
"Kilo Code — це асистент з кодування на базі ШІ. Попросіть його розробити функцію, виправити помилку або пояснити вашу кодову базу.",
|
||||
"session.messages.scrollToBottom": "Прокрутити до низу",
|
||||
"session.messages.initializing": "Ініціалізація...",
|
||||
"session.messages.taskStarting": "Запуск...",
|
||||
"session.status.writingResponse": "Пишу відповідь...",
|
||||
"session.status.retry": "Повторна спроба…",
|
||||
"session.status.retrying": "Повторна спроба (спроба {{ attempt }})… {{ message }}",
|
||||
|
||||
+2
@@ -923,6 +923,8 @@ export const dict = {
|
||||
"session.messages.empty": "在下方输入消息以开始对话。",
|
||||
"session.messages.welcome": "Kilo Code 是一个 AI 编程助手。让它帮你构建功能、修复 bug 或解释代码库。",
|
||||
"session.messages.scrollToBottom": "滚动到底部",
|
||||
"session.messages.initializing": "初始化中...",
|
||||
"session.messages.taskStarting": "启动中...",
|
||||
"session.status.writingResponse": "正在撰写回复…",
|
||||
"session.status.retry": "正在重试…",
|
||||
"session.status.retrying": "正在重试(第 {{ attempt }} 次)… {{ message }}",
|
||||
|
||||
+2
@@ -925,6 +925,8 @@ export const dict = {
|
||||
"session.messages.empty": "在下方輸入訊息以開始對話。",
|
||||
"session.messages.welcome": "Kilo Code 是一個 AI 程式設計助手。讓它幫你建構功能、修復 bug 或解釋程式碼庫。",
|
||||
"session.messages.scrollToBottom": "捲動至底部",
|
||||
"session.messages.initializing": "初始化中...",
|
||||
"session.messages.taskStarting": "啟動中...",
|
||||
"session.status.writingResponse": "正在撰寫回覆…",
|
||||
"session.status.retry": "正在重試…",
|
||||
"session.status.retrying": "正在重試(第 {{ attempt }} 次)… {{ message }}",
|
||||
|
||||
@@ -11,10 +11,12 @@ import type { Meta, StoryObj } from "storybook-solidjs-vite"
|
||||
import type { AssistantMessage as SDKAssistantMessage, TextPart, ToolPart } from "@kilocode/sdk/v2"
|
||||
import { StoryProviders, defaultMockData, mockSessionValue } from "./StoryProviders"
|
||||
import { AssistantMessage } from "../components/chat/AssistantMessage"
|
||||
import { VscodeSessionTurn } from "../components/chat/VscodeSessionTurn"
|
||||
import { ChatView } from "../components/chat/ChatView"
|
||||
import { Part } from "@kilocode/kilo-ui/message-part"
|
||||
import { registerVscodeToolOverrides } from "../components/chat/VscodeToolOverrides"
|
||||
import { SessionContext } from "../context/session"
|
||||
import { ServerContext } from "../context/server"
|
||||
import type { PermissionRequest, QuestionRequest } from "../types/messages"
|
||||
|
||||
// Register VS Code tool overrides (bash expanded by default, etc.)
|
||||
@@ -977,3 +979,72 @@ export const McpToolExpanded: Story = {
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 19. Diff summary — "Modified N files" collapsed header
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const USER_MSG_ID = "user-msg-diff-001"
|
||||
|
||||
const mockDiffs = [
|
||||
{ file: "src/components/App.tsx", before: "", after: "", additions: 12, deletions: 3, status: "modified" as const },
|
||||
{ file: "src/utils/helpers.ts", before: "", after: "", additions: 5, deletions: 8, status: "modified" as const },
|
||||
{ file: "src/styles/main.css", before: "", after: "", additions: 20, deletions: 0, status: "added" as const },
|
||||
]
|
||||
|
||||
export const DiffSummaryCollapsed: Story = {
|
||||
name: "Diff Summary — Modified N files (collapsed)",
|
||||
render: () => {
|
||||
const data = {
|
||||
...defaultMockData,
|
||||
message: {
|
||||
[SESSION_ID]: [
|
||||
{
|
||||
id: USER_MSG_ID,
|
||||
sessionID: SESSION_ID,
|
||||
role: "user",
|
||||
time: { created: now - 10000 },
|
||||
summary: { diffs: mockDiffs },
|
||||
},
|
||||
{ ...baseAssistantMessage, parentID: USER_MSG_ID },
|
||||
],
|
||||
},
|
||||
part: {
|
||||
[USER_MSG_ID]: [
|
||||
{ id: "part-user-text", sessionID: SESSION_ID, messageID: USER_MSG_ID, type: "text", text: "Fix the bug" },
|
||||
],
|
||||
[ASST_MSG_ID]: [textPart],
|
||||
},
|
||||
}
|
||||
const session = {
|
||||
...mockSessionValue({ id: SESSION_ID, status: "idle" }),
|
||||
messages: () => data.message[SESSION_ID],
|
||||
}
|
||||
const server = {
|
||||
connectionState: () => "connected" as const,
|
||||
serverInfo: () => undefined,
|
||||
extensionVersion: () => "1.0.0",
|
||||
errorMessage: () => undefined,
|
||||
errorDetails: () => undefined,
|
||||
isConnected: () => true,
|
||||
profileData: () => null,
|
||||
deviceAuth: () => ({ status: "idle" as const }),
|
||||
startLogin: () => {},
|
||||
vscodeLanguage: () => "en",
|
||||
languageOverride: () => undefined,
|
||||
workspaceDirectory: () => "/project",
|
||||
gitInstalled: () => true,
|
||||
}
|
||||
return (
|
||||
<StoryProviders data={data} sessionID={SESSION_ID} status="idle" noPadding>
|
||||
<ServerContext.Provider value={server as any}>
|
||||
<SessionContext.Provider value={session as any}>
|
||||
<div style={{ width: "380px", padding: "12px" }}>
|
||||
<VscodeSessionTurn sessionID={SESSION_ID} messageID={USER_MSG_ID} />
|
||||
</div>
|
||||
</SessionContext.Provider>
|
||||
</ServerContext.Provider>
|
||||
</StoryProviders>
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
@@ -176,3 +176,9 @@
|
||||
.vscode-session-turn-diffs {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.vscode-session-turn-diffs [data-slot="session-turn-diffs-title"] {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"name": "@kilocode/cli",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { render, TimeToFirstDraw, useKeyboard, useRenderer, useTerminalDimensions } from "@opentui/solid"
|
||||
import { Clipboard } from "@tui/util/clipboard"
|
||||
import { Selection } from "@tui/util/selection"
|
||||
import { createCliRenderer, MouseButton, type CliRendererConfig } from "@opentui/core"
|
||||
import { createCliRenderer, MouseButton, TextAttributes, type CliRendererConfig } from "@opentui/core" // kilocode_change
|
||||
import { RouteProvider, useRoute } from "@tui/context/route"
|
||||
import {
|
||||
Switch,
|
||||
@@ -16,12 +16,12 @@ import {
|
||||
on,
|
||||
onCleanup,
|
||||
} from "solid-js"
|
||||
import { win32DisableProcessedInput, win32InstallCtrlCGuard } from "./win32"
|
||||
import { win32DisableProcessedInput, win32FlushInputBuffer, win32InstallCtrlCGuard } from "./win32" // kilocode_change
|
||||
import { Flag } from "@/flag/flag"
|
||||
import semver from "semver"
|
||||
import { DialogProvider, useDialog } from "@tui/ui/dialog"
|
||||
import { DialogProvider as DialogProviderList } from "@tui/component/dialog-provider"
|
||||
import { ErrorComponent } from "@tui/component/error-component"
|
||||
import { Installation } from "@/installation" // kilocode_change
|
||||
import { PluginRouteMissing } from "@tui/component/plugin-route-missing"
|
||||
import { SDKProvider, useSDK } from "@tui/context/sdk"
|
||||
import { StartupLoading } from "@tui/component/startup-loading"
|
||||
@@ -202,9 +202,11 @@ export function tui(input: {
|
||||
await render(() => {
|
||||
return (
|
||||
<ErrorBoundary
|
||||
// kilocode_change start
|
||||
fallback={(error, reset) => (
|
||||
<ErrorComponent error={error} reset={reset} onBeforeExit={onBeforeExit} onExit={onExit} mode={mode} />
|
||||
)}
|
||||
// kilocode_change end
|
||||
>
|
||||
<ArgsProvider {...input.args}>
|
||||
<ExitProvider onBeforeExit={onBeforeExit} onExit={onExit}>
|
||||
@@ -965,7 +967,122 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
|
||||
</Show>
|
||||
{plugin()}
|
||||
<TuiPluginRuntime.Slot name="app" />
|
||||
{/* kilocode_change start */}
|
||||
<StartupLoading ready={ready} />
|
||||
</box>
|
||||
)
|
||||
}
|
||||
// kilocode_change end
|
||||
|
||||
// kilocode_change start — guard against missing renderer context in ErrorBoundary fallback
|
||||
function tryUseRenderer() {
|
||||
try {
|
||||
return useRenderer()
|
||||
} catch {
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
|
||||
function tryUseTerminalDimensions() {
|
||||
try {
|
||||
return useTerminalDimensions()
|
||||
} catch {
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
// kilocode_change end
|
||||
|
||||
// kilocode_change start — inlined ErrorComponent with safe renderer/keyboard guards
|
||||
function ErrorComponent(props: {
|
||||
error: Error
|
||||
reset: () => void
|
||||
onBeforeExit?: () => Promise<void>
|
||||
onExit: () => Promise<void>
|
||||
mode?: "dark" | "light"
|
||||
}) {
|
||||
const term = tryUseTerminalDimensions()
|
||||
const renderer = tryUseRenderer()
|
||||
|
||||
const height = () => term?.().height ?? process.stdout.rows ?? 24
|
||||
|
||||
const handleExit = async () => {
|
||||
await props.onBeforeExit?.()
|
||||
renderer?.setTerminalTitle("")
|
||||
renderer?.destroy()
|
||||
win32FlushInputBuffer()
|
||||
await props.onExit()
|
||||
}
|
||||
|
||||
try {
|
||||
useKeyboard((evt) => {
|
||||
if (evt.ctrl && evt.name === "c") {
|
||||
handleExit()
|
||||
}
|
||||
})
|
||||
} catch {
|
||||
// Keyboard handler unavailable — renderer context may be missing.
|
||||
// Ctrl+C will still work via the default signal handler.
|
||||
}
|
||||
|
||||
const [copied, setCopied] = createSignal(false)
|
||||
|
||||
const issueURL = new URL("https://github.com/Kilo-Org/kilocode/issues/new?template=bug-report.yml")
|
||||
|
||||
// Choose safe fallback colors per mode since theme context may not be available
|
||||
const isLight = props.mode === "light"
|
||||
const colors = {
|
||||
bg: isLight ? "#ffffff" : "#0a0a0a",
|
||||
text: isLight ? "#1a1a1a" : "#eeeeee",
|
||||
muted: isLight ? "#8a8a8a" : "#808080",
|
||||
primary: isLight ? "#3b7dd8" : "#fab283",
|
||||
}
|
||||
|
||||
if (props.error.message) {
|
||||
issueURL.searchParams.set("title", `opentui: fatal: ${props.error.message}`)
|
||||
}
|
||||
|
||||
if (props.error.stack) {
|
||||
issueURL.searchParams.set(
|
||||
"description",
|
||||
"```\n" + props.error.stack.substring(0, 6000 - issueURL.toString().length) + "...\n```",
|
||||
)
|
||||
}
|
||||
|
||||
issueURL.searchParams.set("opencode-version", Installation.VERSION)
|
||||
|
||||
const copyIssueURL = () => {
|
||||
Clipboard.copy(issueURL.toString()).then(() => {
|
||||
setCopied(true)
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<box flexDirection="column" gap={1} backgroundColor={colors.bg}>
|
||||
<box flexDirection="row" gap={1} alignItems="center">
|
||||
<text attributes={TextAttributes.BOLD} fg={colors.text}>
|
||||
Please report an issue.
|
||||
</text>
|
||||
<box onMouseUp={copyIssueURL} backgroundColor={colors.primary} padding={1}>
|
||||
<text attributes={TextAttributes.BOLD} fg={colors.bg}>
|
||||
Copy issue URL (exception info pre-filled)
|
||||
</text>
|
||||
</box>
|
||||
{copied() && <text fg={colors.muted}>Successfully copied</text>}
|
||||
</box>
|
||||
<box flexDirection="row" gap={2} alignItems="center">
|
||||
<text fg={colors.text}>A fatal error occurred!</text>
|
||||
<box onMouseUp={props.reset} backgroundColor={colors.primary} padding={1}>
|
||||
<text fg={colors.bg}>Reset TUI</text>
|
||||
</box>
|
||||
<box onMouseUp={handleExit} backgroundColor={colors.primary} padding={1}>
|
||||
<text fg={colors.bg}>Exit</text>
|
||||
</box>
|
||||
</box>
|
||||
<scrollbox height={Math.floor(height() * 0.7)}>
|
||||
<text fg={colors.muted}>{props.error.stack}</text>
|
||||
</scrollbox>
|
||||
<text fg={colors.text}>{props.error.message}</text>
|
||||
</box>
|
||||
)
|
||||
}
|
||||
// kilocode_change end
|
||||
|
||||
@@ -1114,6 +1114,13 @@ export function Session() {
|
||||
scrollAcceleration={scrollAcceleration()}
|
||||
>
|
||||
<box height={1} />
|
||||
{/* kilocode_change start */}
|
||||
<Show when={session()?.parentID && messages().length === 0}>
|
||||
<box paddingLeft={3}>
|
||||
<text fg={theme.textMuted}>↳ Initializing...</text>
|
||||
</box>
|
||||
</Show>
|
||||
{/* kilocode_change end */}
|
||||
<For each={messages()}>
|
||||
{(message, index) => (
|
||||
<Switch>
|
||||
@@ -2064,11 +2071,18 @@ function Task(props: ToolProps<typeof TaskTool>) {
|
||||
if (!props.input.description) return ""
|
||||
let content = [`${Locale.titlecase(props.input.subagent_type ?? "General")} Task — ${props.input.description}`]
|
||||
|
||||
if (isRunning() && tools().length > 0) {
|
||||
// content[0] += ` · ${tools().length} toolcalls`
|
||||
if (current()) content.push(`↳ ${Locale.titlecase(current()!.tool)} ${(current()!.state as any).title}`)
|
||||
else content.push(`↳ ${tools().length} toolcalls`)
|
||||
// kilocode_change start
|
||||
if (isRunning()) {
|
||||
if (tools().length === 0) {
|
||||
content.push(`↳ Starting...`)
|
||||
} else if (current()) {
|
||||
// content[0] += ` · ${tools().length} toolcalls`
|
||||
content.push(`↳ ${Locale.titlecase(current()!.tool)} ${(current()!.state as any).title}`)
|
||||
} else {
|
||||
content.push(`↳ ${tools().length} toolcalls`)
|
||||
}
|
||||
}
|
||||
// kilocode_change end
|
||||
|
||||
if (props.part.state.status === "completed") {
|
||||
content.push(`└ ${tools().length} toolcalls · ${Locale.duration(duration())}`)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/plugin",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
||||
@@ -12,6 +12,6 @@
|
||||
"exports": {
|
||||
".": "./src/index.ts"
|
||||
},
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"peerDependencies": {}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/sdk",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
||||
@@ -1133,7 +1133,7 @@ export class Console extends HeyApiClient {
|
||||
/**
|
||||
* Switch active Console org
|
||||
*
|
||||
* Persist a new active Console account/org selection for the current local OpenCode state.
|
||||
* Persist a new active Console account/org selection for the current local Kilo state.
|
||||
*/
|
||||
public switchOrg<ThrowOnError extends boolean = false>(
|
||||
parameters?: {
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"typescript": "catalog:",
|
||||
"vite": "catalog:"
|
||||
},
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"dependencies": {},
|
||||
"peerDependencies": {}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@opencode-ai/ui",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"exports": {
|
||||
|
||||
@@ -143,7 +143,7 @@ const unsafeCSS = `
|
||||
}
|
||||
|
||||
&[data-interactive-line-numbers] [data-column-number] {
|
||||
cursor: default !important;
|
||||
cursor: pointer !important;
|
||||
}
|
||||
|
||||
&[data-interactive-lines] [data-line] {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@opencode-ai/util",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@kilocode/upstream-merge",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"description": "Scripts for automating upstream opencode merges into Kilo",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "opencode",
|
||||
"displayName": "opencode",
|
||||
"description": "opencode for VS Code",
|
||||
"version": "7.2.5",
|
||||
"version": "7.2.6",
|
||||
"publisher": "sst-dev",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
Reference in New Issue
Block a user