mirror of
https://github.com/Kilo-Org/kilocode.git
synced 2026-08-29 03:44:06 +08:00
a19d44c3ef
* 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.