Commit Graph

8769 Commits

Author SHA1 Message Date
Marius 989f7f06a0 feat: add signal-to-noise controls to grep tool (#12811)
* feat: add signal-to-noise controls to grep tool

Add configurable options to reduce noise in grep results:
- context: show N lines before/after each match
- limit: bound maximum matches (default 100) with early termination
- literal: treat pattern as plain text instead of regex
- ignoreCase: case-insensitive matching

These controls help models avoid overwhelming context windows with too
many matches and provide clear guidance when results are truncated.

Implementation preserves upstream ripgrep structure with minimal Kilo
hooks for additive behavior only. Shared-file changes reduced from 183
to 60 lines compared to initial implementation.

* test(core): tolerate PTY event publication race

* fix(cli): count grep matches independently of context
2026-08-03 10:32:40 -04:00
Marius 3d4294e3bb feat(agent-manager): allow sessions to move their worktree between sections or ungroup (#12815)
* feat(agent-manager): allow sessions to move their worktree between sections or ungroup

Add a new  to the  tool so a session can
reassign its own worktree to another section or ungroup it by passing
. The move operation validates the target section and
the session's worktree, then pushes refreshed state to the panel.

Also tighten the model-facing contract so the list-to-move workflow is
unambiguous:  is required first, its result is the
source of truth for section and session IDs, and direct edits to
 are rejected by , , and
 with an explicit pointer to the  tool.

- New / in the Agent Manager protocol
- New  domain function with section/session validation
- New  OpenAPI hook so  stays
  nullable in the generated SDK
- Tool schema descriptions now spell out the list-first workflow and
  the no-direct-edit rule
- List output now includes an instruction block and is pretty-printed
- Optional nullable Task fields tolerate  from models
- Focused CLI tests, bridge unit test, and protection test

* chore: remove local PR screenshot

* style(vscode): format agent manager orchestration

* fix(agent-manager): protect state paths on Windows
2026-08-03 10:32:01 -04:00
Christiaan Arnoldus 52211a9a6f Merge pull request #12790 from Kilo-Org/button-barberry
fix(cli): omit persona from generated names
2026-08-03 13:55:30 +02:00
bagatao@anaconda.com afdb194274 Merge pull request #12802 from Kilo-Org/fix/skill-shell-inline-code-spans
fix(cli): stop inline skill-shell doc examples from triggering permission prompts
2026-08-03 13:29:50 +02:00
Marius 9955efd861 feat(cli): adopt upstream reasoningVariants from v1.18.11 (#12800) 2026-08-03 13:24:25 +02:00
Bruno Agatao 9fa992fd9b Merge branch 'fix/skill-shell-inline-code-spans' of github.com:Kilo-Org/kilocode into fix/skill-shell-inline-code-spans 2026-08-03 13:19:36 +02:00
Bruno Agatao 87eaf2ca7d docs(cli): trim skill-shell injection comment 2026-08-03 13:19:03 +02:00
bagatao@anaconda.com fa0e8b1bb7 Merge branch 'main' into fix/skill-shell-inline-code-spans 2026-08-03 13:15:34 +02:00
Bruno Agatao dbf50aa821 fix(cli): fix nested code-span ranges and flaky quadratic-scan test 2026-08-03 13:14:48 +02:00
Igor Šćekić 1f3a3b2d83 feat(attachments): add remote CLI file delivery (#12747)
* fix(cli): clarify remote binary attachment notice

* feat(cli): add remote send_file tool

* docs(mobile): explain remote session attachments

* fix(cli): keep delivered files out of model context

* fix(cli): mark delivery filter as kilocode change

* fix(cli): preserve delivered image files

* test(cli): narrow delivery attachment state

* fix(send-file): preserve filesystem failures

* test(send-file): assert propagated file read error
2026-08-03 13:12:11 +02:00
bagatao@anaconda.com cc27d9e449 Merge pull request #12728 from Kilo-Org/feat/explain-tool-auto-approval-tui
feat(tui): explain tool auto approval
2026-08-03 12:41:53 +02:00
Bruno Agatao 5bd420aae1 fix(cli): stop inline skill-shell doc examples from triggering permission prompts 2026-08-03 12:39:49 +02:00
Marius 2fbd380dfc fix(cli): speed up local recall searches (#12726)
* fix(cli): speed up local recall searches

* fix(cli): bound local recall scans

* fix(cli): make recall index initialization lazy
2026-08-03 12:22:42 +02:00
Marius 7d3f50c2e8 fix(cli): defer threshold compaction during tool loops (#12792)
* fix(cli): preserve Kilo prompt cache keys

* fix(cli): defer threshold compaction during tool loops
2026-08-03 12:22:39 +02:00
bagatao@anaconda.com 68f11a8dea Merge branch 'main' into feat/explain-tool-auto-approval-tui 2026-08-03 11:46:50 +02:00
Christiaan Arnoldus 323f096e11 refactor(cli): revert shared metadata identifiers 2026-08-03 10:53:57 +02:00
Christiaan Arnoldus 0cfd301745 refactor(cli): clarify generated-name persona policy 2026-08-03 10:31:22 +02:00
Christiaan Arnoldus 8be33032b9 fix(cli): omit persona from generated names 2026-08-03 10:18:00 +02:00
Hardik Sharma c554409080 fix(cli): preserve configured subagent routing (#12652)
* fix(cli): preserve configured subagent routing

* fix(cli): preserve markdown agent precedence

* ci: rerun checks
2026-08-01 21:19:19 +00:00
kilo-maintainer[bot] f00da9a75b release: v7.4.18 2026-07-31 19:59:08 +00:00
Igor Šćekić ace509dc60 feat(opencode): remote create_session fields, org metadata, rename/title sync, cancel proof (#12704)
* feat(opencode): remote create_session fields, rename adoption, title sync

Extend create_session wire with optional agent/model/orgId (strict v1,
old-CLI degrade via client retry); claim org via session metadata
(metadata > KILO_ORG_ID > auth); adopt system session.renamed via
setTitle with consume-on-failure adoption marks; POST generation-aware
title changes through readiness (auto-titles marked by ensureTitle,
same-title Updated consumes pending adoptions).

* test(opencode): prove cancel→reprompt reaches idle; lock exit survivor

Item 14 CLI prove-it at SessionPrompt level: cancel-when-idle,
mid-stream, mid-tool, queued follow-up (deterministic queue wait), and
abortIntakes all settle to idle and reprompt completes — no production
hang found, no src change. Item 8: lock survivor session send_message
after sibling exit_cli.

* test(opencode): drop AppRuntime spy from create_session default test

Satisfies check-opencode-promise-facades while still proving the
production default forwards {agent, model, metadata} into
Session.Service.create.

* fix(opencode): bound rename marks, wire title report path, harden title tests

Kilobot review on #12704: adoption/auto-title maps now carry timestamps,
prune on write (60s TTL), and clear on Session.Event.Deleted (exported
clear/clearAll); the Updated watcher calls the interface
reportSessionTitle and fullSync passes preloaded info into meta();
ensureTitle's Kilo logic lives in kilocode/session/prompt.ts behind one
kilocode_change call site; title tests poll instead of sleeping and lock
mark-before-write plus clear-on-failure for real; meta() get-failure
org fallback covered via the _metaForTests seam.

* fix(kilo-sessions): mark bookkeeping before ingest sync, AppRuntime, test cleanup

Kilobot round 2 on #12704: consume rename/auto-title marks before the
ingest.sync network hop so the 60s TTL spans only the in-process hop;
call reportSessionTitle via AppRuntime.runPromise; auth cleanup back
under Effect.ensuring; restore the upstream blank line in prompt.ts so
the fork diff is only the kilocode_change call site.

* fix(kilo-sessions): keep title report self-healing if ingest.sync fails

Advance knownTitles only after successful sync; restore consumed rename/
auto-title marks on failure so the next Updated can re-POST. IIFE keeps
const-style outcome derivation.

* fix(kilo-sessions): optimistic knownTitles with full title-path rollback

Advance knownTitles before the network hop so concurrent Updated handlers
see sameTitle and cannot POST the same title with a wrong generated flag.
Restore prev + consumed marks when ingest.sync throws or reportSessionTitle
returns not-ok, so the next Updated retries the full self-healing path.

* style(kilo-sessions): prettier title Updated handler

* fix(kilo-sessions): preserve newer title state

* refactor(kilo-sessions): simplify title reporting tests

* fix(kilo-sessions): report unseeded title updates

* fix(kilo-sessions): consume unseeded title marks

* test(kilo-sessions): cover unseeded title marks

* test(kilo-sessions): unique ids for unseeded title tests

Thread a distinct session id through unseededMockSessionLayer so
session_share Storage records do not couple the three unseeded cases.
2026-07-31 18:25:03 +00:00
Bruno Agatao fbc5f2abc1 Merge remote-tracking branch 'origin/main' into feat/explain-tool-auto-approval-tui 2026-07-31 17:32:08 +02:00
Marius 3a923f36b4 fix(cli): suppress AI SDK system message warning in TUI (#12739)
AI SDK 6 logs a console.warn when system messages appear in the
messages array. OpenCode prepends trusted system prompts to messages
in session/llm/request.ts, so the warning fires on every turn and
bleeds into the TUI frame.

Set allowSystemInMessages: true on the streamText call to acknowledge
the trusted internal system messages and prevent the warning from
corrupting terminal output. This also future-proofs against AI SDK 7,
which rejects system messages by default.
2026-07-31 15:03:13 +00:00
Bruno Agatao c56aad9d6c refactor(cli): shrink the denial-provenance shared-file diff in permission/index.ts
Applies the kilocode-merge-minimizer skill to the prior fix. The
hard-veto and headless-subagent DeniedError sites are reverted to
their exact pre-fix shape -- neither carries a specific rule anyway,
so wrapping their ruleset in a { rule, matches } object added shared
upstream diff for no benefit. Only the main deny path (which already
had the deciding rule in scope) still changes, and now passes the
bare rule instead of a wrapper object, shrinking that hunk from a
multi-line block to a single-line swap.

PermissionProvenance.classifyDenial now duck-types ruleset as a
possible bare Permission.Rule (checking action === "deny" and a
string pattern) instead of expecting a { rule } wrapper, so it still
reads the main deny path's rule directly while falling back to a
synthesized deny rule for the other paths, exactly as before.

Net shared-file diff across permission/index.ts, session/tools.ts, and
the TUI's routes/session/index.tsx for this whole feature is now 9
insertions / 12 deletions, down from ~50+ lines.
2026-07-31 16:45:29 +02:00
Bruno Agatao a07661b20c Merge remote-tracking branch 'origin/main' into feat/explain-tool-auto-approval-tui 2026-07-31 16:34:21 +02:00
Bruno Agatao 5f3b57b971 fix(cli): attribute tool call denials to the rule that actually decided them
DeniedError.ruleset only carried the deny-permission subset, so
PermissionProvenance.classifyDenial had to guess the deciding rule via
findLast(action === "deny"). With two deny rules for different
patterns under the same permission (e.g. bash: { "git push *": deny,
"rm -rf *": deny }), this could attribute a denial to whichever rule
sorted last instead of the one that actually matched the request.

Permission.ask now embeds the exact rule resolve()/evaluate() matched
against the request's pattern directly on the error (ruleset: { rule,
matches }), so classifyDenial reads it instead of re-deriving it.

Some denials carry no rule at all (e.g. the headless-subagent policy
denial), where classify({ rule: undefined }) reports the same
{ source: "default" } shape as the *approval* fallback -- silently
rendering a refusal as an auto-approval in the TUI and kilo export.
classifyDenial now synthesizes an explicit deny rule for the request's
permission/pattern in that case, so rule.action always reflects the
real outcome.

Adds test/kilocode/permission/deny-provenance.test.ts covering both
regressions against the real Permission.Service, and updates the
existing session-tools.test.ts denial fixture to the new ruleset
shape.
2026-07-31 16:32:10 +02:00
bagatao@anaconda.com 51d7ddb958 Merge pull request #12606 from Kilo-Org/feat/execute-cmds-in-skill-context-vscode
feat(vscode): show verbatim skill commands and skill name in permission prompt
2026-07-31 15:34:08 +02:00
Marius 3af9c50970 Merge pull request #12227 from shssoichiro/fix/issue-10271
fix(indexing): improvements to semantic_search tool description
2026-07-31 14:54:49 +02:00
Joshua Lambert 2a0e5177b0 Merge pull request #12701 from Kilo-Org/research-kilo-console-documentation-deprecation
docs(cli): deprecate Kilo Console
2026-07-31 08:44:48 -04:00
Josh Holmer 96ce700d6b fix(indexing): improvements to semantic_search tool description 2026-07-31 08:40:05 -04:00
Marius 1a340371f4 fix(cli): handle missing nested config unsets (#12727)
* fix(cli): handle missing nested config unsets

* test(cli): cover nested config unset behavior
2026-07-31 13:41:35 +02:00
Marius a1ad65e522 fix(cli): stabilize Windows CI tests and rebalance slow shards (#12723)
* fix(cli): stabilize Windows CI tests and rebalance slow shards

Three Windows-only instabilities in the CLI unit suite:

1. httpapi-instance-route-auth.test.ts failed with an uncaught
   "Invalid handle" error. The test's ConfigProvider.layer(
   fromUnknown(...)) replaced the ambient config provider, blinding
   KILO_EXPERIMENTAL_DISABLE_FILEWATCHER=true that CI/preload sets. With
   the flag hidden, the @parcel/watcher Windows backend subscribed on the
   temp repo's .git; the tmpdir fixture then deleted that directory while
   the never-disposed per-test runtime still held the subscription, and
   CreateFileW failed with the hardcoded "Invalid handle" (napi rejection
   with no JS stack). Add the disable-filewatcher flag to every test
   config map that boots instances via the HttpApi app (instance-route-auth,
   cors, ui, exercise backend, kilo-edit, memory).

2. config-overlay.test.ts intermittently returned HTTP 500 on Windows.
   Filesystem.write's atomic temp-file+rename had no retry for Windows
   transient locked-file errors (EPERM/EACCES/EBUSY) from Defender/indexer
   and the detached background plugin install racing the rename in the same
   tmpdir. Mirror the proven cleanup.ts locked-error retry pattern with a
   short backoff, Windows-only.

3. Windows shards were badly imbalanced: the sharder weighted files by
   byte size, which concentrated every slow spawn/FS/lock-heavy file
   (snapshot, prompt, provider, run-process, instance-bootstrap,
   httpapi-session) into one shard (~612s vs ~356s siblings), and the
   resulting contention forced whole-file retries that doubled cost. Add
   TestShard.timedWeight and a committed test-timings.json seeded from CI
   junit data so shards balance by measured runtime (spread collapses from
   ~200s to ~18s) and contention-prone files spread across shards.
   Platforms without manifest entries fall back to size weighting.

* fix(cli): skip stale manifest entries in timed shard weighting

Bun.file().size returns 0 (never throws) for missing paths, so the
try/catch in timedWeight was dead code and stale/renamed manifest entries
added their time to the scale numerator with zero size, inflating the
size-to-time ratio that estimates unknown files. Skip entries with a
non-positive on-disk size instead of catching a throw that never happens.

* revert(cli): drop hardcoded test-timings manifest

The committed test-timings.json (482 entries) was a maintenance burden:
it goes stale as tests are added/renamed and no size-based heuristic can
replace it (slow subprocess outliers like run-process.test.ts are 7kb but
112s, 10x the runtime-per-byte of other files). Revert the timing-weighted
sharding to the prior size-based LPT. The Windows reliability fixes
(ConfigProvider filewatcher flag + Filesystem.write locked-file retry)
remain and are what eliminate the failures and the ~360s of retry overhead
that dominated the 12m50s shard. A maintainable runtime-based rebalance
(self-updating CI cache fed from the junit artifacts CI already uploads)
is a separate follow-up.
2026-07-31 13:27:34 +02:00
Bruno Agatao 770176d5cd Merge remote-tracking branch 'origin/main' into feat/explain-tool-auto-approval-tui 2026-07-31 12:25:31 +02:00
Christiaan Arnoldus 52e17568e7 Merge branch 'main' into equable-stinger 2026-07-30 20:01:32 +02:00
Josh Lambert e3c720253c Merge remote-tracking branch 'origin/main' into research-kilo-console-documentation-deprecation
# Conflicts:
#	packages/opencode/src/kilocode/cli/cmd/console.ts
2026-07-30 13:30:31 -04:00
Christiaan Arnoldus e07d7d4618 docs: refresh stale schema comments 2026-07-30 19:03:27 +02:00
Christiaan Arnoldus 9245279de5 fix: match hyphenated rate-limit prose in retry heuristics 2026-07-30 18:55:05 +02:00
Christiaan Arnoldus 411f28f118 fix: accept null error fields and narrow message retry heuristics 2026-07-30 18:16:09 +02:00
Marius 166d04e846 Merge pull request #12566 from Kilo-Org/abalone-bactrosaurus
feat(vscode): multi-project Agent Manager
2026-07-30 18:07:46 +02:00
Christiaan Arnoldus 31d844a708 fix: keep stream error retryability on par with previous heuristics 2026-07-30 18:06:17 +02:00
Bruno Agatao 63d35d06cf feat(cli): record why a tool call was denied on its metadata
Auto-approval provenance was only recorded on the metadata of allowed
tool calls (state.metadata.approval), so denied calls had no
structured explanation of which rule/config/agent denied them. Since
'kilo export' serializes state.metadata verbatim into the JSON session
log, denials showed up with no provenance at all.

Add PermissionProvenance.classifyDenial, which reads the deciding deny
rule off a DeniedError's tagged ruleset and classifies it the same way
approvals are classified. Wire it into SessionTools' ctx.ask via
Effect.tapErrorTag so denials are recorded before the tool call fails,
reusing the existing carryApproval/failToolCall preservation so the
metadata survives onto the final error state.
2026-07-30 18:04:39 +02:00
Christiaan Arnoldus 677b315cbb refactor: parse stream error frames with zod 2026-07-30 18:01:11 +02:00
Christiaan Arnoldus 97792169ee fix: cover envelope-less stream error shapes and unlisted codes 2026-07-30 17:50:58 +02:00
Bruno Agatao 2a9a81c102 Merge remote-tracking branch 'origin/main' into feat/execute-cmds-in-skill-context-vscode 2026-07-30 17:48:03 +02:00
Bruno Agatao 69cde59ac9 docs(cli): describe the second external_directory prompt in inject.ts 2026-07-30 17:44:50 +02:00
Bruno Agatao 018d3dc26a test(cli): cover the external_directory ask for out-of-project skill commands 2026-07-30 17:41:39 +02:00
Christiaan Arnoldus 861e2e5bdd fix: render responses stream failure frames as clean provider errors 2026-07-30 17:34:25 +02:00
Marius 1d1630b346 fix(cli): settle signal-terminated shell commands as 128 + signum (#12698) 2026-07-30 17:26:57 +02:00
Josh Lambert 7de446f080 fix(cli): warn when launching deprecated Console 2026-07-30 11:14:11 -04:00
Christiaan Arnoldus 0e3ce11862 fix: align ai core with provider packages in lockstep, drop bedrock bump 2026-07-30 17:09:31 +02:00