Introduce a local `watch` helper that erases strict schema types when
subscribing to MessageV2.Event.Updated, MessageV2.Event.PartUpdated,
and Session.Event.Diff events. This mirrors the pattern used upstream
in share/share-next.ts and resolves type errors caused by the zod-to-
effect Schema migration where event definition types no longer align
with the Bus.subscribe generic constraint.
Replace zod schema definitions with effect Schema equivalents in
BusEvent definitions, tool parameters, session network, suggestions,
and related modules. This aligns Kilo-specific code with the upstream
v1.14.23 migration from zod to effect Schema.
- Convert BusEvent property schemas from zod objects to Schema.Struct
- Migrate tool parameter definitions (recall, warpgrep, suggest) to
Schema.Struct with annotated descriptions
- Replace zod-based SessionNetwork.Wait with effect Schema and add
zod interop via withStatics helper
- Extract shared EditorContext schema in message-v2 and reuse in
prompt input
- Replace `fn()` wrappers in session.ts with explicit
Schema.decodeUnknownSync calls for type safety
- Use branded SessionID/QuestionID types in place of raw z.string()
- Update pending map in SessionNetwork from Record to Map<QuestionID>
- Update tests to use SessionID.make() for branded identifiers
Include `variant: undefined` in metadata objects to match the expected
shape returned by the provider, ensuring the assertion compares all
fields accurately.
Verify that when a subtask completes, the child session's assistant
cost is correctly propagated to the parent wrapper message. This
covers the cost aggregation path in handleSubtask for subagent
interactions.
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.
Add missing 'variant' property to task tool metadata in prompt-effect test, required after upstream added model variant support to the task tool's ExecuteResult type.
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.