Commit Graph
8652 Commits
Author SHA1 Message Date
Whitebeard 1310c1200a fix: make snapshot diffs resilient on Windows (#12583) 2026-07-28 14:23:47 +02:00
Marius fb5f5ae31b Merge pull request #12593 from Kilo-Org/profile-active-kilo-sessions-cpu-usage
fix(vscode): avoid eager worktree watchers
2026-07-28 13:05:29 +02:00
marius-kilocode 8f4b146103 fix(vscode): use normalized client flag 2026-07-28 12:55:41 +02:00
marius-kilocode 160b06661a fix(vscode): avoid eager worktree watchers 2026-07-28 12:48:30 +02:00
Marius fc04f4f6ff Merge branch 'main' into reproduce-and-fix-revert-file-rollback-bug 2026-07-28 11:27:54 +02:00
marius-kilocode 2c61d29fb7 fix(cli): compensate checkpoint restore failures 2026-07-28 11:09:55 +02:00
Marius c21b01f25a Merge pull request #12460 from Kilo-Org/marius-kilocode/kilo-opencode-v1.17.9
chore(opencode): merge v1.17.6 through v1.17.9
2026-07-28 11:03:04 +02:00
Marius f336cfee0a Merge pull request #12588 from Kilo-Org/fix/provider-first-byte-timeout
fix(cli): prevent agent-loop freeze when a provider stalls after headers
2026-07-28 11:00:52 +02:00
marius-kilocode 8dba38a2fa fix(cli): update shell regression import 2026-07-28 10:45:20 +02:00
marius-kilocode 60217b482d Merge remote-tracking branch 'origin/main' into marius-kilocode/kilo-opencode-v1.17.9 2026-07-28 10:43:36 +02:00
marius-kilocode 7058e07649 fix(cli): dispose HttpApi instances before apps 2026-07-28 10:39:00 +02:00
marius-kilocode deddf0012f fix(cli): bound provider first response byte by the request timeout
A provider can accept a request, return response headers, and then never
send a byte of body data. The connection-phase request timeout was cleared
as soon as headers arrived, so nothing bounded that wait and the agent turn
hung indefinitely after a tool call completed: step-finish:tool-calls was
recorded and the next step-start never arrived, with the HTTP server still
responsive.

Extend the same configured timeout deadline to the wait for the response
body's first byte. The connection-phase timer covers the fetch up to
headers; once headers arrive, the remaining deadline is handed to a
first-byte guard that aborts the request if no data arrives. After the
first byte the guard becomes a passthrough, so idle gaps inside an already
streaming response (reasoning, buffering, slow token generation) are never
touched and remain opt-in via chunkTimeout.

This is a transport-level signal (bytes on the wire, before any content)
rather than the absence of normalized AI SDK events, so it cannot fire on
long prompt processing or reasoning the way the reverted stream watchdog
did. timeout: false still disables the bound entirely.

Adds a hermetic regression test that injects a simulated stalled socket
through the provider's own fetch option via the plugin config hook, so the
SDK, Kilo's fetch wrapper, SSE parsing, the processor and the agent loop
all stay production code. The stalled request is transient, so the test
asserts the turn recovers by retrying and completing instead of freezing.
The test goes red without the fix (no retry, frozen at step-finish) and
green with it.

Refs #8656
2026-07-28 10:35:56 +02:00
marius-kilocode 16f8e7ef7f fix(cli): keep session reverts atomic 2026-07-28 10:34:40 +02:00
Marius a0a760e00e fix(cli): enforce permissions on shell commands the parser fails to scan (#12585)
* fix(cli): enforce permissions on shell commands the parser fails to scan

* fix(cli): fail closed on error chunks without command names, move pwsh execution test to kilo file
2026-07-28 09:50:32 +02:00
marius-kilocode 8932a2033b test(cli): disable indexing in HttpApi exerciser 2026-07-27 17:08:27 +02:00
Josh HolmerandJohnny Eric Amancio c12a567f2a test(cli): cover TUI startup outside package (#12417)
* test(cli): cover TUI startup outside package

* fix(cli): use native preload path in TUI test

---------

Co-authored-by: Johnny Eric Amancio <johnnyeric@gmail.com>
2026-07-27 15:14:31 +02:00
marius-kilocode 46d48db825 fix(cli): close HttpApi exerciser resources 2026-07-27 14:16:11 +02:00
Igor Šćekić b2735bfbc9 fix(cli): flush the session ingest tail on shutdown (#12545)
* fix(cli): drain session ingest queue on shutdown and flush terminal batches promptly

* fix(cli): drain the session ingest queue on process shutdown

* fix(cli): pin drain bound expiry, add changeset, conform to naming rule

* fix(cli): keep kilo-sessions out of the CLI startup import graph

* fix(cli): never let the ingest drain task reject the shutdown sequence

* test(cli): pin drain-before-dispose ordering on the KiloCli shutdown path

* fix(cli): make the guarded ingest drain non-rejecting and correct the lazy-import rationale

* test(cli): cover the retryable-status drain path under shutdown

* test(cli): decouple cli-shutdown drain assertions from declaration order
2026-07-27 11:12:42 +02:00
Christiaan Arnoldus 614c21ee81 Merge pull request #12544 from Kilo-Org/fix/opus-5-adaptive-thinking
fix(cli): support adaptive thinking for Claude 5+
2026-07-27 10:16:23 +02:00
Marius 17cc581129 Merge pull request #12514 from Kilo-Org/fix-cli-subprocess-timeouts
fix(cli): stabilize cross-platform subprocess tests
2026-07-27 09:16:28 +02:00
marius-kilocode 28f2abe5e9 Merge remote-tracking branch 'origin/main' into marius-kilocode/kilo-opencode-v1.17.9 2026-07-27 08:11:14 +02:00
marius-kilocode c8abc86fe7 fix: align merged CI contracts 2026-07-27 08:10:52 +02:00
chrarnoldusandkiloconnect[bot] 8aeff4856f fix(cli): cover future sonnet adaptive versions
Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
2026-07-26 20:50:52 +00:00
chrarnoldusandkiloconnect[bot] a69a7cc5c4 fix(cli): cover future opus adaptive versions
Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
2026-07-26 20:03:01 +00:00
chrarnoldusandkiloconnect[bot] b8d83fb537 fix(cli): support adaptive thinking for opus 5
Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
2026-07-26 19:36:51 +00:00
Igor Šćekić a19d44c3ef Advertise the instance from enableRemote and report attention status on the heartbeat (#12532)
* fix(cli): advertise the instance from enableRemote so /remote registers as a spawn target

Enabling the remote relay from the TUI `/remote` slash command connected the
socket and mirrored sessions, but never advertised the instance, so the CLI
never appeared as a spawn target in the mobile "Run on" picker. Only the
explicit `kilo remote` command called setInstanceAdvertisement.

The advertisement now runs on every successful enableRemote() entry, before the
already-connected and coalescing early returns. That ordering matters: bootstrap
auto-enable frequently connects first, so `/remote` usually hits
`if (remote) return` and an advertisement placed in the connection-setup body
would leave the defect unfixed in the common case. `ingestDisabled` returns
before the advertisement and stays unadvertised.

The ensure helper is a no-op when an advertisement is already set, so it fires no
extra heartbeat, while explicit setInstanceAdvertisement keeps its existing
replace semantics. buildInstanceAdvertisement moves to a shared module so the
command path and the enable path derive it identically.

* fix(cli): report pending question and permission on the session heartbeat

The heartbeat built each session's status from SessionStatus.Service, whose
union is idle/retry/busy/offline and which never consults Question.Service or
Permission.Service. deriveStatus() already did consult both, but only fed the
ingest session_status sync. So a session genuinely blocked on a question was
advertised as busy on the heartbeat, and the mobile app — which takes live row
status from the heartbeat — showed no needs-input badge.

Extract the precedence (permission, then question, then SessionStatus) into a
shared helper used by both deriveStatus and the heartbeat, so the two channels
cannot drift.

The heartbeat runs on a ~10s timer across every session, and deriveStatus makes
service calls per session, so the permission and question lists are fetched once
per tick and indexed by session id rather than queried per session. A test pins
the call count.

Behaviour note beyond the strict fix: sharing the derivation also means a
SessionStatus of offline now reports as retry on the wire, matching what
deriveStatus has always sent to ingest. Nothing consumes offline from the
heartbeat — the transport forwards only idle and busy, and the mobile row treats
both as non-attention — so the effect is that the two channels now agree. The
detach fence test is parameterised accordingly; its assertion that the status
clears on detach is unchanged.

* chore(cli): widen the promise-facade allowlist for the heartbeat attention tests

The DEF-3 heartbeat tests raise and reply to real Question and Permission
requests through the global AppRuntime, which took kilo-sessions.test.ts from 4
classified references to 29 and failed the allowlist check.

Bumping the count rather than restructuring the tests is deliberate: the
heartbeat resolves attention status from the global Question.Service and
Permission.Service, so asserting it requires driving those same services.
Scoped layers cannot express that — the global-runtime coupling is the thing
under test — and it is the same integration pattern this entry already
sanctioned for the detach fence. The reason string records that.
2026-07-25 15:45:43 +02:00
Joshua Lambert eab61d853a Merge pull request #12505 from Kilo-Org/fix/run-duplicate-events
fix(cli): emit run events once
2026-07-24 19:48:51 -04:00
Marius 85a5ebf3e7 Merge branch 'main' into fix-cli-subprocess-timeouts 2026-07-24 18:55:11 +02:00
kilo-maintainer[bot] f80ebff83b release: v7.4.16 2026-07-24 15:55:31 +00:00
marius-kilocode c4aebfe305 fix(cli): tolerate process signal failures in test runner 2026-07-24 17:06:49 +02:00
LCZcn96 c72817e67f fix(cli): bound skill discovery in non-git projects (#12475) 2026-07-24 16:31:31 +02:00
marius-kilocode 14934c736b fix(cli): resolve OpenTUI links across install layouts 2026-07-24 15:21:11 +02:00
marius-kilocode f3a4003356 fix(cli): resolve bundled OpenTUI native modules 2026-07-24 15:09:23 +02:00
Bruno Agatao 9c16457083 Merge remote-tracking branch 'origin/main' into feat/explain-tool-auto-approval 2026-07-24 14:27:39 +02:00
marius-kilocode a33493e722 fix(cli): stabilize cross-platform subprocess tests 2026-07-24 14:23:03 +02:00
Marius 470d78bfac Merge branch 'main' into fix/preserve-other-finish-reason 2026-07-24 14:02:52 +02:00
marius-kilocode 64343089d8 chore: merge latest main 2026-07-24 13:12:52 +02:00
marius-kilocode 3d2036a379 fix: preserve Kilo repository links 2026-07-24 12:57:47 +02:00
marius-kilocode 1b60773cae fix: resolve OpenCode merge regressions 2026-07-24 12:56:42 +02:00
Johnny Eric Amancio 0fe46ecb8d fix: recover from read-only database files at startup (#12508) 2026-07-24 12:51:05 +02:00
marius-kilocode 40fd27d22a fix(cli): validate persisted Vercel request IDs 2026-07-24 12:42:15 +02:00
Bruno Agatao 0eb9face86 Merge remote-tracking branch 'origin/main' into feat/explain-tool-auto-approval 2026-07-24 12:35:42 +02:00
Bruno Agatao b36b24e827 fix(cli): track auto-approval provenance per permission pattern, not per key 2026-07-24 12:32:33 +02:00
marius-kilocode 9ecdfdc19e fix(vscode): persist both response identifiers 2026-07-24 12:27:54 +02:00
marius-kilocode d29f1bdd43 fix(vscode): show both response identifiers 2026-07-24 12:21:21 +02:00
marius-kilocode 2fcb137ebc fix: preserve unexpected provider finish reasons 2026-07-24 12:20:43 +02:00
Marius e6f4216088 Merge pull request #12497 from Kilo-Org/revert/stream-stall-watchdog
revert(cli): restore opt-in stream idle timeouts
2026-07-24 12:13:37 +02:00
Bruno Agatao 7f37d015ed fix(cli): tag permission rules by origin so auto-approval provenance is accurate 2026-07-24 12:12:58 +02:00
Christiaan Arnoldus a4177125b8 Merge pull request #12485 from rakshith1928/fix/12477-compaction-maxoutputtokens-leak
fix(core): strict OpenAI-compatible compaction failure caused by maxOutputTokens leak into provider options
2026-07-24 11:13:50 +02:00
Igor Šćekić aa22680fee refactor(cli): shared-process remote sessions with safe per-session exit (#12327)
* refactor(cli): run remote sessions in one process with safe per-session exit

Consolidate remote session handling into a single CLI process instead of
spawning one process per remote-created session (addresses the PR review):

- restore in-process create_session (accepts an absent sessionId and targets
  the connection directory); remove the session spawner, the
  KILO_REMOTE_ATTACH_SESSION attach-on-boot path, the child-advertisement gate,
  and their tests
- retain instance advertisement and fire one immediate out-of-band heartbeat on
  (re)connect when advertising, so a headless `kilo remote` host is discoverable
  without delay

Make /exit (wire command exit_cli, unchanged for compatibility) detach only the
target session instead of terminating the CLI:

- AttachedState.detach with a presence-suppression tombstone; detach also clears
  the target's SessionStatus so the negative-containment heartbeat fence resolves
  deterministically for busy/retry/offline sessions
- exit_cli handler verifies ownership, cancels the active prompt, detaches and
  awaits the detach heartbeat, then ACKs; the interactive RemoteExit callback is
  invoked only after the ACK when the last owned session exits; a headless
  `kilo remote` host stays alive and advertising at zero sessions
- add an optional canExitSession boolean to the list_commands v1 catalog
  (always true, independent of exitAvailable) so clients can detect safe
  session-exit semantics

History and stored sessions are preserved on exit.

* fix(cli): break module-load cycle in remote session prompt-cancel

The K1 in-process exit_cli seam added a static `import { SessionPrompt }`
to kilo-sessions.ts. @/session/prompt evaluates KiloSessionPrompt at module
load, so the new static edge raced that init and left the namespace in TDZ,
crashing unrelated test files with 'undefined is not an object (evaluating
KiloSessionPrompt.shouldAskPlanFollowup)'. Defer to a dynamic import at the
single call site, mirroring remote-command.ts.

* fix(cli): correct AttachedState announce/detach concurrency and rollback

Address review findings on the shared-process session lifecycle:

- announce/detach no longer join the OPPOSITE in-flight operation. Joining
  detach's negative-containment fence made announce resolve success for a
  detached id (and vice versa: detach joined announce and resolved success
  while still attached, which exit_cli treats as license to ACK/close). Each
  path now joins only a same-kind in-flight op and, when the opposite op is
  in flight, awaits it to settle and then performs the real work.
- Failed-detach rollback now releases the suppression tombstone, so a
  still-attached session is not dropped by the next setPresence (the tombstone
  loop would otherwise remove the still-present id and never clear).
- Both catch/rollback branches now honor the lifecycle generation guard
  (mirroring the success path); a stale in-flight op that rejects after
  reset() no longer mutates the new lifecycle's presence/pending/suppressed
  sets (reset clears the same Set instances).

Adds regression tests for each fix, plus AC6f covering the remote-ws
detachSessionId negative-containment waiter.
2026-07-24 09:39:07 +02:00