The task tool propagates each child session's total cost into the parent's tool-wrapper assistant message. Counting both root and child sessions in `kilo stats` would double-count that contribution. Filter `getAllSessions()` to root sessions (parent_id IS NULL), matching how the TUI session list and web sidebar already treat child sessions.
finish-step and cleanup previously re-wrote the parent assistant message with a stale in-memory cost, clobbering the subagent cost written by task.ts during tool execution. Refresh from DB before each write so the propagated cost is preserved across steps. Verified live via side-by-side `kilo serve` vs dev `bun serve` with 2 parallel subagents; parent now shows own LLM + children, matching real spend.
When a session spawned subagents via the task tool, the displayed cost reflected only the parent's own LLM steps. Propagate each subagent's total up to the invoking assistant message so every UI sums the full tree.
Clearing the Model Override field for native agents (e.g. Explore,
General) sent the patch as `{ model: undefined }`. JSON.stringify drops
undefined, so the backend received an empty patch, the override stayed
in kilo.json, and the next configUpdated push repopulated the field.
Send `null` instead — the backend's patchJsonc already treats null as
a delete sentinel (matches the pattern already used in ModelsTab and
AutoApproveTab). Fixes#9527.
* fix: allow ChatGPT login over OpenAI provider config
Let users with inherited or globally configured OpenAI API keys sign in with ChatGPT for Codex without first removing their existing provider setup.
* fix: satisfy provider login ci checks
Annotate Kilo-specific shared CLI changes and apply webview formatting so the existing ChatGPT login flow passes CI.
Strengthen the Kilo queue integration test to capture each LLM
request body and assert the second request ends with the queued
user message, not a prior-turn assistant tail. Update the skipped
upstream prompt-effect active-run test comment to reference #9492
and point at the Kilo-specific authoritative coverage.
The gateway wraps @openrouter/ai-sdk-provider internally, so the same
openrouter SDK-side reasoning handling applies. Without this, users
routing through api.kilo.ai still see DeepSeek 400 'reasoning_content
must be passed back' errors.
The command writes to .opencode/opencode.jsonc and .opencode/tui.jsonc
(or ~/.config/kilo/* for --global), not kilo.json. See #9503 for the
underlying bug — when fixed, this doc must be updated in the same PR.
Remove explanatory block comments and intermediate variable assignment
(`__oc_cwd`) that were left over from the previous iteration. Use
`cd -- "$1"` directly instead of the two-step capture-then-cd pattern,
and rename the argv[0] placeholder from `_opencode` to `opencode`.
Replace the `pwd -P` approach with an explicit positional argument (`$1`)
for zsh and bash login shell invocations. Login shells source profile
scripts (`/etc/profile`, `~/.profile`, `~/.bashrc`) before the `-c`
script executes, and those scripts may change the working directory
(e.g. nvm, direnv), making both `$PWD` and `pwd -P` unreliable at
script evaluation time. By passing `ctx.directory` as `$1` and falling
back to `$PWD` when unset, the shell script always receives the correct
session directory regardless of profile side effects.
Simplify the corresponding integration test by removing verbose CI
debug probes and replacing them with a straightforward `pwd` assertion.