@loicngr/kobo 2.1.12 → 2.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -276,6 +276,10 @@ not normal cleanup. The SDK still constructs its runtime command; Kōbō's
276
276
  `spawnClaudeCodeProcess` hook tracks actual child exit and forwards stderr.
277
277
  `EngineProcess.closed` waits for both that exit and iterator completion because
278
278
  the SDK's internal cleanup wait is bounded and can return before child exit.
279
+ Liveness must also inspect non-empty SDK content deltas (text, thinking,
280
+ input JSON, signature), not just mapped UI events: long reasoning/tool argument
281
+ generation can otherwise be killed as idle. Do not count empty deltas or neutral
282
+ metadata, or let child deltas cancel a settled parent's drain/grace.
279
283
 
280
284
  **OpenAI Codex** (`codex/`): uses the **`codex app-server` JSON-RPC protocol** (line-delimited JSON over stdio with a long-lived `codex` subprocess). The engine layers are:
281
285
  - `jsonrpc/transport.ts` + `jsonrpc/peer.ts`: generic JSON-RPC 2.0 stdio peer (request correlation, notifications, server-initiated requests)
package/CHANGELOG.md CHANGED
@@ -4,6 +4,10 @@ All notable changes to Kōbō are documented here. The format is based on
4
4
  [Keep a Changelog](https://keepachangelog.com/). Each release is an `## <version>`
5
5
  section — the in-app "What's new" dialog reads this file.
6
6
 
7
+ ## 2.1.13
8
+
9
+ - fix(claude): count streaming generation as watchdog activity
10
+
7
11
  ## 2.1.12
8
12
 
9
13
  - fix(claude): close settled SDK sessions without false watchdogs
package/CONFIGURATION.md CHANGED
@@ -1285,6 +1285,12 @@ agents, and 30 minutes for tools (including background Bash, workflow and MCP
1285
1285
  jobs). A compaction has a separate absolute 10-minute limit. Waiting for your
1286
1286
  answer or permission pauses the inactivity watchdog.
1287
1287
 
1288
+ Non-empty streaming text, reasoning, tool-argument JSON and signature fragments
1289
+ count as activity even when they are not displayed in chat. Empty deltas and
1290
+ neutral metadata do not reset inactivity, and child output cannot postpone a
1291
+ settled parent's closure. The inactivity limit measures silence, not total time
1292
+ spent generating a large plan or file.
1293
+
1288
1294
  Watchdog notices remain in conversation history, but do not display a red error
1289
1295
  banner. Other failures retain their banners. Watchdog shutdown requests both
1290
1296
  cancellation and closure of the SDK transport. Kōbō still requires confirmed
@@ -145,6 +145,24 @@ class ClaudeInputStream {
145
145
  return { type: 'user', uuid: randomUUID(), message: { role: 'user', content: text }, parent_tool_use_id: null };
146
146
  }
147
147
  }
148
+ /** Generation can be active without any user-visible mapped event. */
149
+ function hasStreamingContent(msg) {
150
+ if (msg.type !== 'stream_event' || msg.event.type !== 'content_block_delta')
151
+ return false;
152
+ const delta = msg.event.delta;
153
+ switch (delta.type) {
154
+ case 'text_delta':
155
+ return delta.text.length > 0;
156
+ case 'thinking_delta':
157
+ return delta.thinking.length > 0;
158
+ case 'input_json_delta':
159
+ return delta.partial_json.length > 0;
160
+ case 'signature_delta':
161
+ return delta.signature.length > 0;
162
+ default:
163
+ return false;
164
+ }
165
+ }
148
166
  export function createClaudeCodeEngine() {
149
167
  return {
150
168
  id: 'claude-code',
@@ -661,11 +679,13 @@ export function createClaudeCodeEngine() {
661
679
  for await (const msg of q) {
662
680
  const events = mapSdkMessage(msg, mapperState);
663
681
  const isForeground = !('parent_tool_use_id' in msg && msg.parent_tool_use_id != null);
682
+ const streamingContent = hasStreamingContent(msg);
664
683
  const foregroundProgress = isForeground &&
665
- events.some((ev) => ev.kind === 'message:text' ||
666
- ev.kind === 'message:thinking' ||
667
- ev.kind === 'tool:call' ||
668
- ev.kind === 'tool:result');
684
+ (streamingContent ||
685
+ events.some((ev) => ev.kind === 'message:text' ||
686
+ ev.kind === 'message:thinking' ||
687
+ ev.kind === 'tool:call' ||
688
+ ev.kind === 'tool:result'));
669
689
  // A parent continuation owns the foreground again. Background
670
690
  // progress notifications alone do not end the between-turn wait.
671
691
  if (foregroundProgress) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "2.1.12",
3
+ "version": "2.1.13",
4
4
  "description": "Kōbō — local multi-workspace orchestrator for Claude Code and OpenAI Codex, with isolated Git worktrees, live review and optional automation.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-or-later",