Merge origin/main into fix-abort-error-flash

This commit is contained in:
marius-kilocode
2026-08-25 14:22:19 +02:00
452 changed files with 12031 additions and 2912 deletions
@@ -0,0 +1,5 @@
---
"kilo-code": minor
---
Add an agent_manager answer action so orchestrating agents can resolve a managed session's pending question instead of only stopping it. Prompting a session that waits on input now fails immediately with the pending question named.
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Replace the per-project SESSIONS list in the Agent Manager sidebar with a per-project history button. The sessions view is now scoped to the clicked project and offers per-session actions to resume it in the project's local tabs or in a freshly created worktree.
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Move Agent Manager worktree settings into the Kilo Settings editor and add project selection for multi-project workspaces.
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Render Agent Manager terminal output with the WebGL renderer instead of the DOM renderer, and pause rendering for terminals hidden in the background
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Even out the Agent Manager toolbar: every context button now shares one height and spacing, and the Run, terminal, and new-session split buttons use identical chevrons, so the row stays tidy no matter which optional actions are shown.
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Keep answered questions expanded in chat history and improve their text wrapping.
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Reduce duplicate event processing across VS Code when multiple sessions run concurrently.
@@ -0,0 +1,5 @@
---
"@kilocode/cli": patch
---
Clarify when to use foreground subagents and wait for required background results before the final answer.
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Add a button to copy pull request links from the Agent Manager PR panel.
@@ -0,0 +1,5 @@
---
"@kilocode/cli": patch
---
Fix PTY cleanup on Windows when POSIX process-tree inspection is unavailable.
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Keep the working indicator and the session actions row flush with the prompt input, so the row above the composer no longer jumps when a turn finishes.
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Allow each foreground subagent to continue in the background independently, including when several subagents run in parallel.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Show compact Agent Manager activity icons for running and waiting sessions while keeping idle rows aligned with a smaller idle dot.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Offer Move to Worktree in the chat toolbar whenever the repository has local changes, even before the chat has a session — the worktree gets your changes and starts its own session. New Worktree from the chat toolbar now opens its dialog first and only switches to Agents once you confirm, and the dialog opens narrower.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Keep session header popups beside the chat by choosing the roomier left or right side and sizing them so IntelliJ does not flip them above or below.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Use regular PR title text and vertically center the PR badge in the JetBrains chat tool window.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Show the chat New Worktree and Move to Worktree actions only while the session is idle, and keep the transcript pinned to the newest message when that row appears or disappears.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Add standard horizontal padding to the empty chat recent sessions list.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Keep list descriptions muted while their row is selected, mute the worktree row icons to match the description text, and paint the running spinner in the neutral icon grey so it stays legible in light and dark themes.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Keep settings, history, and session lists on the same row and scroll position when they refresh, and select the neighbouring row after a delete.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Keep Agent Manager worktree selection stable when reordering worktrees and switching tabs.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Fix an IDE freeze when a chat session reports an error, which could hang the whole IDE while opening a worktree session editor.
+5
View File
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Use the Kilo running spinner across session progress indicators.
+5
View File
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Show the JetBrains tool window Chat and Agents views as tabs with shorter labels.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": minor
---
Reorder Agent Manager worktrees by dragging them in the JetBrains plugin.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Show branch icons on Agent Manager worktree rows again, and mark the current checkout with a local machine icon.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Scope chat session history to the worktree you have open, so a worktree no longer lists sessions from the main checkout or sibling worktrees, and show sessions started in another project frame in Agent Manager as they happen.
@@ -0,0 +1,5 @@
---
"@kilocode/cli": patch
---
Prevent encrypted reasoning state from incorrectly reducing the output token budget for long-running sessions.
@@ -0,0 +1,6 @@
---
"@kilocode/cli": patch
"kilo-code": patch
---
Prefer PowerShell 7 over legacy Windows PowerShell 5.1 when running agent commands on Windows. PowerShell 7 installs are now found even when `pwsh` is missing from PATH, Agent Manager setup and run scripts launch pwsh when available, and an explicit `shell` in kilo.json still overrides detection.
+5
View File
@@ -0,0 +1,5 @@
---
"@kilocode/cli": patch
---
Improve CLI cold and warm startup time.
+5
View File
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Improve JetBrains Agent Manager session status badges, selection persistence, and PR badge theming.
@@ -0,0 +1,5 @@
---
"@kilocode/cli": patch
---
Avoid creating project-local dependency trees when configuration directories contain no file plugins.
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Remove the model reset button from the chat and worktree prompt controls.
+1 -1
View File
@@ -2,4 +2,4 @@
"kilo-code": minor
---
Add an Agent Manager document inspector that previews Markdown and text files, with inline Markdown review comments that can be sent to the agent.
Add an Agent Manager document inspector that previews Markdown files with inline review comments that can be sent to the agent, while source files open in the VS Code editor.
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Restore attached images when undoing the last prompt.
@@ -0,0 +1,5 @@
---
"@kilocode/cli": patch
---
Retry reasoning-only incomplete model responses within the bounded recovery budget instead of silently ending the turn.
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Show review comment text directly in the chat message instead of hiding it behind a click. Each comment is now a row with the file, line and a two-line preview, expands in place to reveal the full body and code snippet, and long lists collapse to the first few comments with a "Show more" toggle. Opening a source file from a review comment now uses a native VS Code editor tab.
@@ -0,0 +1,6 @@
---
"@kilocode/kilo-ui": patch
"kilo-code": patch
---
Keep the session transcript glued to its bottom while a response streams, so text, tool cards, reasoning, and message actions no longer twitch as they update.
+5
View File
@@ -0,0 +1,5 @@
---
"@kilocode/cli": patch
---
Build the CLI with Bun 1.4 to reduce compiled binary size and build time.
+5
View File
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Show the current branch first in Agent Manager and replace worktree activity tags with status icons. Running, question, and error activity now share one color between the row icon and the text badge, add an error state, and surface a notification dot on the Agents tab when a session needs attention.
+5
View File
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Report failures when moving a chat into a worktree instead of leaving the row stuck, clean up worktrees left by a failed move, and stop clicks in empty list space from selecting the last row.
@@ -0,0 +1,5 @@
---
"@kilocode/kilo-jetbrains": patch
---
Show worktree creation and move progress in the Agent Manager row instead of the chat dock.
+7
View File
@@ -211,10 +211,12 @@ jobs:
export XDG_CACHE_HOME="$root/cache"
export XDG_CONFIG_HOME="$root/config"
export XDG_STATE_HOME="$root/state"
export KILO_PTY_SMOKE=1 # kilocode_change
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 __pty-smoke # kilocode_change
"$binary" --pure models anthropic | grep -q '^anthropic/'
)
}
@@ -247,10 +249,12 @@ jobs:
export XDG_CACHE_HOME="$root/cache"
export XDG_CONFIG_HOME="$root/config"
export XDG_STATE_HOME="$root/state"
export KILO_PTY_SMOKE=1 # kilocode_change
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 __pty-smoke # kilocode_change
"$binary" --pure models anthropic | grep -q "^anthropic/"
'
@@ -307,10 +311,13 @@ jobs:
$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_PTY_SMOKE = "1" # kilocode_change
$env:KILO_DISABLE_MODELS_FETCH = "1"
$env:KILO_DISABLE_PROJECT_CONFIG = "1"
$env:KILO_CONFIG_CONTENT = '{"enabled_providers":["anthropic"]}'
$env:ANTHROPIC_API_KEY = "dummy"
& $binary --pure __pty-smoke # kilocode_change
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } # kilocode_change
$output = & $binary --pure models anthropic
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
if (-not ($output -match "(?m)^anthropic/")) {
+16 -4
View File
@@ -61,14 +61,14 @@ jobs:
run: |
if [ "$GENERAL" != "true" ]; then
echo 'general=false' >> "$GITHUB_OUTPUT"
echo 'settings=[{"os":"linux","index":1,"total":1,"host":"blacksmith-4vcpu-ubuntu-2404","run":false,"packages":false}]' >> "$GITHUB_OUTPUT"
echo 'settings=[{"os":"linux","index":1,"total":1,"host":"blacksmith-4vcpu-ubuntu-2404","run":false,"packages":false,"pty":false}]' >> "$GITHUB_OUTPUT"
exit 0
fi
echo 'general=true' >> "$GITHUB_OUTPUT"
# kilocode_change - Windows runs 6 shards at KILO_TEST_CONCURRENCY=2. Measured: a
# 5-shard matrix was worse on both wall-clock (slowest job 9.3m vs 6.7m) and machine
# minutes (43 vs 37) — with 2 workers per shard, packing more work per shard loses.
echo 'settings=[{"os":"linux","index":1,"total":2,"host":"blacksmith-4vcpu-ubuntu-2404","run":true,"packages":true},{"os":"linux","index":2,"total":2,"host":"blacksmith-4vcpu-ubuntu-2404","run":true,"packages":false},{"os":"macos","index":1,"total":1,"host":"macos-15","run":true,"packages":true},{"os":"windows","index":1,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":true},{"os":"windows","index":2,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false},{"os":"windows","index":3,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false},{"os":"windows","index":4,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false},{"os":"windows","index":5,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false},{"os":"windows","index":6,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false}]' >> "$GITHUB_OUTPUT"
echo 'settings=[{"os":"linux","index":1,"total":2,"host":"blacksmith-4vcpu-ubuntu-2404","run":true,"packages":true,"pty":true},{"os":"linux","index":2,"total":2,"host":"blacksmith-4vcpu-ubuntu-2404","run":true,"packages":false,"pty":false},{"os":"macos","index":1,"total":1,"host":"macos-15","run":true,"packages":true,"pty":true},{"os":"windows","index":1,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":true,"pty":true},{"os":"windows","index":2,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false,"pty":false},{"os":"windows","index":3,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false,"pty":false},{"os":"windows","index":4,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false,"pty":false},{"os":"windows","index":5,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false,"pty":false},{"os":"windows","index":6,"total":6,"host":"blacksmith-4vcpu-windows-2025","run":true,"packages":false,"pty":false}]' >> "$GITHUB_OUTPUT"
# kilocode_change end
unit:
# kilocode_change start
@@ -118,7 +118,6 @@ jobs:
}
Write-Host "Defender path exclusions applied: $applied"
# kilocode_change end
- name: Checkout repository
if: matrix.settings.run # kilocode_change
uses: actions/checkout@v6 # kilocode_change
@@ -187,8 +186,21 @@ jobs:
run: bun turbo test:ci --output-logs=errors-only --log-order=grouped --log-prefix=task --filter='!@kilocode/cli' --filter='!@kilocode/kilo-jetbrains'
env:
KILO_EXPERIMENTAL_DISABLE_FILEWATCHER: "true" # kilocode_change - non-CLI tests use the watcher-free unit-test profile
# kilocode_change end
# Keep this outside the CLI shard and OS profiles so one real PTY contract
# always runs on Linux, macOS, and Windows.
- name: Run cross-platform PTY service tests
if: matrix.settings.run && matrix.settings.pty
working-directory: packages/core
run: bun test test/kilocode/pty-platform.test.ts --timeout 60000
- name: Run cross-platform PTY route tests
if: matrix.settings.run && matrix.settings.pty
working-directory: packages/opencode
run: |
bun test test/server/httpapi-pty.test.ts --test-name-pattern "serves Agent Manager regular terminal" --timeout 60000
bun test test/server/httpapi-v2-pty.test.ts --test-name-pattern "serves Agent Manager script terminal" --timeout 60000
# kilocode_change end
# kilocode_change start - ensure the Darwin profile cannot suppress its own validation
- name: Validate Darwin CLI test profile
if: matrix.settings.run && matrix.settings.os == 'macos'
+2 -2
View File
@@ -16,7 +16,7 @@ The Kilo Community is [on Discord](https://kilo.ai/discord).
## Prerequisites
- **Bun 1.3.14+** — required for all packages.
- **Bun 1.4.0+** — 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.14+, Java 21 (see [Prerequisites](#prerequisites) above)
- **Requirements:** Bun 1.4.0+, Java 21 (see [Prerequisites](#prerequisites) above)
- Install dependencies and start the CLI from the repo root:
```bash
+15 -12
View File
@@ -461,6 +461,7 @@
"@xterm/addon-fit": "0.11.0",
"@xterm/addon-unicode-graphemes": "0.4.0",
"@xterm/addon-web-links": "0.12.0",
"@xterm/addon-webgl": "0.19.0",
"@xterm/xterm": "6.0.0",
"diff": "8.0.4",
"fastest-levenshtein": "^1.0.16",
@@ -1000,25 +1001,25 @@
},
},
"trustedDependencies": [
"esbuild",
"protobufjs",
"web-tree-sitter",
"esbuild",
"tree-sitter-bash",
"protobufjs",
],
"patchedDependencies": {
"@ai-sdk/xai@3.0.102": "patches/@ai-sdk%2Fxai@3.0.102.patch",
"@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch",
"virtua@0.49.1": "patches/virtua@0.49.1.patch",
"mammoth@1.12.0": "patches/mammoth@1.12.0.patch",
"@ff-labs/fff-bun@0.9.4": "patches/@ff-labs%2Ffff-bun@0.9.4.patch",
"pacote@21.5.1": "patches/pacote@21.5.1.patch",
"@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
"@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch",
"@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch",
"pacote@21.5.1": "patches/pacote@21.5.1.patch",
"@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch",
"@ai-sdk/mistral@3.0.51": "patches/@ai-sdk%2Fmistral@3.0.51.patch",
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch",
"@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch",
"solid-js@1.9.12": "patches/solid-js@1.9.12.patch",
"@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch",
"virtua@0.49.1": "patches/virtua@0.49.1.patch",
"@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch",
"mammoth@1.12.0": "patches/mammoth@1.12.0.patch",
"@ai-sdk/xai@3.0.102": "patches/@ai-sdk%2Fxai@3.0.102.patch",
},
"overrides": {
"@effect/platform-node-shared": "4.0.0-beta.74",
@@ -1069,7 +1070,7 @@
"@tanstack/solid-virtual": "3.13.32",
"@tsconfig/bun": "1.0.9",
"@tsconfig/node22": "22.0.2",
"@types/bun": "1.3.14",
"@types/bun": "1.4.0",
"@types/cross-spawn": "6.0.6",
"@types/luxon": "3.7.1",
"@types/node": "24.12.4",
@@ -2536,7 +2537,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.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="],
"@types/bun": ["@types/bun@1.4.0", "", { "dependencies": { "bun-types": "1.4.0" } }, "sha512-K+lZULY23vRgK/CfTjFIV+tyifaNdSMlPh9j+6mQ/cLfpOznLyAuzgV/JQysyECpkBQLVMSyvjlr2fBUSA9wFQ=="],
"@types/cacache": ["@types/cacache@20.0.1", "", { "dependencies": { "@types/node": "*", "minipass": "*" } }, "sha512-QlKW3AFoFr/hvPHwFHMIVUH/ZCYeetBNou3PCmxu5LaNDvrtBlPJtIA6uhmU9JRt9oxj7IYoqoLcpxtzpPiTcw=="],
@@ -2794,6 +2795,8 @@
"@xterm/addon-web-links": ["@xterm/addon-web-links@0.12.0", "", {}, "sha512-4Smom3RPyVp7ZMYOYDoC/9eGJJJqYhnPLGGqJ6wOBfB8VxPViJNSKdgRYb8NpaM6YSelEKbA2SStD7lGyqaobw=="],
"@xterm/addon-webgl": ["@xterm/addon-webgl@0.19.0", "", {}, "sha512-b3fMOsyLVuCeNJWxolACEUED0vm7qC0cy4wRvf3oURSzDTYVQiGPhTnhWZwIHdvC48Y+oLhvYXnY4XDXPoJo6A=="],
"@xterm/xterm": ["@xterm/xterm@6.0.0", "", {}, "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg=="],
"@xyflow/react": ["@xyflow/react@12.10.2", "", { "dependencies": { "@xyflow/system": "0.0.76", "classcat": "^5.0.3", "zustand": "^4.4.0" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-CgIi6HwlcHXwlkTpr0fxLv/0sRVNZ8IdwKLzzeCscaYBwpvfcH1QFOCeaTCuEn1FQEs/B8CjnTSjhs8udgmBgQ=="],
@@ -2972,7 +2975,7 @@
"bun-pty": ["bun-pty@0.4.8", "", {}, "sha512-rO70Mrbr13+jxHHHu2YBkk2pNqrJE5cJn29WE++PUr+GFA0hq/VgtQPZANJ8dJo6d7XImvBk37Innt8GM7O28w=="],
"bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="],
"bun-types": ["bun-types@1.4.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-iIKw23BspnQQYd3prITOBxeUsxBHnwzX6YJfGMuNOZzeNcMmVqzIIVGRm1l69ogaPQmb4wB6BN8mA5bE9YuC5Q=="],
"bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
+1 -1
View File
@@ -2,7 +2,7 @@
exact = true
# Keep Kilo's longer supply-chain quarantine while allowing packages that must track coordinated releases.
minimumReleaseAge = 410520 # seconds (~4.75 days / ~114 hours)
minimumReleaseAgeExcludes = ["mermaid", "@mermaid-js/parser", "@ai-sdk/amazon-bedrock", "@ai-sdk/anthropic", "@opentui/core", "@opentui/core-darwin-arm64", "@opentui/core-darwin-x64", "@opentui/core-linux-arm64", "@opentui/core-linux-arm64-musl", "@opentui/core-linux-x64", "@opentui/core-linux-x64-musl", "@opentui/core-win32-arm64", "@opentui/core-win32-x64", "@opentui/keymap", "@opentui/solid", "opentui-spinner", "gitlab-ai-provider", "opencode-gitlab-auth", "@ff-labs/fff-node", "@ff-labs/fff-bun", "@ff-labs/fff-bin-darwin-arm64", "@ff-labs/fff-bin-darwin-x64", "@ff-labs/fff-bin-linux-arm64-gnu", "@ff-labs/fff-bin-linux-arm64-musl", "@ff-labs/fff-bin-linux-x64-gnu", "@ff-labs/fff-bin-linux-x64-musl", "@ff-labs/fff-bin-win32-arm64", "@ff-labs/fff-bin-win32-x64", "@pierre/diffs", "@pierre/theming", "app-builder-lib", "dmg-builder", "electron-builder", "electron-publish"]
minimumReleaseAgeExcludes = ["mermaid", "@mermaid-js/parser", "@ai-sdk/amazon-bedrock", "@ai-sdk/anthropic", "@opentui/core", "@opentui/core-darwin-arm64", "@opentui/core-darwin-x64", "@opentui/core-linux-arm64", "@opentui/core-linux-arm64-musl", "@opentui/core-linux-x64", "@opentui/core-linux-x64-musl", "@opentui/core-win32-arm64", "@opentui/core-win32-x64", "@opentui/keymap", "@opentui/solid", "opentui-spinner", "gitlab-ai-provider", "opencode-gitlab-auth", "@ff-labs/fff-node", "@ff-labs/fff-bun", "@ff-labs/fff-bin-darwin-arm64", "@ff-labs/fff-bin-darwin-x64", "@ff-labs/fff-bin-linux-arm64-gnu", "@ff-labs/fff-bin-linux-arm64-musl", "@ff-labs/fff-bin-linux-x64-gnu", "@ff-labs/fff-bin-linux-x64-musl", "@ff-labs/fff-bin-win32-arm64", "@ff-labs/fff-bin-win32-x64", "@pierre/diffs", "@pierre/theming", "app-builder-lib", "dmg-builder", "electron-builder", "electron-publish", "@types/bun", "bun-types"] # kilocode_change
[test]
root = "./do-not-run-tests-from-root"
+4 -4
View File
@@ -14,19 +14,19 @@ let
sources = {
"aarch64-linux" = {
name = "bun-linux-aarch64";
hash = "sha256-on/7Y6gxA3WDbg1vZorhf6jY0YuIw3yCHGUzGXOhmjs=";
hash = "sha256-SxozLuhhmD65O8/m93D/+U4+MbLDiL2uo8jtNeWO7Q4=";
};
"x86_64-linux" = {
name = "bun-linux-x64";
hash = "sha256-lR7iruhV8IWVruxiJSJqKY0/6oOj3NZGXAnLzN9+hI8=";
hash = "sha256-LQP7X7g6yLVnrKCigbLOGhoZ1Ij1bClo2Iw/Jekv5FI=";
};
"aarch64-darwin" = {
name = "bun-darwin-aarch64";
hash = "sha256-2LliIYKK1vl6x6wKt+lYcjQa92MAHogD6CZ2UsJlJiA=";
hash = "sha256-xmnpf2Fk4cluBwF0jbmN+ndJKQjL2DlMdVcTSnNd44E=";
};
"x86_64-darwin" = {
name = "bun-darwin-x64";
hash = "sha256-QYPfM3RiPlurMVxUfPoJdFM81FfYa3O2OfeoeXTNZjM=";
hash = "sha256-HQIRuPHcmRGCNEaHrRXnLuhvFUhFpff6R3mUzTQd2bA=";
};
};
source =
+4 -4
View File
@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-9riExKYPZOz7RqMyrtEMiJyxbtBHnCRkwoBrx825t6k=",
"aarch64-linux": "sha256-mCu+gs0rZGv2PRQlojZR+g3TnRXjMdiN0ORrnUwFbRU=",
"aarch64-darwin": "sha256-boQX3rpYs2vgRzIgVwEeyAKJ8b3MzbBbrq8GL5YkKE8=",
"x86_64-darwin": "sha256-flbEqrgSGWDHfuTeVTv3iV8wYCeDHpPeqkj5Mq5WXy0="
"x86_64-linux": "sha256-EZPg35MrIg7sK0kfqwrhWyGMF4YOVK2yObGbvIXJ1zk=",
"aarch64-linux": "sha256-DHSeWLho1CV+SY2TMBeBKbMCOhWEd0VTGDnlMMZw+i4=",
"aarch64-darwin": "sha256-zMEmZ3ox3aXX/Q4L4vwYL45RUbiD8Jpq3DlEhVA44YU=",
"x86_64-darwin": "sha256-nGjMFQ98tn7ay4zBt+hqqUFWr80c0SV0qmJJ1lLA1l0="
}
}
+2 -2
View File
@@ -4,7 +4,7 @@
"description": "AI-powered development tool",
"private": true,
"type": "module",
"packageManager": "bun@1.3.14",
"packageManager": "bun@1.4.0",
"scripts": {
"dev": "KILO_CLIENT=cli bun run --cwd packages/opencode --conditions=node src/index.ts",
"dev:stats": "bun sst shell --stage=production -- bun run --cwd packages/stats/app dev",
@@ -35,7 +35,7 @@
"@effect/platform-node": "4.0.0-beta.83",
"@anthropic-ai/sandbox-runtime": "0.0.63",
"@npmcli/arborist": "9.4.0",
"@types/bun": "1.3.14",
"@types/bun": "1.4.0",
"@types/cross-spawn": "6.0.6",
"@octokit/rest": "22.0.0",
"@opentui/core": "0.4.5",
+1 -1
View File
@@ -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.14
ARG BUN_VERSION=1.4.0
ENV BUN_INSTALL=/opt/bun
ENV PATH=/opt/bun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+1 -1
View File
@@ -35,7 +35,7 @@ function wrapSSE(res: Response, ms: number, ctl: AbortController) {
const id = setTimeout(() => {
const err = new Error("SSE read timed out")
ctl.abort(err)
void reader.cancel(err)
void reader.cancel(err).catch(() => undefined) // kilocode_change - handle Bun 1.4 cancellation rejection
reject(err)
}, ms)
+19 -1
View File
@@ -1,7 +1,25 @@
import { statSync } from "fs"
import path from "path"
import { which } from "../util/which"
export function args(command: string) {
return ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", script(command)]
}
export const locations = (env: NodeJS.ProcessEnv = process.env) =>
[
env["ProgramFiles"] && path.join(env["ProgramFiles"], "PowerShell", "7"),
env["ProgramFiles(x86)"] && path.join(env["ProgramFiles(x86)"], "PowerShell", "7"),
env["LOCALAPPDATA"] && path.join(env["LOCALAPPDATA"], "Microsoft", "WindowsApps"),
]
.filter((item): item is string => Boolean(item))
.map((root) => path.join(root, "pwsh.exe"))
export const probe = (env: NodeJS.ProcessEnv = process.env) =>
locations(env).filter((file) => statSync(file, { throwIfNoEntry: false })?.isFile())
export const pwsh = (env: NodeJS.ProcessEnv = process.env) => which("pwsh", env) ?? probe(env)[0]
const setup = `[Console]::InputEncoding = [System.Text.UTF8Encoding]::new($false);
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false);
$OutputEncoding = [Console]::OutputEncoding;
@@ -123,4 +141,4 @@ function block(command: string, start: number, open: string, close: string) {
}
}
export const PowerShell = { args }
export const PowerShell = { args, locations, probe, pwsh }
+72
View File
@@ -0,0 +1,72 @@
import { Shell } from "../../shell"
import { KiloPtyTermination } from "./termination"
import { spawn } from "#pty"
const TIMEOUT = 15_000
export async function smoke() {
const proc = spawn(Shell.preferred(), [], {
name: "xterm-256color",
cwd: process.cwd(),
env: { ...process.env, TERM: "xterm-256color", KILO_TERMINAL: "1" } as Record<string, string>,
cols: 80,
rows: 24,
})
const state = { output: "", exited: false }
const output = Promise.withResolvers<void>()
const exited = Promise.withResolvers<number>()
const data = proc.onData((chunk) => {
state.output += chunk
const lines = state.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "").split(/\r?\n/)
if (lines.some((line) => line.trim() === "KILO_PTY_READY")) output.resolve()
})
const exit = proc.onExit((event) => {
state.exited = true
exited.resolve(event.exitCode)
})
const timeout = AbortSignal.timeout(TIMEOUT)
try {
proc.resize(100, 40)
proc.write("echo KILO_PTY_READY\r")
await Promise.race([
output.promise,
new Promise<never>((_, reject) =>
timeout.addEventListener(
"abort",
() => reject(new Error(`PTY produced no output within ${TIMEOUT}ms: ${JSON.stringify(state.output)}`)),
{ once: true },
),
),
])
proc.write("exit 7\r")
const code = await Promise.race([
exited.promise,
new Promise<never>((_, reject) =>
timeout.addEventListener("abort", () => reject(new Error(`PTY did not exit within ${TIMEOUT}ms`)), {
once: true,
}),
),
])
if (code !== 7) throw new Error(`PTY exited ${code}, expected 7`)
} finally {
data.dispose()
exit.dispose()
if (!state.exited) proc.kill()
}
const active = spawn(Shell.preferred(), [], {
name: "xterm-256color",
cwd: process.cwd(),
env: process.env as Record<string, string>,
})
let stopped = false
try {
await KiloPtyTermination.terminate(active)
stopped = true
} finally {
if (!stopped) active.kill()
}
}
export * as PtySmoke from "./smoke"
+27 -1
View File
@@ -1,4 +1,5 @@
import { spawn } from "child_process"
import { readdir, readFile } from "node:fs/promises"
import { setTimeout as sleep } from "node:timers/promises"
import type { Proc } from "../../pty/pty"
import { Log } from "../../util/log"
@@ -87,6 +88,15 @@ function signal(proc: Process, pids: number[], value: "SIGTERM" | "SIGKILL", inp
}
async function tree(file: string = "ps", args: string[] = ["-axo", "pid=,ppid="]) {
if (process.platform === "linux") {
try {
const rows = await procTree()
if (rows.length > 0) return rows
} catch (err) {
log.debug("failed to read Linux process tree", { err })
}
}
return await new Promise<Array<{ pid: number; parent: number }>>((resolve, reject) => {
try {
const child = spawn(file, args, {
@@ -116,6 +126,22 @@ async function tree(file: string = "ps", args: string[] = ["-axo", "pid=,ppid="]
})
}
async function procTree() {
const entries = await readdir("/proc", { withFileTypes: true })
const rows = await Promise.all(
entries
.filter((entry) => entry.isDirectory() && /^\d+$/.test(entry.name))
.map(async (entry) => {
const stat = await readFile(`/proc/${entry.name}/stat`, "utf8").catch(() => undefined)
if (!stat) return
const match = stat.match(/^\d+ \(.*\) [A-Z] (\d+)/)
if (!match) return
return { pid: Number(entry.name), parent: Number(match[1]) }
}),
)
return rows.filter((row): row is { pid: number; parent: number } => row !== undefined)
}
async function taskkill(file: string, args: string[], opts: { stdio: "ignore"; windowsHide: true; timeout: number }) {
return await new Promise<boolean>((resolve) => {
try {
@@ -153,7 +179,7 @@ export async function terminate(proc: Process, input: Runtime = runtime): Promis
})
if ((!killed || input.alive(proc.pid)) && !state.exited) direct(proc)
if (!state.exited) await input.sleep(GRACE_MS)
await verify(proc, state.exited, input)
if (!state.exited && input.alive(proc.pid)) throw new Error(`PTY process tree is still alive: ${proc.pid}`)
return
}
+2 -1
View File
@@ -99,7 +99,8 @@ function resolve(file: string) {
function win() {
return Array.from(
new Set(
[which("pwsh"), which("powershell"), gitbash(), process.env.COMSPEC || "cmd.exe"]
// kilocode_change - probe known PowerShell 7 install locations so legacy 5.1 is not picked when pwsh is off PATH
[PowerShell.pwsh(), which("powershell"), gitbash(), process.env.COMSPEC || "cmd.exe"] // kilocode_change
.filter((item): item is string => Boolean(item))
.map(full),
),
@@ -0,0 +1,120 @@
import { describe, expect, test } from "bun:test"
import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "fs"
import { tmpdir } from "os"
import path from "path"
import { Shell } from "@opencode-ai/core/shell"
import { PowerShell } from "@opencode-ai/core/kilocode/powershell"
import { which } from "@opencode-ai/core/util/which"
const LEGACY = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
const knownLocations = () => {
const roots = [
process.env.ProgramFiles && path.join(process.env.ProgramFiles, "PowerShell", "7"),
process.env["ProgramFiles(x86)"] && path.join(process.env["ProgramFiles(x86)"], "PowerShell", "7"),
process.env.LOCALAPPDATA && path.join(process.env.LOCALAPPDATA, "Microsoft", "WindowsApps"),
].filter((item): item is string => Boolean(item))
return roots.map((root) => path.join(root, "pwsh.exe")).filter((file) => existsSync(file))
}
const pwshInstalled = () => Boolean(which("pwsh")) || knownLocations().length > 0
// Remove every PATH directory that can resolve pwsh or powershell so detection
// cannot fall back to PATH lookup and must find installs on its own.
const withoutPowershellDirs = () =>
(process.env.PATH ?? "")
.split(path.delimiter)
.filter(Boolean)
.filter((dir) => !/powershell/i.test(dir) && !existsSync(path.join(dir, "pwsh.exe")))
.join(path.delimiter)
function withEnv(env: { PATH?: string; SHELL?: string }, fn: () => void) {
const prevPath = process.env.PATH
const prevShell = process.env.SHELL
if (env.PATH === undefined) delete process.env.PATH
else process.env.PATH = env.PATH
if (env.SHELL === undefined) delete process.env.SHELL
else process.env.SHELL = env.SHELL
Shell.preferred.reset()
Shell.acceptable.reset()
try {
fn()
} finally {
if (prevPath === undefined) delete process.env.PATH
else process.env.PATH = prevPath
if (prevShell === undefined) delete process.env.SHELL
else process.env.SHELL = prevShell
Shell.preferred.reset()
Shell.acceptable.reset()
}
}
if (process.platform === "win32") {
describe("windows powershell selection", () => {
test("prefers an installed powershell 7 when pwsh is absent from PATH", () => {
if (!pwshInstalled()) return
withEnv({ PATH: withoutPowershellDirs(), SHELL: undefined }, () => {
expect(Shell.name(Shell.preferred())).toBe("pwsh")
expect(Shell.name(Shell.acceptable())).toBe("pwsh")
})
})
test("prefers pwsh over legacy 5.1 on the unmodified PATH", () => {
if (!pwshInstalled()) return
withEnv({ SHELL: undefined }, () => {
expect(Shell.name(Shell.preferred())).toBe("pwsh")
})
})
test("explicit shell config still overrides detection", () => {
if (!existsSync(LEGACY)) return
expect(Shell.preferred(LEGACY)).toBe(LEGACY)
expect(Shell.acceptable(LEGACY)).toBe(LEGACY)
})
})
}
describe("powershell install probing", () => {
test("lists known locations in priority order", () => {
expect(
PowerShell.locations({
ProgramFiles: "C:\\Program Files",
"ProgramFiles(x86)": "C:\\Program Files (x86)",
LOCALAPPDATA: "C:\\Users\\u\\AppData\\Local",
}),
).toEqual([
path.join("C:\\Program Files", "PowerShell", "7", "pwsh.exe"),
path.join("C:\\Program Files (x86)", "PowerShell", "7", "pwsh.exe"),
path.join("C:\\Users\\u\\AppData\\Local", "Microsoft", "WindowsApps", "pwsh.exe"),
])
})
test("skips unset environment roots", () => {
expect(PowerShell.locations({})).toEqual([])
})
test("probe and pwsh resolve an installed pwsh outside PATH", () => {
const root = mkdtempSync(path.join(tmpdir(), "pwsh-probe-"))
try {
const dir = path.join(root, "PowerShell", "7")
mkdirSync(dir, { recursive: true })
const file = path.join(dir, "pwsh.exe")
writeFileSync(file, "")
expect(PowerShell.probe({ ProgramFiles: root })).toEqual([file])
expect(PowerShell.pwsh({ PATH: "", ProgramFiles: root })).toBe(file)
} finally {
rmSync(root, { recursive: true, force: true })
}
})
test("probe ignores location roots without pwsh", () => {
const root = mkdtempSync(path.join(tmpdir(), "pwsh-probe-empty-"))
try {
mkdirSync(path.join(root, "PowerShell", "7"), { recursive: true })
expect(PowerShell.probe({ ProgramFiles: root })).toEqual([])
expect(PowerShell.pwsh({ PATH: "", ProgramFiles: root })).toBeUndefined()
} finally {
rmSync(root, { recursive: true, force: true })
}
})
})
@@ -0,0 +1,96 @@
import { describe, expect } from "bun:test"
import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
import { Config } from "@opencode-ai/core/config"
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
import { EventV2 } from "@opencode-ai/core/event"
import { Location } from "@opencode-ai/core/location"
import { Pty } from "@opencode-ai/core/pty"
import { AbsolutePath } from "@opencode-ai/core/schema"
import { Deferred, Effect, Layer, Queue } from "effect"
import os from "node:os"
import { location } from "../fixture/location"
import { testEffect } from "../lib/effect"
const directory = os.tmpdir()
const layer = AppNodeBuilder.build(LayerNode.group([Pty.node, EventV2.node]), [
[Config.node, Layer.mock(Config.Service)({ entries: () => Effect.succeed([]) })],
[
Location.node,
Layer.succeed(Location.Service, Location.Service.of(location({ directory: AbsolutePath.make(directory) }))),
],
])
const it = testEffect(layer)
async function alive(pid: number) {
if (process.platform !== "win32") {
try {
process.kill(pid, 0)
return true
} catch {
return false
}
}
const proc = Bun.spawn(["tasklist", "/FI", `PID eq ${pid}`, "/FO", "CSV", "/NH"], {
stdout: "pipe",
stderr: "ignore",
windowsHide: true,
})
const output = await new Response(proc.stdout).text()
await proc.exited
return output.includes(`"${pid}"`)
}
const attach = Effect.fn("PtyPlatformTest.attach")(function* (id: Pty.Info["id"]) {
const pty = yield* Pty.Service
const output = yield* Queue.unbounded<string>()
const ended = yield* Deferred.make<{ exitCode?: number }>()
const attachment = yield* pty.attach(id, {
onData: (data) => Queue.offerUnsafe(output, data),
onEnd: (event) => Deferred.doneUnsafe(ended, Effect.succeed(event)),
})
attachment.activate()
return { attachment, output, ended }
})
describe("cross-platform PTY", () => {
it.live("starts the default shell and exits from input", () =>
Effect.gen(function* () {
const pty = yield* Pty.Service
const info = yield* Effect.acquireRelease(pty.create({ cwd: directory }), (item) =>
pty.remove(item.id).pipe(Effect.ignore),
)
const terminal = yield* attach(info.id)
terminal.attachment.write("exit\r")
expect(yield* Deferred.await(terminal.ended).pipe(Effect.timeout("15 seconds"))).toEqual({ exitCode: 0 })
}),
)
it.live("terminates a spawned process tree", () =>
Effect.gen(function* () {
const pty = yield* Pty.Service
const source = [
'const child = Bun.spawn([process.execPath, "-e", "setInterval(() => {}, 1000)"], {',
' stdin: "ignore", stdout: "ignore", stderr: "ignore", windowsHide: true,',
"})",
"process.stdout.write(`CHILD:${child.pid}\\n`)",
"setInterval(() => {}, 1000)",
].join("\n")
const info = yield* Effect.acquireRelease(
pty.create({ command: process.execPath, args: ["-e", source], cwd: directory }),
(item) => pty.remove(item.id).pipe(Effect.ignore),
)
const terminal = yield* attach(info.id)
const output = yield* Effect.gen(function* () {
let text = ""
while (!text.includes("CHILD:")) text += yield* Queue.take(terminal.output)
return text
}).pipe(Effect.timeout("15 seconds"))
const pid = Number(output.match(/CHILD:(\d+)/)?.[1])
expect(pid).toBeGreaterThan(0)
yield* pty.remove(info.id)
expect(yield* Effect.promise(() => alive(pid))).toBe(false)
}),
)
})
@@ -18,6 +18,8 @@ function runtime(
taskkillLeavesAlive?: boolean
signal?: "throw"
tree?: Array<{ pid: number; parent: number }>
treeError?: boolean
treeCalls?: { count: number }
} = {},
) {
const tasks: Array<{
@@ -36,7 +38,11 @@ function runtime(
if (result && !input.taskkillLeavesAlive) alive = false
return result
},
tree: async () => input.tree ?? [],
tree: async () => {
if (input.treeCalls) input.treeCalls.count++
if (input.treeError) throw new Error("process tree unavailable")
return input.tree ?? []
},
alive: () => alive,
signal: (pid, signal) => {
signals.push({ pid, signal })
@@ -83,6 +89,18 @@ describe("pty process-tree termination", () => {
expect(input.sleeps).toEqual([200])
})
test("continues when Windows process-tree inspection is unavailable", async () => {
const treeCalls = { count: 0 }
const input = runtime("win32", { treeError: true, treeCalls })
const item = fake(42)
await KiloPtyTermination.terminate(item.proc, input.value)
expect(item.calls).toEqual([])
expect(input.sleeps).toEqual([200])
expect(treeCalls.count).toBe(0)
})
test("signals POSIX process groups before escalating", async () => {
const item = fake(42)
const input = runtime("linux")
+1
View File
@@ -19,6 +19,7 @@ export const AutomateNav: NavSection[] = [
children: "Agent Manager",
subLinks: [
{ href: "/automate/agent-manager-workflows", children: "Workflows" },
{ href: "/automate/agent-manager-projects", children: "Multi-project" },
],
},
],
@@ -53,6 +53,10 @@ export const CollaborateNav: NavSection[] = [
{
title: "Enterprise",
links: [
{
href: "/collaborate/enterprise/sub-organizations",
children: "Sub-organizations",
},
{ href: "/collaborate/enterprise/sso", children: "SSO" },
{
href: "/collaborate/enterprise/model-access-controls",
@@ -0,0 +1,3 @@
{% callout type="warning" title="KiloClaw is end of life" %}
KiloClaw is no longer available to new users, and support for the product is ending. This documentation is kept for reference by existing users and is no longer maintained.
{% /callout %}
@@ -16,7 +16,7 @@ If you already pay for ChatGPT Plus or Pro, you can use that subscription to run
- **Multiple AI modes:** Switch between Code, Plan, Debug, and Ask modes for different tasks.
{% callout type="note" %}
Your ChatGPT subscription works with Kilo Code's core functionality (VS Code extension and CLI), but does **not** include cloud features such as Cloud Agents, Kilo Deploy, or KiloClaw. To use GPT models in those features, use the [Kilo Gateway](/docs/gateway).
Your ChatGPT subscription works with Kilo Code's core functionality (VS Code extension and CLI), but does **not** include cloud features such as Cloud Agents or Kilo Deploy. To use GPT models in those features, use the [Kilo Gateway](/docs/gateway).
{% /callout %}
## Setup
@@ -62,7 +62,7 @@ Then set your default model to one of the OpenAI Codex models available in Kilo
- **Codex catalog models only.** This provider only exposes the models listed in Kilo Code's Codex model catalog. It does not give access to every model available through the OpenAI API.
- **OAuth tokens can't be exported with settings.** Tokens are stored in VS Code SecretStorage, which isn't included in Kilo Code's settings export.
- **Cloud features not included.** Cloud Agents, Kilo Deploy, and KiloClaw require the [Kilo Gateway](/docs/gateway).
- **Cloud features not included.** Cloud Agents and Kilo Deploy require the [Kilo Gateway](/docs/gateway).
## FAQ
@@ -78,5 +78,5 @@ Usage counts against your ChatGPT subscription limits — there are no separate
**Can I still switch to other AI providers?**
Yes. Use OpenAI when it fits and switch to Claude, Gemini, or any local model at any time.
**Can I use my ChatGPT subscription in KiloClaw?**
No. For KiloClaw and other cloud features, use GPT models through the [Kilo Gateway](/docs/gateway), which gives access to 500+ models including the latest GPT releases.
**Can I use my ChatGPT subscription in Kilo's cloud features?**
No. For Cloud Agents, Kilo Deploy, and other cloud features, use GPT models through the [Kilo Gateway](/docs/gateway), which gives access to 500+ models including the latest GPT releases.
+1 -1
View File
@@ -28,7 +28,7 @@ If you have an active [SuperGrok or X Premium subscription](https://x.ai/grok),
- **Automatic token refresh:** Kilo Code refreshes your access token in the background so long-running sessions stay authenticated.
{% callout type="note" %}
SuperGrok and X Premium subscription access works with Kilo Code's core functionality (VS Code extension and CLI). For cloud features such as Cloud Agents or KiloClaw, use the [Kilo Gateway](/docs/gateway) — the Gateway supports xAI via [BYOK](/docs/getting-started/byok) with an API key (OAuth and subscription-based access are not supported through the Gateway).
SuperGrok and X Premium subscription access works with Kilo Code's core functionality (VS Code extension and CLI). For cloud features such as Cloud Agents, use the [Kilo Gateway](/docs/gateway) — the Gateway supports xAI via [BYOK](/docs/getting-started/byok) with an API key (OAuth and subscription-based access are not supported through the Gateway).
{% /callout %}
### Setup with SuperGrok / X Premium
@@ -0,0 +1,36 @@
---
title: "Multi-project Agent Manager"
description: "Manage Agent Manager sessions across multiple Git repositories"
---
# Multi-project Agent Manager
Multi-project Agent Manager lets you manage sessions and worktrees from multiple Git repositories in one Agent Manager panel. The feature is experimental and disabled by default. When it is disabled, Agent Manager keeps its existing single-project behavior.
## Enable multi-project mode
1. Open [Kilo Code Settings](/docs/getting-started/settings#experimental-features).
2. Open the **Experimental** tab.
3. Enable **Multi-Project Agent Manager**.
The setting is also available as `kilo-code.new.experimental.multiProject`. It is an application-scoped VS Code setting and defaults to `false`.
## Add Git repositories
The repository in your current VS Code workspace is always the **default project**. You cannot remove it from Agent Manager.
To add another repository:
1. Open Agent Manager.
2. Select **Add Project**.
3. Choose a folder inside a Git repository.
Agent Manager registers the repository root and makes it available immediately. Adding a project does not require a separate Agent Manager trust step. VS Code workspace trust still controls whether setup and run scripts can execute.
## Persistence and project scope
- Added repositories remain in the project list across VS Code restarts.
- The default project is derived from the current workspace. It is not an added project in the persistent registry.
- Each repository has its own worktrees, sessions, sections, selection, and Agent Manager state. Repository state is stored in that repository's `.kilo/agent-manager.json` and `.kilo/worktrees/` paths.
- Switching projects keeps their state separate, so sessions and worktrees are not mixed between repositories.
- Removing an added project only removes it from Agent Manager. It does not delete the repository, its branches, or its project state.
@@ -38,7 +38,7 @@ Every productive worktree session follows the same rhythm:
1. **Open a new worktree dialog** (`Cmd+N` / `Ctrl+N`), then describe the task.
2. **Let the agent run.** Switch to another worktree, another session, or step away.
3. **Verify manually.** Before you trust "all tests pass", run the app with the run script (`Cmd+E` / `Ctrl+E`) or open the worktree's terminal (`Cmd+/` / `Ctrl+/`) and run the tests yourself.
4. **Review the diff** (`Cmd+D` / `Ctrl+D`). Drop inline comments, then **Send to chat** to feed them back to the agent.
4. **Review the diff** (`Cmd+D` / `Ctrl+D`). Add inline comments, then send all collected comments to chat or the active Agent Manager terminal with **Send all to chat**. Use `Cmd+Enter` / `Ctrl+Enter` as a shortcut.
5. **Iterate.** Re-run, re-review. Repeat until the diff is ready — not until the agent says it is done.
6. **Ship it.** See [Merging worktree and parent branch](#merging-worktree-and-parent-branch).
@@ -76,7 +76,7 @@ A related pattern: use the sidebar as an investigation surface. Start two or thr
### 5. A worktree per bug
For a day of small fixes: one worktree per bug. Use `Cmd+N` to configure each worktree or `Cmd+Shift+N` to create one immediately from the default branch, merge each quickly so none drift. Close the worktree when the fix lands.
For a day of small fixes: one worktree per bug. Use `Cmd+N` to configure each worktree or `Cmd+Shift+N` to create one immediately from the configured default base branch, merge each quickly so none drift. Close the worktree when the fix lands.
### 6. Multiple sessions on one branch
@@ -35,6 +35,16 @@ The panel opens as an editor tab and stays active across focus changes.
- Use a git repository for worktree features
- Open the main repository, not an existing worktree checkout, when creating new worktrees
## Project-scoped settings
Agent Manager worktree defaults belong to a repository. Open a project's settings button, then select the **Agent Manager** tab in Kilo Settings. The repository selector controls which project's default base branch and setup script you edit.
- **Automatic selection:** Opening settings from a project selects that repository. When you open the settings tab directly, Agent Manager restores the last selected repository if it is still listed, or uses the current workspace repository.
- **Explicit selection:** Choose another repository from the **Project** selector before changing its settings. The **Default Base Branch** control uses **Auto-detect** by default, or you can choose a specific branch. The selected value is saved for that repository and is used when creating new worktrees.
- **Stale branches:** If a saved default branch no longer exists, Agent Manager clears it when it refreshes the repository's branch list and returns to **Auto-detect**. Choose a new branch to set an explicit default again.
The **Worktree Setup Script** control opens or creates the setup script for the selected repository. See [Setup Scripts](#setup-scripts) for supported filenames and execution behavior.
## Providers and Authentication
Agent Manager uses the same sign-in, provider settings, models, BYOK keys, custom providers, MCP servers, and permission rules as the extension sidebar. Configure them from extension Settings and they apply to Agent Manager as well.
@@ -104,15 +114,46 @@ Hovering over a worktree item shows a card with additional PR details:
PR badges update automatically in the background. The active worktree refreshes frequently, while other worktrees sync periodically to keep badges current. Polling pauses when the Agent Manager panel is hidden.
### Reviewing a pull request
The PR review panel is available when the selected worktree has an associated pull request. Open it in either of these ways:
- Click the pull request icon in the Agent Manager toolbar
- Press `Cmd+Shift+R` (macOS) or `Ctrl+Shift+R` (Windows/Linux)
The selected worktree controls the panel. The panel shows the worktree branch and its parent branch, so confirm that you are reviewing the intended branch. The PR association uses the detection methods described above, including the branch tracking ref, branch name, or current commit SHA.
The panel includes:
- **Status:** Open, Draft, Merged, or Closed
- **Review status:** Approved, Changes Requested, or Review Pending
- **Checks:** passed, failed, running, cancelled, or skipped checks, with duration and browser links when available
- **Reviewers:** requested reviewers and their current state, such as Approved, Changes requested, Commented, or Awaiting
- **Description and summary:** the PR description, file count, additions, deletions, and unresolved comment count
#### Review comments
Expand a comment to read its Markdown body, replies, file and line location, and a bounded diff hunk around the commented line. Outdated threads show an **Outdated** label. Unresolved threads appear first. Resolved threads move into the **Resolved** group and are collapsed by default. Click a thread row to expand or collapse it.
Use the actions on an expanded thread to:
- **Send** the comment, its diff context, and replies to the current agent. **Send all unresolved** sends the unresolved threads together, up to the panel limit.
- **Resolve** or **Unresolve** the GitHub conversation. The panel refreshes the thread state after the action completes.
- **Copy** the formatted thread context
- **Open file** at the comment location in the selected worktree
- **Open on GitHub** at the comment
The panel header also provides **Copy PR link**, **Open in browser**, and **Close**. Sending a comment gives it to Kilo as review context. It does not post a reply to GitHub. The panel intentionally has no reply composer; write replies in GitHub.
### Creating a New Worktree Session
1. Click **New Worktree** or press `Cmd+N` (macOS) / `Ctrl+N` (Windows/Linux) to open the new worktree dialog
2. Enter a branch name (or let Kilo generate one)
3. Type your first message, then create the worktree
A new git worktree is created from your current branch. The agent works in isolation your main branch is unaffected.
Kilo creates the worktree from the selected project's configured default base branch. In a multi-project workspace, the selected project determines this setting. An explicit base branch selected in the dialog takes precedence. If no default is configured, Kilo falls back to automatic detection of the repository's remote default branch. The agent works in isolation, so your main branch is unaffected.
To create a worktree immediately from the default base branch, press `Cmd+Shift+N` (macOS) / `Ctrl+Shift+N` (Windows/Linux).
To create a worktree immediately from the default base branch, press `Cmd+Shift+N` (macOS) / `Ctrl+Shift+N` (Windows/Linux). This uses the selected project's configured default, or the automatic remote-default fallback when no configured default exists.
### Slash Commands in the Worktree Prompt
@@ -149,8 +190,13 @@ Imported work stays associated with its branch or worktree and can be continued
- Create a worktree session to start a new agent in an isolated branch
- Press `Cmd+T` (macOS) / `Ctrl+T` (Windows/Linux) to start another session in the selected worktree
- Use session history to reopen local sessions or preview cloud sessions
- When a worktree is selected, open session history to use the **Worktree** source, which is selected by default and lists only sessions assigned to that worktree. Opening a worktree session returns to its owning worktree.
- Continue a cloud session locally from Agent Manager using the same extension sign-in and provider settings
File mentions, clickable file links, review-comment file links, file-link validation, and native VS Code opening resolve against the referenced session's directory or worktree. If a session ID is present in multiple projects, Kilo rejects the unqualified reference rather than choosing an arbitrary project.
When a session delegates work to a subagent, open the child transcript from its task card or background-agent row. Agent Manager displays it in the read-only **Subagents** inspector. The inspector supports multiple child-session tabs and keeps them scoped to the selected project and parent session. For the difference between Agent Manager inspector tabs and the separate subagent editor tabs used by the sidebar, see [Inspecting delegated sessions in VS Code](/docs/customize/custom-subagents#inspecting-delegated-sessions-in-vs-code).
### Renaming Worktrees
Double-click a worktree name to edit its label inline. You can also right-click the worktree and choose **Rename**. Press `Enter` or click outside the field to save, or press `Escape` to cancel.
@@ -220,16 +266,32 @@ Right-click the section header and select **Delete Section**. The section is rem
- **Cancel:** Sends a cooperative stop signal to the agent
- **Stop:** Force-terminates the session and marks it as stopped
## Previewing pending edits
When an agent requests permission to run `edit`, `write`, or `apply_patch`, the permission card shows the proposed file changes. In Agent Manager, select the expand button on the file diff to open an **Edit preview** in the side panel.
The preview supports patches that contain multiple files and shows each file's diff. Use the view selector to switch between **unified** and **split** views. You can close the preview without changing the request or its patch.
Previewing only displays the proposed changes. It does not approve or deny the pending tool request, apply changes to your local checkout, or revert a file. Make those decisions and use those actions from their respective controls. Outside Agent Manager, the same file-diff control opens the preview in a separate diff tab instead of the side panel.
## Diff / Review Panel
Press `Cmd+D` (macOS) / `Ctrl+D` (Windows/Linux) to toggle the diff panel. It shows a live-updating diff between the worktree and its parent branch.
The worktree creation base and the diff comparison base are separate. The Branch scope starts with the worktree's recorded parent branch, and its base-branch picker changes only the comparison target. It does not change the branch from which the worktree was created.
- Select files and click **Apply to local** to copy the worktree's changes onto your local checkout of the base branch
- Conflicts are surfaced with a resolution dialog
- Supports unified and split diff views
- Markdown files include an eye/code toggle in the file header to switch between rendered Markdown and the raw diff
- **Drag file headers into chat** — drag a file header from the diff panel into the chat input to insert an `@file` mention, giving the agent context about specific changed files
### Sending review comments
Add comments in the diff panel or in the rendered view of a Markdown document. Click **Send all to chat** to send the collected comments to chat. If an Agent Manager terminal is active, the comments are sent to that terminal instead. Press `Cmd+Enter` (macOS) or `Ctrl+Enter` (Windows/Linux) to use the same action from the review panel.
After sending, the local comment collection is cleared. To discard collected comments without sending them, click **Clear all** in the chat input.
### Diff Scope
A scope selector in the diff toolbar (both in the side panel and the full-screen review) chooses which changes the diff shows:
@@ -243,10 +305,27 @@ The Branch scope also has a base-branch picker next to it for overriding the com
See [Agent Manager Workflows](/docs/automate/agent-manager-workflows#merging-worktree-and-parent-branch) for the full integration story, including when to apply locally vs. merge directly vs. open a pull request.
## Documents inspector
The Documents inspector previews Markdown file references from Agent Manager chat without leaving the panel. Open a file reference to add it as a document tab, then use the tab strip to switch, reorder, or close open documents. The inspector keeps one tab per file in the active project and worktree context.
- Markdown files (`.md`, `.mdx`, and `.markdown`) open in rendered view by default. Use the preview/source toggle to switch between rendered Markdown and syntax-highlighted source.
- The document renderer also supports syntax-highlighted text and inline PNG, JPEG, GIF, WebP, and SVG previews when a document payload is available. Normal Agent Manager file-opening actions route non-Markdown source references to the native VS Code editor.
- Use **Open file** to open the document in the native VS Code editor. The original line and column are preserved when available.
- Unsupported, binary, missing, out-of-scope, or oversized files show an error fallback in the inspector. Text previews are limited to 2 MB and image previews to 5 MB; open the file in VS Code to inspect larger or unsupported content.
### Inline document review
In a rendered Markdown preview, use the comment control in the line gutter to add a comment at that line. Clicking a line number opens that location in the native editor. Draft comments can be edited or deleted, sent individually to the active session, or sent together with **Send all to chat**. Comments are attached to the document path and line, and remain isolated to the active project and worktree context.
The project and worktree context owns document tabs, loaded content, and comments. The session ID attached to an opened file selects the session's worktree for reading and native-editor navigation. Sessions that share one worktree also share its document inspector state; switching project or worktree changes the visible context without mixing tabs or comments across worktrees.
## Terminals
Each session has a dedicated terminal rooted in the session's worktree directory. Press `Cmd+/` (macOS) / `Ctrl+/` (Windows/Linux) to focus the terminal for the active session. If the embedded terminal is already visible but the prompt has focus, the same shortcut focuses the terminal without hiding it. Press it again while the terminal has focus to hide the panel.
When you use `@terminal` in an Agent Manager prompt, Kilo captures the focused terminal for the selected session or worktree. This includes embedded **Run** and **Setup** tabs. Terminal context is limited to 500 lines or 50,000 characters; longer output is truncated.
### Choosing the Terminal Destination
The toolbar's terminal button is a split button: click it to open a terminal, or use its dropdown to choose where terminals open:
@@ -428,9 +507,11 @@ Closing a managed worktree removes it from Agent Manager, deletes its `.kilo/wor
- **"Please open a folder…" error** — the Agent Manager requires a VS Code workspace folder
- **Worktree creation fails** — ensure Git is installed and the workspace is a valid git repository. Open the main repository (where `.git` is a directory), not an existing worktree checkout.
- **A configured base branch is missing** — Kilo clears the stale project setting and uses automatic remote-default detection for the new worktree. Select the project and configure a new default if needed.
- **Provider or authentication errors** — open extension Settings and verify your sign-in, provider, model, or BYOK configuration. Agent Manager uses the same settings as the sidebar.
- **Session history missing cloud sessions** — sign in through the extension and confirm the repository remote matches the sessions you expect to see.
- **PR badges or PR import missing** install and authenticate the GitHub CLI (`gh`). This is only required for GitHub PR features.
- **PR badges, the review panel, or PR import missing:** install the GitHub CLI (`gh`) and authenticate it for the repository. Run `gh auth status` to check the current login. GitHub PR features do not work until `gh` is available and authenticated.
- **PR data looks temporarily stale:** polling pauses while the Agent Manager panel is hidden, and background updates are not instantaneous. Close and reopen the PR panel, or switch worktrees and select the original worktree again, to trigger a fresh lookup. A transient GitHub, network, or fork lookup failure can leave the last known PR data visible until the next successful refresh.
## Related features
@@ -42,13 +42,13 @@ The CLI automatically detects the appropriate shell for your platform using `She
## Agent Manager Terminals (VS Code Extension)
When using the Kilo Code VS Code extension with the Agent Manager, each agent session gets its own dedicated VS Code terminal.
When using the Kilo Code VS Code extension with the Agent Manager, each agent session gets its own terminal. Depending on the terminal destination, this is either a dedicated VS Code integrated terminal or an embedded terminal in the Agent Manager panel.
### Per-Session Terminals
- Each session creates a terminal named **`Agent: {branch}`**, where `{branch}` is the git branch or worktree the session is working in
- Each session creates a terminal named **`Agent: {branch}`**, where `{branch}` is the git branch or worktree the session is working in, when you use a VS Code integrated terminal
- The terminal's working directory is automatically set to the session's worktree directory
- Terminals are standard VS Code integrated terminals — you can interact with them directly
- VS Code terminal destinations are standard integrated terminals. The Agent Manager panel destination uses embedded terminals in the Agent Manager layout.
### Keyboard Shortcuts
@@ -59,7 +59,7 @@ When using the Kilo Code VS Code extension with the Agent Manager, each agent se
### Terminal Context Menu Actions
Right-click in an Agent Manager terminal to access these actions:
Right-click in a VS Code integrated Agent Manager terminal to access these actions:
- **Add Terminal Content to Context** — sends the terminal's visible output to the agent as context
- **Fix This Command** — asks the agent to diagnose and fix the last failed command
@@ -67,7 +67,7 @@ Open your terminal and run `kilo` to launch the interactive terminal interface (
**Providing context:**
The extension automatically passes context from your editor, including your open tabs and active file. You can type `@` in the chat input to get file and terminal autocomplete suggestions — use `@filename` to attach a file or `@terminal` to include your active terminal output. You can also mention file paths naturally in your message (e.g., "update src/utils.ts to add a helper function"). The agent can also discover files on its own using its built-in tools.
The extension automatically passes context from your editor, including your open tabs and active file. You can type `@` in the chat input to get file and terminal autocomplete suggestions. Use `@filename` to attach a file. In the sidebar, `@terminal` includes the active VS Code terminal output. In Agent Manager, it includes the focused terminal for the selected session or worktree, including embedded **Run** and **Setup** tabs. You can also mention file paths naturally in your message (e.g., "update src/utils.ts to add a helper function"). The agent can also discover files on its own using its built-in tools.
**Exporting local transcripts:**
@@ -23,12 +23,14 @@ Type `@` in the chat input to get autocomplete suggestions. You can mention:
| Mention | Description | Example |
|---|---|---|
| **File** | Attach a file's contents to your message | `@src/utils.ts` |
| **Terminal** | Include your active VS Code terminal output | `@terminal` |
| **Terminal** | In the sidebar, include the active VS Code terminal output. In Agent Manager, include the focused terminal for the selected session or worktree, including embedded **Run** and **Setup** tabs. | `@terminal` |
| **Git Changes** | Attach uncommitted working-tree diffs and new files | `@git-changes` |
| **Past chats** | Add a previous session's chat history as context | `@`**Past chats** → pick a session |
Selecting a suggestion inserts the mention and highlights it in the input. File contents, terminal output, and git changes are attached as context when you send the message.
Terminal context is limited to 500 lines or 50,000 characters. Longer output is truncated. If no terminal content is available, Kilo reports that terminal content is unavailable instead of attaching an empty file.
### Referencing Past Chats
Choosing **Past chats** from the `@` menu opens a searchable picker of sessions in the current workspace and related Git worktrees, including Agent Manager worktrees, ordered by recency. Search matches session titles and worktree names. Selecting a session inserts a highlighted mention token; when you send the message, that session's current chat history is added as context so the agent can build on the earlier conversation. Clicking the mention token opens the referenced session.
@@ -56,6 +58,10 @@ The extension automatically includes context from your editor with each message
Selected code and editor diagnostics (errors/warnings) are not included automatically. However, you can send these to Kilo Code through VS Code's Code Actions: select code or hover over an error, then use the lightbulb menu to find context-dependent actions like "Explain with Kilo Code" or "Fix with Kilo Code."
### Session-scoped file references
In Agent Manager, file mentions, clickable file links, and review-comment file links use the referenced session's directory or worktree. File-link validation and native VS Code opening use the same scope, even after you switch sessions. Kilo rejects an unqualified session ID when it is ambiguous across projects instead of opening or validating a file in the wrong project.
### Tool-Based File Access
Rather than attaching file contents up front, the agent reads files on demand during its work:
@@ -29,7 +29,7 @@ While the specifics change constantly, some principles stay consistent:
- Press `Shift+Tab` in the prompt input to cycle to the next reasoning effort variant, wrapping after the last one. This works in the sidebar chat, the Agent Manager prompt, and the New Worktree dialog, and the variant selector tooltip shows the shortcut on hover. To keep `Shift+Tab` for keyboard focus navigation instead, disable the `kilo-code.new.chat.shiftTabCyclesVariant` setting (also available under **Settings → Display**).
- Set per-agent defaults and a global default in the **Settings** panel (Models tab), or directly in the `kilo.jsonc` config file.
- **Model precedence:** Session override → Last picked per agent → Per-agent config → Global config → [Auto Free](/docs/code-with-ai/agents/auto-model#tiers) (note: Auto Free may route to providers that log prompts — see the Auto Model page for details).
- The model selector remembers the last model you picked for each agent switching agents restores your previous choice. A manual pick always beats config settings; use the **reset button** (visible when your active model differs from config) to go back to the config default.
- The model selector remembers the last model you picked for each agent, so switching agents restores your previous choice. A manual pick always beats config settings.
{% /tab %}
{% tab label="CLI" %}
@@ -17,7 +17,7 @@ Different search surfaces cover different content and scopes:
| Method | Searches | Scope |
|---|---|---|
| [VS Code History](#search-session-history-in-vs-code) | Session titles | Sessions loaded in the selected Local or Cloud history view |
| [VS Code History](#search-session-history-in-vs-code) | Session titles | Sessions loaded in the selected Local, Cloud, or Worktree history view |
| [JetBrains History](#search-session-history-in-jetbrains) | Session titles | Sessions loaded in the selected Local or Cloud history view |
| [CLI Past chats](#reference-a-past-chat-in-the-cli-tui) | Session titles | Current workspace |
| [`kilo session list --search`](#filter-session-titles) | Session titles | Current workspace, or every local workspace with `--all` |
@@ -43,6 +43,8 @@ History and CLI list searches do **not** search message content. To find a strin
Local history actions also let you rename, export, or delete a session. Cloud history can be filtered to **Only this repository**.
In Agent Manager, select a worktree before opening **History**. The **Worktree** source is selected by default and lists only sessions assigned to that worktree. When you open a worktree session, Agent Manager returns to its owning worktree. Select **Local** or **Cloud** to view another source.
The History search is a fuzzy title search over the sessions currently loaded into the view. It does not search prompts or agent replies.
### Search the open chat session
@@ -159,11 +159,8 @@ Triggers allow you to initiate cloud agent sessions automatically, either via HT
Triggers are currently in beta and subject to change.
{% /callout %}
Webhook triggers and scheduled triggers use the same trigger concepts across Cloud
Agent and KiloClaw, but target different agents. Use Cloud Agent triggers when an
HTTP event or schedule should start a Cloud Agent session against a repository.
Use KiloClaw triggers when the event should deliver a chat message to a KiloClaw
instance.
Use Cloud Agent triggers when an HTTP event or schedule should start a Cloud Agent
session against a repository.
### Accessing Triggers
@@ -5,7 +5,7 @@ description: "Using Kilo Code on iOS and Android"
# Mobile Apps
Use Kilo Code from your phone to keep coding sessions moving while you are away from your desk. The mobile app connects to Cloud Agents, KiloClaw, and remote sessions from your local CLI or editor extensions.
Use Kilo Code from your phone to keep coding sessions moving while you are away from your desk. The mobile app connects to Cloud Agents and remote sessions from your local CLI or editor extensions.
{% callout type="info" title="Android app available now" %}
Install Kilo Code for Android from [Google Play](https://play.google.com/store/apps/details?id=com.kilocode.kiloapp).
@@ -16,10 +16,8 @@ Install Kilo Code for Android from [Google Play](https://play.google.com/store/a
The mobile app lets you:
- View and manage Kilo Code sessions, including remote CLI and extension sessions running on your local machine.
- Chat with KiloClaw from your phone.
- Spawn Cloud Agents and code directly from the app.
- Monitor and view all non-remote sessions in one place.
- Create, onboard, and manage KiloClaw instances.
- Send follow-up messages while a session is still running — they are queued and processed in order.
- Run slash commands (like `/compact`) on connected remote CLI sessions, and start a new session in the same workspace with `/new`. The new session inherits the current session's mode and model. Older CLI versions that do not support remote commands prompt you to upgrade.
- Clear the visible transcript of a remote CLI session with `/clear`. Clearing is client-side only, so it works on any CLI version; server history is kept and may reappear when you re-enter the session.
@@ -38,16 +36,14 @@ You can review or change your decision at any time in **Settings**. Declining op
For Kilo Pass pricing, billing, and account management details, use the [Kilo Pass pricing page](https://kilo.ai/pricing/kilo-pass).
{% imageGallery columns="3" width="220px" %}
{% image src="/docs/img/mobile-apps/home.webp" alt="Kilo Code mobile home screen showing KiloClaw and active agent sessions" caption="Start coding tasks, open KiloClaw, and resume active sessions from the mobile home screen." /%}
{% image src="/docs/img/mobile-apps/home.webp" alt="Kilo Code mobile home screen showing active agent sessions" caption="Start coding tasks and resume active sessions from the mobile home screen." /%}
{% image src="/docs/img/mobile-apps/new-session.webp" alt="Kilo Code mobile new session screen with coding mode selector" caption="Create a new Cloud Agent session and choose the right mode for the task." /%}
{% image src="/docs/img/mobile-apps/session-chat.webp" alt="Kilo Code mobile session chat with an active coding task" caption="Review progress and continue coding conversations from the mobile app." /%}
{% /imageGallery %}
{% imageGallery columns="2" width="220px" %}
{% image src="/docs/img/mobile-apps/kiloclaw-chat.webp" alt="KiloClaw chat in the Kilo Code mobile app" caption="Chat with KiloClaw on mobile." /%}
{% imageGallery columns="1" width="220px" %}
{% image src="/docs/img/mobile-apps/session-filters.webp" alt="Kilo Code mobile session filter panel for Cloud Extension CLI Slack and other platforms" caption="Filter sessions by platform and project, including Cloud, Extension, CLI, Slack, and other sessions." /%}
{% /imageGallery %}
@@ -35,6 +35,28 @@ Key features include:
- **Sub-Agent Viewer** — Read-only panels for viewing child agent sessions
- **Legacy Migration** — Automatic migration wizard for VSCode extension settings
## Background agents
When Kilo starts an agent in the background, a collapsible status strip appears in the chat header. The strip stays visible while the transcript scrolls, so you can check background work without searching the conversation. Click the strip to expand it and see each agent.
Each agent shows one of these states:
| State | Meaning |
|---|---|
| **Running** | The agent is still working. |
| **Done** | The agent completed successfully. |
| **Cancelled** | The agent was stopped before it completed. |
| **Error** | The agent stopped because it encountered an error. |
An agent can also show **Needs input** when it is waiting for a permission decision or an answer to a question. Open the agent row to inspect its read-only transcript and handle the request in the child-agent view. In the sidebar and Kilo tab, the transcript opens in a read-only editor tab. In Agent Manager, it opens in the right-hand inspector.
Use these controls in the expanded strip:
- **Stop** cancels a running agent and its child session.
- **Dismiss** hides one finished agent from the strip. It does not delete the transcript or the agent record.
- **Clear finished** hides all agents that are no longer running.
- **Continue in background** appears when a foreground subagent is running. It detaches that work so the parent session can continue while the subagent runs in the background.
## Shared Settings
Settings apply across extension surfaces, including the sidebar and Agent Manager. The standalone CLI uses the same `~/.config/kilo/kilo.jsonc` (global) and `./kilo.jsonc` (project) files when used directly.
@@ -0,0 +1,105 @@
---
title: "Manage sub-organizations"
description: "Manage people, usage, credits, model policy, and permissions across enterprise sub-organizations"
---
# Manage sub-organizations
{% callout type="info" %}
Sub-organization management is available to Enterprise organizations with a parent organization and direct sub-organizations.
{% /callout %}
Sub-organizations let you separate teams, business units, or cost centers while managing them from one parent organization. Each sub-organization keeps its own members, credits, usage, and policies.
The hierarchy has one level. A parent organization can have direct sub-organizations, but a sub-organization cannot contain another sub-organization.
## Access sub-organization management
1. Sign in to the [Kilo Web App](https://app.kilo.ai).
2. Open the parent organization.
3. Select **Sub-organizations** in the organization navigation, or select **Manage Sub-Organizations** from the Sub-organizations card on the organization overview.
Only parent organization Owners, Admins, and Billing Managers can open the consolidated management area. Members of the parent organization and Owners of individual sub-organizations cannot use it to inspect other sub-organizations.
{% image src="/docs/img/enterprise/sub-organizations-overview.webp" alt="Sub-organization management overview showing organization membership, seats, balances, and spend" width="100%" caption="Compare direct sub-organizations from the Overview section." /%}
## Create a sub-organization
Parent organization Owners and Admins can create direct sub-organizations.
1. Open **Sub-organizations** from the parent organization.
2. Select **Overview**.
3. Select **Create sub-organization**.
4. Enter an organization name.
5. Select **Create sub-organization** to confirm.
The new sub-organization starts empty. It does not automatically copy parent members, model policy, or organization settings. Parent Owners, Admins, and Billing Managers receive inherited management access without becoming members of the new sub-organization.
{% callout type="note" %}
Billing Managers can view sub-organizations and manage financial operations, but they cannot create a sub-organization.
{% /callout %}
{% image src="/docs/img/enterprise/create-sub-organization.webp" alt="Create sub-organization dialog with an organization name field" width="100%" caption="Create an empty direct sub-organization from the parent organization." /%}
## Use the management sections
The sub-organization area separates reporting and administrative tasks into focused sections.
| Section | What it shows |
|---|---|
| **Overview** | Membership, seats, balances, and recent spend for each direct sub-organization. |
| **People** | One row per identity across the parent and its sub-organizations, including parent roles, accepted memberships, and pending invitations. |
| **Usage** | Requests, tokens, cost, and active users for a selected time range. |
| **Credits** | Credit balances, acquired and used credits, expirations, auto top-up status, Kilo Pass allocation, recent spend, and estimated runway. |
| **Distribute funds** | Transfer organization credits from the parent to one or more sub-organizations. |
| **Models** | Compare configured model, provider, group, automatic routing, and data-collection policy across organizations. |
| **Permissions** | Review ownership, roles, SSO policy, feature settings, daily spend limits, and inherited parent access. |
### Find people across the hierarchy
The **People** section combines each person into one record, even when that person belongs to multiple sub-organizations. Use it to:
- Search by name or email.
- Filter by sub-organization, role, membership status, or assignment status.
- Sort by identity, parent role, or number of sub-organization memberships.
- Distinguish accepted memberships from pending invitations.
- Find parent members who are not assigned to a sub-organization.
The People section reports current membership. To invite a new person, change a role, or remove a member, open the relevant organization's member settings.
{% image src="/docs/img/enterprise/sub-organizations-people.webp" alt="Sub-organization People section with search, role, status, assignment, and organization filters" width="100%" caption="Search and filter people across the parent and its sub-organizations." /%}
### Review usage and credits
Use **Usage** to compare activity across sub-organizations for the same period. Filter the results by model or provider and switch between cost, requests, tokens, and active users.
Use **Credits** to compare financial state across sub-organizations. Kilo Pass allocation represents pooled credit capacity for an organization, not passes assigned to individual people. If a future allocation differs from the current allocation, the table shows the transition separately.
Use **Distribute funds** when you need to transfer credit balance. Kilo Pass capacity and credit balance are separate quantities and are managed separately.
{% image src="/docs/img/enterprise/sub-organizations-credits.webp" alt="Sub-organization Credits section comparing balances, expirations, Kilo Pass allocation, spend, and runway" width="100%" caption="Compare credit state and Kilo Pass allocation across sub-organizations." /%}
### Compare models and permissions
The **Models** section compares the parent and each sub-organization. Parent and sub-organization policies are independent: changing the parent policy does not change or constrain a sub-organization policy.
The section distinguishes configured restrictions from restrictions that are actively enforced by the organization's plan. Open an organization's own settings when you need to change its model policy.
Use **Permissions** to identify sub-organizations without an independent Owner, review effective SSO policy, and see which parent users have inherited access. Inherited access does not create a membership or consume a seat in the sub-organization.
{% image src="/docs/img/enterprise/sub-organizations-models.webp" alt="Sub-organization Models section comparing configured model and provider policies" width="100%" caption="Review independent model policy for the parent and each sub-organization." /%}
## Recommended setup
- Give every sub-organization at least one direct Owner. Inherited parent access does not replace independent ownership.
- Use names that identify a team, business unit, or cost center consistently.
- Review usage and credit runway regularly before distributing additional funds.
- Configure model and SSO policy for each organization intentionally; parent settings do not cascade automatically.
- Use the parent organization for shared oversight, not as a substitute for direct sub-organization membership.
## Related documentation
- [Model Access Controls](/docs/collaborate/enterprise/model-access-controls)
- [SSO](/docs/collaborate/enterprise/sso)
- [Audit Logs](/docs/collaborate/enterprise/audit-logs)
- [Team Management](/docs/collaborate/teams/team-management)
@@ -39,6 +39,7 @@ Kilo Code's paid plans provide powerful team management features:
Enterprise features for large organizations:
- [**Sub-organizations**](/docs/collaborate/enterprise/sub-organizations) — Manage people, usage, credits, models, and permissions across business units
- [**Audit Logs**](/docs/collaborate/enterprise/audit-logs) — Track and audit team activity
- [**SSO**](/docs/collaborate/enterprise/sso) — Single sign-on with OIDC and SCIM
- [**Model Access Controls**](/docs/collaborate/enterprise/model-access-controls) — Limit models and providers
@@ -223,4 +223,3 @@ After system-boundary pages, continue with Development Patterns for implementati
- [Development Patterns](/docs/contributing/architecture/development-patterns) - code-ownership decisions and contributor workflow
- [Development Environment](/docs/contributing/development-environment) - setup guide
- [Ecosystem](/docs/contributing/ecosystem) - related projects and integrations
- [KiloClaw Overview](/docs/kiloclaw/overview) - customer-facing KiloClaw docs
@@ -16,7 +16,7 @@ This document will help you set up your development environment and understand h
Before you begin, make sure you have the following installed:
1. **Git** - For version control
2. **Bun 1.3.14+** - Required for installing dependencies and running scripts
2. **Bun 1.4.0+** - Required for installing dependencies and running scripts
3. **Visual Studio Code** - Our recommended IDE for development
4. **Java 21** - Required only when running JetBrains plugin checks or repo-level checks that include `@kilocode/kilo-jetbrains`
@@ -254,6 +254,14 @@ kilo agent list
This displays each agent's name, mode, and permission configuration.
## Inspecting delegated sessions in VS Code
When a subagent is delegated from a session in the VS Code extension, open its transcript from the task card or background-agent row. In Agent Manager, the transcript opens in the **Subagents** inspector as a read-only tab. Use the inspector tab strip to switch between multiple child sessions, reorder tabs, or close tabs.
Inspector tabs are scoped to the current project and parent session. When you switch worktrees or sessions, Agent Manager shows the tabs for that project and parent only, so child transcripts from another session are not mixed into the current view.
This differs from the sidebar and Kilo editor subagent tabs. In those surfaces, **Open in Tab** opens the child transcript as a separate read-only VS Code editor tab. Agent Manager keeps the transcript inside its right-hand inspector alongside the session's other panels. In both surfaces, the child session is a delegated transcript, not a new prompt you can send messages to directly.
## Configuration Precedence
Agent configurations are merged from multiple sources. Later sources override earlier ones:
+6 -65
View File
@@ -66,25 +66,6 @@ const terminalContent = {
<span className="terminal-prompt">$</span> kilo rules list
</>
),
kiloclaw: (
<>
<span className="terminal-comment"># Chat with your KiloClaw agent from the CLI</span>
{"\n"}
<span className="terminal-prompt">$</span> kilo /claw
{"\n"}
{"\n"}
<span className="terminal-comment"># Or connect via chat platforms</span>
{"\n"}
<span className="terminal-comment"># Telegram, Discord, Slack no self-hosting required</span>
{"\n"}
{"\n"}
<span className="terminal-comment"># Trigger your agent via webhook</span>
{"\n"}
<span className="terminal-prompt">$</span> curl -X POST https://your-instance.kiloclaw.ai/webhook \{"\n"}
-H "Content-Type: application/json" \{"\n"}
{` -d '{"event":"deploy","repo":"my-app"}'`}
</>
),
}
// Category card data based on the information architecture
@@ -120,24 +101,6 @@ const categories = [
{ title: "Custom Rules", href: "/code-with-ai" },
],
},
{
title: "KiloClaw",
description:
"Hosted OpenClaw agents — deploy, manage, and integrate AI agents with chat platforms, dev tools, and triggers without self-hosting.",
href: "/kiloclaw/overview",
icon: (
<svg className="category-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
<path d="M12 2L2 7l10 5 10-5-10-5z" strokeLinecap="round" strokeLinejoin="round" />
<path d="M2 17l10 5 10-5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M2 12l10 5 10-5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
),
links: [
{ title: "Overview", href: "/kiloclaw/overview" },
{ title: "Chat Platforms", href: "/kiloclaw/chat-platforms" },
{ title: "Development Tools", href: "/kiloclaw/development-tools" },
],
},
{
title: "Collaborate",
description: "Work with teams, share sessions, and manage organizations",
@@ -230,9 +193,7 @@ const categories = [
]
export default function HomePage() {
const [activeTab, setActiveTab] = useState<"installation" | "firstTask" | "customRules" | "gateway" | "kiloclaw">(
"installation",
)
const [activeTab, setActiveTab] = useState<"installation" | "firstTask" | "customRules" | "gateway">("installation")
return (
<div className="homepage">
@@ -247,15 +208,15 @@ export default function HomePage() {
<div className="hero-content">
<h1 className="hero-title">Kilo Documentation</h1>
<p className="hero-subtitle">
Explore guides and examples for the Kilo platform from coding agents and AI-powered development to hosted
agentic infrastructure with KiloClaw.
Explore guides and examples for the Kilo platform from coding agents and AI-powered development to
automation and hosted agentic infrastructure.
</p>
<div className="hero-buttons">
<Link href="/getting-started" className="btn btn-primary">
Get started with Kilo Code
</Link>
<Link href="/kiloclaw/overview" className="btn btn-secondary">
Explore KiloClaw
<Link href="/gateway" className="btn btn-secondary">
Explore Kilo Gateway
</Link>
</div>
</div>
@@ -276,20 +237,6 @@ export default function HomePage() {
</Link>
</div>
</div>
<div className="quick-section">
<h3 className="quick-title">KILOCLAW</h3>
<div className="quick-links">
<Link href="/kiloclaw/overview" className="quick-link">
Overview
</Link>
<Link href="/kiloclaw/chat-platforms" className="quick-link">
Chat Platforms
</Link>
<Link href="/kiloclaw/development-tools" className="quick-link">
Development Tools
</Link>
</div>
</div>
<div className="quick-section">
<h3 className="quick-title">PLATFORMS</h3>
<div className="quick-links">
@@ -348,7 +295,7 @@ export default function HomePage() {
<section className="terminal-section">
<div className="terminal-intro">
<h2 className="section-title">Try it out</h2>
<p className="terminal-description">Get started quickly with Kilo Code, KiloClaw, and Kilo Gateway</p>
<p className="terminal-description">Get started quickly with Kilo Code and Kilo Gateway</p>
</div>
<div className="terminal-container">
<div className="terminal-tabs">
@@ -370,12 +317,6 @@ export default function HomePage() {
>
Custom Rules
</button>
<button
className={`terminal-tab ${activeTab === "kiloclaw" ? "active" : ""}`}
onClick={() => setActiveTab("kiloclaw")}
>
KiloClaw
</button>
<button
className={`terminal-tab ${activeTab === "gateway" ? "active" : ""}`}
onClick={() => setActiveTab("gateway")}
@@ -5,6 +5,8 @@ description: "Use KiloClaw with Discord: setup, DM access control, and channel c
# Discord
{% partial file="kiloclaw-eol.md" /%}
This page covers everything you need to use KiloClaw with Discord: connecting your bot, controlling who can DM it, and adding it to specific channels.
## Connecting KiloClaw to Discord
@@ -5,6 +5,8 @@ description: "Use Kilo Chat or connect your KiloClaw agent to Telegram, Discord,
# Chat Platforms
{% partial file="kiloclaw-eol.md" /%}
KiloClaw includes Kilo Chat as its first-party channel and also supports connecting your AI agent to messaging platforms so it can receive instructions and send responses directly in your chat apps. You can configure third-party channels from the **Settings** tab on your [KiloClaw dashboard](/docs/kiloclaw/dashboard#channels), or from the OpenClaw Control UI after accessing your instance.
## Kilo Chat
@@ -5,6 +5,8 @@ description: "Using KiloClaw with Slack"
# Slack
{% partial file="kiloclaw-eol.md" /%}
This page covers everything you need to use KiloClaw with Slack: connecting your bot, controlling who can DM it, and adding it to channels.
## Connecting KiloClaw to Slack
@@ -5,6 +5,8 @@ description: "Use KiloClaw with Telegram: setup, DM access control, and group ch
# Telegram
{% partial file="kiloclaw-eol.md" /%}
This page covers everything you need to use KiloClaw with Telegram: connecting your bot and adding it to group chats.
## Connecting KiloClaw to Telegram
@@ -5,6 +5,8 @@ description: "Browse and switch models from the Control UI chat"
# Changing Models
{% partial file="kiloclaw-eol.md" /%}
The Control UI Chat tab doubles as a command line for model management. KiloClaw exposes 335+ models through the `kilocode` provider and you can browse and switch between them without leaving the chat.
| Command | Description |
@@ -5,6 +5,8 @@ description: "Control which commands your KiloClaw agent can run on the host mac
# Exec Approvals
{% partial file="kiloclaw-eol.md" /%}
Exec approvals are the safety interlock that controls which commands your agent can run on the host machine (gateway or node). By default, **all host exec requests are denied** — you must explicitly allowlist the commands you want your agent to run independently. This prevents accidental execution of destructive commands.
{% callout type="warning" %}
@@ -5,6 +5,8 @@ description: "Browser-based dashboard for managing your OpenClaw instance"
# OpenClaw Control UI
{% partial file="kiloclaw-eol.md" /%}
The Control UI is a browser-based dashboard (built with Vite + Lit) served by the OpenClaw Gateway on the same port as the gateway itself (default: `http://localhost:18789/`). It connects via WebSocket and gives you real-time control over your agent, channels, sessions, and system configuration. For KiloClaw users, see [Accessing the Control UI](/docs/kiloclaw/dashboard#accessing-the-control-ui) to get started.
## Features
@@ -5,6 +5,8 @@ description: "Pin your KiloClaw instance to a specific OpenClaw version and vari
# Version Pinning
{% partial file="kiloclaw-eol.md" /%}
Version pinning lets you lock your KiloClaw instance to a specific OpenClaw version and variant. This gives you control over when your instance upgrades — it stays on the pinned version until you explicitly change it.
## When to Use Version Pinning
@@ -5,6 +5,8 @@ description: "Managing your KiloClaw instance from the dashboard"
# KiloClaw Dashboard
{% partial file="kiloclaw-eol.md" /%}
This page covers everything you can do from the KiloClaw dashboard. For getting started, see [KiloClaw Overview](/docs/kiloclaw/overview).
{% image src="/docs/img/kiloclaw/dashboard.png" alt="Connect account screen" width="800" caption="The KiloClaw Dashboard" /%}
@@ -5,6 +5,8 @@ description: "Connect Composio to your KiloClaw agent to access hundreds of tool
# Composio Integration
{% partial file="kiloclaw-eol.md" /%}
Connect Composio to your KiloClaw agent to instantly unlock access to 250+ tool integrations — from Salesforce and HubSpot to Notion, Jira, and beyond. Composio is a platform that handles the authentication and connection details for each service, so your agent can use them without you having to set up each one individually.
{% callout type="info" title="Tip" %}
@@ -5,6 +5,8 @@ description: "Connect a GitHub account to your KiloClaw agent for repository acc
# GitHub Integration
{% partial file="kiloclaw-eol.md" /%}
Connect a GitHub account to your KiloClaw agent so it can clone repositories, push commits, open pull requests, and leave code reviews — all autonomously.
{% callout type="warning" title="Security" %}
@@ -5,6 +5,8 @@ description: "Connect a dedicated Google account to KiloClaw for access to Gmail
# Google Workspace Integration
{% partial file="kiloclaw-eol.md" /%}
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 dedicated Google account" %}
@@ -5,6 +5,8 @@ description: "Manage integrations and settings for your KiloClaw agent"
# Integrations
{% partial file="kiloclaw-eol.md" /%}
Configure integrations and settings for your KiloClaw agent. Connect third-party services to give your agent access to repositories, issue trackers, calendars, documents, and hundreds of other tools — all without manual intervention.
## Available Integrations
@@ -5,6 +5,8 @@ description: "Connect Linear to your KiloClaw agent to create and manage issues
# Linear Integration
{% partial file="kiloclaw-eol.md" /%}
Connect Linear to your KiloClaw agent so it can create issues, update their status, read project backlogs, and track work — all automatically. Linear is a project management tool popular with software teams for planning and tracking features, bugs, and tasks.
{% callout type="warning" title="Keep your API key private" %}
@@ -5,6 +5,8 @@ description: "Start-to-finish guide for configuring your KiloClaw instance"
# Setup walkthrough
{% partial file="kiloclaw-eol.md" /%}
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
@@ -5,6 +5,8 @@ description: "Frequently asked questions about KiloClaw"
# FAQ
{% partial file="kiloclaw-eol.md" /%}
## How can I change my model?
You can change the model in two ways:
@@ -5,6 +5,8 @@ description: "Pricing details for KiloClaw instances and model inference"
# Pricing
{% partial file="kiloclaw-eol.md" /%}
KiloClaw uses Kilo Gateway credits by default — if you route requests through BYOK, model usage is billed directly by your provider instead.
## Instance Hosting
@@ -5,6 +5,8 @@ description: "One-click deployment of your Kilo-hosted AI agent with OpenClaw"
# KiloClaw 🦀
{% partial file="kiloclaw-eol.md" /%}
KiloClaw is Kilo's hosted [OpenClaw](https://openclaw.ai) service — a one-click deployment that gives you a personal or organization-scoped AI agent without the complexity of self-hosting. OpenClaw is a 24/7, open source AI agent that connects to Kilo Chat and optional chat platforms like Telegram, Discord, and Slack so it can take real actions automatically, not just chat.
KiloClaw is powered by Kilo Code. The API key is platform-managed, so you never need to bring your own.
@@ -5,6 +5,8 @@ description: "Default system utilities, languages, and CLI tools included in the
# Pre-installed Software
{% partial file="kiloclaw-eol.md" /%}
Every KiloClaw instance ships with a curated set of system utilities, language runtimes, package managers, and CLI tools. This page documents everything that comes pre-installed in the KiloClaw Docker image so you know what's available out of the box. Where a specific version is listed it reflects the pin in the Dockerfile as of March 2026. Entries marked **unpinned** install the latest available version at image build time and may differ between releases.
## Base Image

Some files were not shown because too many files have changed in this diff Show More