* docs: add MCP config file path (~/.config/kilo/opencode.json)
- README: state where MCP is configured and format (mcp object, type local, command array)
- migration.md: add config file location section for macOS/Linux/Windows and format
* docs(mcp): align with code — path, filenames, schema refs
- README: mention opencode.jsonc; optional fields (environment, enabled, timeout); link to global/index.ts and config.ts McpLocal
- migration.md: document config load order (config.json, opencode.json, opencode.jsonc); Windows note (xdg-basedir); Config.McpLocal and file refs
Disable reasoning for Claude models via Kilo Gateway until the
OpenRouter AI SDK is upgraded to v2.x (which includes the fix for
reasoning_details duplication - OpenRouterTeam/ai-sdk-provider#344).
Changes:
- Remove hardcoded reasoning effort for Claude in options()
- Return empty variants for Claude in variants()
- Remove Claude-specific reasoning.effort in smallOptions()
- Keep thinking/reasoning block stripping code (prevents corrupt
reasoning_details from being sent back to the API)
- Caching continues to work via model.api.id matching
Fixes#303
Enable the question tool for the vscode client and implement the full
question flow: SSE events, HTTP reply/reject endpoints, session state,
DataBridge wiring, and an inline QuestionDock component that replaces
the prompt input while a question is pending.
Closes#238
* Change USER_AGENT prefix from 'opencode' to 'kilo'
* fix: use KILO_VERSION/KILO_CHANNEL globals and add kilocode_change marker
---------
Co-authored-by: Marius <marius@kilocode.ai>
Previously prompt caching via applyCaching() was disabled for both
OpenRouter and Kilo Gateway to avoid modifying thinking blocks. PR #270
re-enabled it for Kilo Gateway only. This change re-enables it for both
providers by including isOpenRouterOrKilo in the caching condition.
Thinking block stripping still applies to both providers before caching
is applied, so the original concern about modified thinking blocks is
addressed.
* fix: support remote MCP server migration in mcp-migrator
The MCP migrator only handled stdio/local MCP servers. When a user
configured a remote streamable-http or sse MCP server in
.kilocode/mcp_settings.json, it failed with:
The "file" argument must be of type string. Received undefined
This happened because convertServer() always assumed local servers,
building a command array from server.command (which is undefined for
remote servers).
Changes:
- Add remote transport type detection (streamable-http, sse)
- Convert remote servers to Config.McpRemote (type: "remote")
- Pass through url and headers fields
- Make command optional in KilocodeMcpServer interface
- Add comprehensive tests for remote server migration
* fix: validate url/command before use in mcp-migrator
Add guard clauses for missing url on remote servers and missing command
on local servers instead of using non-null assertions that could crash
on malformed config files.
---------
Co-authored-by: Kilo Agent <agent@kilo.ai>
Co-authored-by: marius-kilocode <marius@kilocode.ai>
* feat: changelog generation
* refactor: rename all ENV variables to KILO prefix
* refactor: publish rework
* refactor: publish rework
* refactor: unify git commiter action
* refactor: add all kilobots to the team
* feat: add ask agent for read-only Q&A mode
Add a new primary 'ask' agent that answers questions and explains code
without making changes. Permissions are read-only: read, grep, glob,
list, question, webfetch, websearch, codesearch — edit, bash, and task
are denied. Migrators already had 'ask' in their known mode lists.
* fix: preserve .env read gating in ask agent, clarify read-only prompt
Address PR review feedback:
- Re-state *.env pattern map in ask agent permissions so the blanket
deny+allow doesn't bypass the default env file gating
- Update prompt to say 'this agent is read-only' instead of implying
edits are possible on request
- Add .env gating assertions to ask agent test
* fix: handle AbortError during kilo login and org selection
Async onSelect handlers in DialogKiloOrganization and team selection
were not wrapped in try/catch. Since DialogSelect calls onSelect
without awaiting the returned promise, any rejection (e.g. AbortError
from SDK signal) became an unhandled rejection that Bun dumped raw to
the terminal. Wrap all async SDK calls in org/team selection with
proper error handling and silently ignore AbortErrors.
* fix: log non-abort errors during fallback sync reset