Prettier pads markdown table cells for column alignment, which turns any
content change into a table-wide realignment diff. Markdown was only in
prettierignore for packages/kilo-vscode/; the root formatter still
repadded docs elsewhere (e.g. TESTING.md, kilo-docs, AGENTS.md).
Adds *.md to the root .prettierignore, documents the convention in
AGENTS.md, and adds script/check-md-table-padding.ts + a workflow to
enforce it. Existing padded tables in Kilo-owned docs have been
rewritten via the script's --fix mode.
The large auto-generated models-snapshot.ts is replaced with a minimal
stub, and its compiled outputs (.js, .d.ts) are added to .prettierignore
to prevent formatting of generated files.
Replace zod-based schema definitions with Effect Schema equivalents in
the indexing status event and semantic-search tool parameters. This
aligns both modules with the broader zod-to-effect migration underway
across kilo packages.
- Add Effect Schema mirror of IndexingStatus for BusEvent.define
- Import INDEXING_STATUS_STATES literal union from kilo-indexing/status
- Convert SemanticSearchTool parameters from z.object to Schema.Struct
- Inline explicit type annotations on the tool execute callback to
satisfy the new generic inference after dropping the type parameter
- Reformat long single-line expressions for readability
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
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.
* 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.
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.