Keep upstream's `question` tool binding and `questionEnabled` boolean
names, restore upstream's `tool.plan` position at the end of the builtin
array, and group Kilo-only additions in a single marker block. Removes
outer markers that were wrapping unchanged upstream lines as Kilo-owned
scope.
Replace `export namespace Encoding`/`EncodedIO` wrappers with top-level
exports and switch consumers to `import * as Encoding`/`EncodedIO`.
The module itself acts as the namespace, avoiding the TS-namespace
wrapper that tree-shakers and some module resolvers handle awkwardly.
Move the Kilo question-tool boolean adjacent to `const cfg = yield* config.get()`
matching upstream's placement (commit 9d3c81a68, right after `const config = await
Config.get()`). When upstream's version eventually merges in, the two lines land
next to each other and produce a localized textual conflict — instead of silently
coexisting as dead upstream code plus our divergent gating.
Rename `const question = yield* QuestionTool` to `questiontool` (matching our
existing `lsptool`/`suggesttool` pattern) so the `question` identifier is free
for the boolean, aligning exactly with upstream's naming.
Inline question/plan/e2e gating expressions at call sites in the shared
tool registry instead of routing them through KiloToolRegistry. These are
overrides of upstream tool gating — hiding them behind extracted predicates
accepts upstream textual merges cleanly but silently drops Kilo's intent
when upstream restructures the gating. Inlining forces a textual conflict
when upstream touches the same logic, which is the review step we want.
Additive extractions (build/infos/extra) stay in KiloToolRegistry — those
don't have an upstream peer to conflict with.
Also tighten the kilocode_change markers around the Effect.all and return
blocks to per-line markers so unrelated upstream edits don't land inside
Kilo-owned scope.
The bash tool description now explicitly states that the temp directory has already been created and exists, preventing agents from unnecessarily trying to create it before use.
Fixes 257 typecheck errors surfaced after the upstream merge:
- Update imports to new module paths after upstream PR #24554 removed
module barrel files (@/config, @/session, @/util, etc.) and PR #24309
renamed @opencode-ai/shared to @opencode-ai/core.
- Migrate loadMode to use Info.zod.safeParse for consistency with
loadAgents and ConfigCommand (unblocks KilocodeConfig.handleInvalid).
- Drop removed Npm.outdated mock from tests.
- Add missing Config.defaultLayer to bash-permission-metadata test runtime.
- Fix Tips component signature (kilocode drops upstream's 'connected' prop).
- Fix toast.tsx undefined 'duration' reference (should be toastOptions.duration).
- Move filesystem-containment test from deleted shared package to core.
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
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.