@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
|
-
|
|
666
|
-
ev.kind === 'message:
|
|
667
|
-
|
|
668
|
-
|
|
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.
|
|
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",
|