zcode-acp-server 0.1.0 → 0.3.0
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/README.md +192 -9
- package/README.zh-CN.md +143 -8
- package/dist/backend/client.d.ts +12 -4
- package/dist/backend/client.d.ts.map +1 -1
- package/dist/backend/client.js +72 -7
- package/dist/backend/client.js.map +1 -1
- package/dist/backend/credentials.d.ts.map +1 -1
- package/dist/backend/credentials.js +2 -1
- package/dist/backend/credentials.js.map +1 -1
- package/dist/backend/listener.d.ts +12 -4
- package/dist/backend/listener.d.ts.map +1 -1
- package/dist/backend/listener.js +68 -12
- package/dist/backend/listener.js.map +1 -1
- package/dist/backend/types.d.ts +1 -1
- package/dist/backend/types.d.ts.map +1 -1
- package/dist/bin/hub.d.ts +16 -0
- package/dist/bin/hub.d.ts.map +1 -0
- package/dist/bin/hub.js +41 -0
- package/dist/bin/hub.js.map +1 -0
- package/dist/bin/quota.d.ts +54 -0
- package/dist/bin/quota.d.ts.map +1 -0
- package/dist/bin/quota.js +333 -0
- package/dist/bin/quota.js.map +1 -0
- package/dist/config/auto-compact.d.ts +23 -0
- package/dist/config/auto-compact.d.ts.map +1 -0
- package/dist/config/auto-compact.js +67 -0
- package/dist/config/auto-compact.js.map +1 -0
- package/dist/config/mcp-discovery.d.ts +34 -0
- package/dist/config/mcp-discovery.d.ts.map +1 -0
- package/dist/config/mcp-discovery.js +153 -0
- package/dist/config/mcp-discovery.js.map +1 -0
- package/dist/config/model-cache.d.ts +12 -1
- package/dist/config/model-cache.d.ts.map +1 -1
- package/dist/config/model-cache.js +30 -8
- package/dist/config/model-cache.js.map +1 -1
- package/dist/config/options.d.ts +87 -9
- package/dist/config/options.d.ts.map +1 -1
- package/dist/config/options.js +248 -45
- package/dist/config/options.js.map +1 -1
- package/dist/config/plugin-commands.d.ts +24 -0
- package/dist/config/plugin-commands.d.ts.map +1 -0
- package/dist/config/plugin-commands.js +107 -0
- package/dist/config/plugin-commands.js.map +1 -0
- package/dist/config/provider-registry.d.ts +60 -0
- package/dist/config/provider-registry.d.ts.map +1 -0
- package/dist/config/provider-registry.js +128 -0
- package/dist/config/provider-registry.js.map +1 -0
- package/dist/config/runtime-model.d.ts +54 -18
- package/dist/config/runtime-model.d.ts.map +1 -1
- package/dist/config/runtime-model.js +105 -61
- package/dist/config/runtime-model.js.map +1 -1
- package/dist/config/skill-discovery.d.ts +35 -0
- package/dist/config/skill-discovery.d.ts.map +1 -0
- package/dist/config/skill-discovery.js +188 -0
- package/dist/config/skill-discovery.js.map +1 -0
- package/dist/handlers/account.d.ts +43 -0
- package/dist/handlers/account.d.ts.map +1 -0
- package/dist/handlers/account.js +59 -0
- package/dist/handlers/account.js.map +1 -0
- package/dist/handlers/background-tasks.d.ts +72 -0
- package/dist/handlers/background-tasks.d.ts.map +1 -0
- package/dist/handlers/background-tasks.js +330 -0
- package/dist/handlers/background-tasks.js.map +1 -0
- package/dist/handlers/dispatch.d.ts.map +1 -1
- package/dist/handlers/dispatch.js +134 -22
- package/dist/handlers/dispatch.js.map +1 -1
- package/dist/handlers/extensions.d.ts +15 -0
- package/dist/handlers/extensions.d.ts.map +1 -1
- package/dist/handlers/extensions.js +43 -27
- package/dist/handlers/extensions.js.map +1 -1
- package/dist/handlers/io.d.ts +31 -3
- package/dist/handlers/io.d.ts.map +1 -1
- package/dist/handlers/io.js +108 -9
- package/dist/handlers/io.js.map +1 -1
- package/dist/handlers/replay.d.ts +79 -0
- package/dist/handlers/replay.d.ts.map +1 -0
- package/dist/handlers/replay.js +252 -0
- package/dist/handlers/replay.js.map +1 -0
- package/dist/handlers/server-requests.d.ts +20 -4
- package/dist/handlers/server-requests.d.ts.map +1 -1
- package/dist/handlers/server-requests.js +293 -63
- package/dist/handlers/server-requests.js.map +1 -1
- package/dist/handlers/session.d.ts +113 -10
- package/dist/handlers/session.d.ts.map +1 -1
- package/dist/handlers/session.js +932 -277
- package/dist/handlers/session.js.map +1 -1
- package/dist/handlers/slash.d.ts +37 -1
- package/dist/handlers/slash.d.ts.map +1 -1
- package/dist/handlers/slash.js +143 -8
- package/dist/handlers/slash.js.map +1 -1
- package/dist/index.js +76 -12
- package/dist/index.js.map +1 -1
- package/dist/interaction/adapter.d.ts +19 -33
- package/dist/interaction/adapter.d.ts.map +1 -1
- package/dist/interaction/adapter.js +80 -79
- package/dist/interaction/adapter.js.map +1 -1
- package/dist/lazy-sessions.d.ts +35 -0
- package/dist/lazy-sessions.d.ts.map +1 -0
- package/dist/lazy-sessions.js +98 -0
- package/dist/lazy-sessions.js.map +1 -0
- package/dist/quota/cache.d.ts +18 -0
- package/dist/quota/cache.d.ts.map +1 -0
- package/dist/quota/cache.js +32 -0
- package/dist/quota/cache.js.map +1 -0
- package/dist/quota/client.d.ts +30 -0
- package/dist/quota/client.d.ts.map +1 -0
- package/dist/quota/client.js +57 -0
- package/dist/quota/client.js.map +1 -0
- package/dist/quota/color.d.ts +58 -0
- package/dist/quota/color.d.ts.map +1 -0
- package/dist/quota/color.js +95 -0
- package/dist/quota/color.js.map +1 -0
- package/dist/quota/combined.d.ts +66 -0
- package/dist/quota/combined.d.ts.map +1 -0
- package/dist/quota/combined.js +179 -0
- package/dist/quota/combined.js.map +1 -0
- package/dist/quota/format.d.ts +105 -0
- package/dist/quota/format.d.ts.map +1 -0
- package/dist/quota/format.js +219 -0
- package/dist/quota/format.js.map +1 -0
- package/dist/quota/index.d.ts +23 -0
- package/dist/quota/index.d.ts.map +1 -0
- package/dist/quota/index.js +42 -0
- package/dist/quota/index.js.map +1 -0
- package/dist/quota/opencode-go/cache.d.ts +17 -0
- package/dist/quota/opencode-go/cache.d.ts.map +1 -0
- package/dist/quota/opencode-go/cache.js +31 -0
- package/dist/quota/opencode-go/cache.js.map +1 -0
- package/dist/quota/opencode-go/client.d.ts +28 -0
- package/dist/quota/opencode-go/client.d.ts.map +1 -0
- package/dist/quota/opencode-go/client.js +48 -0
- package/dist/quota/opencode-go/client.js.map +1 -0
- package/dist/quota/opencode-go/config.d.ts +37 -0
- package/dist/quota/opencode-go/config.d.ts.map +1 -0
- package/dist/quota/opencode-go/config.js +58 -0
- package/dist/quota/opencode-go/config.js.map +1 -0
- package/dist/quota/opencode-go/format.d.ts +36 -0
- package/dist/quota/opencode-go/format.d.ts.map +1 -0
- package/dist/quota/opencode-go/format.js +87 -0
- package/dist/quota/opencode-go/format.js.map +1 -0
- package/dist/quota/opencode-go/index.d.ts +30 -0
- package/dist/quota/opencode-go/index.d.ts.map +1 -0
- package/dist/quota/opencode-go/index.js +108 -0
- package/dist/quota/opencode-go/index.js.map +1 -0
- package/dist/quota/opencode-go/parse.d.ts +41 -0
- package/dist/quota/opencode-go/parse.d.ts.map +1 -0
- package/dist/quota/opencode-go/parse.js +75 -0
- package/dist/quota/opencode-go/parse.js.map +1 -0
- package/dist/quota/opencode-go/types.d.ts +48 -0
- package/dist/quota/opencode-go/types.d.ts.map +1 -0
- package/dist/quota/opencode-go/types.js +11 -0
- package/dist/quota/opencode-go/types.js.map +1 -0
- package/dist/quota/parse.d.ts +33 -0
- package/dist/quota/parse.d.ts.map +1 -0
- package/dist/quota/parse.js +200 -0
- package/dist/quota/parse.js.map +1 -0
- package/dist/quota/types.d.ts +72 -0
- package/dist/quota/types.d.ts.map +1 -0
- package/dist/quota/types.js +10 -0
- package/dist/quota/types.js.map +1 -0
- package/dist/remote/broadcast.d.ts +47 -0
- package/dist/remote/broadcast.d.ts.map +1 -0
- package/dist/remote/broadcast.js +121 -0
- package/dist/remote/broadcast.js.map +1 -0
- package/dist/remote/config.d.ts +32 -0
- package/dist/remote/config.d.ts.map +1 -0
- package/dist/remote/config.js +65 -0
- package/dist/remote/config.js.map +1 -0
- package/dist/remote/endpoint.d.ts +30 -0
- package/dist/remote/endpoint.d.ts.map +1 -0
- package/dist/remote/endpoint.js +213 -0
- package/dist/remote/endpoint.js.map +1 -0
- package/dist/remote/hub-server.d.ts +41 -0
- package/dist/remote/hub-server.d.ts.map +1 -0
- package/dist/remote/hub-server.js +346 -0
- package/dist/remote/hub-server.js.map +1 -0
- package/dist/server.d.ts +139 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +179 -4
- package/dist/server.js.map +1 -1
- package/dist/tasks-index.d.ts +14 -4
- package/dist/tasks-index.d.ts.map +1 -1
- package/dist/tasks-index.js +145 -46
- package/dist/tasks-index.js.map +1 -1
- package/dist/translators/event-translator.d.ts +33 -0
- package/dist/translators/event-translator.d.ts.map +1 -1
- package/dist/translators/event-translator.js +101 -0
- package/dist/translators/event-translator.js.map +1 -1
- package/dist/translators/index.d.ts +1 -1
- package/dist/translators/index.d.ts.map +1 -1
- package/dist/translators/index.js +1 -1
- package/dist/translators/index.js.map +1 -1
- package/dist/translators/projection-differ.d.ts +8 -0
- package/dist/translators/projection-differ.d.ts.map +1 -1
- package/dist/translators/projection-differ.js +19 -9
- package/dist/translators/projection-differ.js.map +1 -1
- package/dist/translators/tool-helpers.d.ts +28 -0
- package/dist/translators/tool-helpers.d.ts.map +1 -1
- package/dist/translators/tool-helpers.js +104 -0
- package/dist/translators/tool-helpers.js.map +1 -1
- package/dist/translators/types.d.ts +38 -1
- package/dist/translators/types.d.ts.map +1 -1
- package/dist/translators/types.js.map +1 -1
- package/dist/utils.d.ts +36 -7
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +69 -5
- package/dist/utils.js.map +1 -1
- package/docs/ARCHITECTURE.md +130 -40
- package/docs/BACKLOG.md +59 -0
- package/docs/DEVELOPMENT.md +31 -0
- package/docs/PROTOCOL.md +328 -23
- package/docs/REMOTE-CLIENTS.md +260 -0
- package/docs/REPLAY-GUIDE.md +131 -0
- package/docs/TROUBLESHOOTING.md +131 -14
- package/docs/adr/0001-bridge-lifetime-follows-primary-client.md +14 -0
- package/docs/adr/0002-stateless-hub-over-per-bridge-acp-endpoints.md +23 -0
- package/docs/adr/0003-tail-replay-meta-and-cursor-pagination.md +40 -0
- package/docs/agents/domain.md +51 -0
- package/docs/agents/issue-tracker.md +22 -0
- package/docs/agents/triage-labels.md +15 -0
- package/docs/proposals/0001-tail-session-replay.md +136 -0
- package/docs/proposals/0002-plan-quota-usage.md +81 -0
- package/package.json +10 -6
package/dist/tasks-index.js
CHANGED
|
@@ -17,45 +17,110 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { existsSync, readFileSync } from "node:fs";
|
|
19
19
|
import path from "node:path";
|
|
20
|
-
import {
|
|
20
|
+
import { DEFAULT_MODEL_ID } from "./config/options.js";
|
|
21
|
+
import { warn, ZCODE_CREDS_PATH } from "./utils.js";
|
|
21
22
|
/**
|
|
22
23
|
* Dynamically load `node:sqlite` (Node ≥ 22). On older Node the import fails;
|
|
23
24
|
* callers degrade gracefully (tasks-index sync is best-effort). We cache the
|
|
24
25
|
* loaded class so repeated calls don't re-import.
|
|
25
26
|
*/
|
|
26
|
-
let
|
|
27
|
+
let DatabaseSync;
|
|
27
28
|
async function loadSqlite() {
|
|
28
|
-
if (
|
|
29
|
-
return
|
|
29
|
+
if (DatabaseSync !== undefined)
|
|
30
|
+
return DatabaseSync;
|
|
30
31
|
try {
|
|
31
|
-
// node:sqlite ships with Node ≥ 22
|
|
32
|
-
//
|
|
32
|
+
// node:sqlite ships with Node ≥ 22 (experimental on 22.x — may need
|
|
33
|
+
// --experimental-sqlite on some builds; the catch below covers that).
|
|
33
34
|
const mod = (await import("node:sqlite"));
|
|
34
|
-
|
|
35
|
+
DatabaseSync = mod.DatabaseSync;
|
|
35
36
|
}
|
|
36
37
|
catch {
|
|
37
|
-
|
|
38
|
+
DatabaseSync = null; // Node < 22, sqlite unavailable, or flag missing
|
|
38
39
|
}
|
|
39
|
-
return
|
|
40
|
+
return DatabaseSync;
|
|
40
41
|
}
|
|
41
42
|
/** tasks-index.sqlite sits next to config.json under ~/.zcode/v2/. */
|
|
42
43
|
const TASKS_INDEX_PATH = path.join(path.dirname(ZCODE_CREDS_PATH), "tasks-index.sqlite");
|
|
43
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Detect a SQLite "database is locked" / "busy" error. node:sqlite surfaces
|
|
46
|
+
* SQLITE_BUSY (code 5) and SQLITE_LOCKED (code 6) as an Error whose message is
|
|
47
|
+
* SQLite's standard phrase — verified against a real node:sqlite v22 throw:
|
|
48
|
+
* `Error: database is locked`, code `ERR_SQLITE_ERROR`.
|
|
49
|
+
* We match the full phrase rather than the bare word "busy" / "locked" so a
|
|
50
|
+
* filesystem path that happens to contain those words (e.g. `/Users/busy_bee/`)
|
|
51
|
+
* inside a different error message can't trigger a false-positive retry.
|
|
52
|
+
*/
|
|
53
|
+
function isBusyError(e) {
|
|
54
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
55
|
+
return /database is (busy|locked)/i.test(msg);
|
|
56
|
+
}
|
|
57
|
+
/** Promise-based sleep (best-effort retry backoff). */
|
|
58
|
+
function sleep(ms) {
|
|
59
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Open a connection to tasks-index.sqlite and run `fn` against it, retrying on
|
|
63
|
+
* SQLITE_BUSY contention from the App's Electron host. Two short backoffs
|
|
64
|
+
* (200ms, 400ms) give the App's transaction time to commit. The connection is
|
|
65
|
+
* always closed in `finally` so a thrown error never leaks a handle.
|
|
66
|
+
*
|
|
67
|
+
* Returns whatever `fn` returns, or `null` when node:sqlite is unavailable.
|
|
68
|
+
* Rethrows non-busy errors (or busy errors that exhausted retries) so the
|
|
69
|
+
* caller can classify and log them consistently.
|
|
70
|
+
*/
|
|
71
|
+
async function withSqliteRetry(fn) {
|
|
72
|
+
const Sqlite = await loadSqlite();
|
|
73
|
+
if (!Sqlite)
|
|
74
|
+
return null; // node:sqlite unavailable (Node < 22)
|
|
75
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
76
|
+
// `con` is declared outside try so the finally can close it even when the
|
|
77
|
+
// constructor itself throws (SQLITE_BUSY can surface at open time).
|
|
78
|
+
let con = null;
|
|
79
|
+
try {
|
|
80
|
+
con = new Sqlite(TASKS_INDEX_PATH, { timeout: 5000 });
|
|
81
|
+
return fn(con);
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
// Retry only on transient busy/locked; surface everything else.
|
|
85
|
+
if (attempt < 2 && isBusyError(e)) {
|
|
86
|
+
await sleep(200 * (attempt + 1)); // 200ms, 400ms
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
con?.close();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Unreachable — the loop either returns or throws — but satisfies TS.
|
|
96
|
+
throw new Error("withSqliteRetry: exhausted retries without resolution");
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Read provider id + model ref from config.json.
|
|
100
|
+
*
|
|
101
|
+
* The App stores `model` as the full `providerKey/modelId` path (e.g.
|
|
102
|
+
* `builtin:bigmodel-coding-plan/GLM-5.3`) — the provider map's KEY is the
|
|
103
|
+
* provider id, not the short label. We mirror that format so App-side
|
|
104
|
+
* filtering/grouping by model treats bridge-created rows identically.
|
|
105
|
+
*
|
|
106
|
+
* `providerId` stays the short label (`glm`) — that's what every row uses
|
|
107
|
+
* regardless of source.
|
|
108
|
+
*/
|
|
44
109
|
function resolveProviderModel() {
|
|
45
110
|
try {
|
|
46
111
|
const cfg = JSON.parse(readFileSync(ZCODE_CREDS_PATH, "utf8"));
|
|
47
|
-
for (const [, p] of Object.entries(cfg.provider ?? {})) {
|
|
112
|
+
for (const [providerKey, p] of Object.entries(cfg.provider ?? {})) {
|
|
48
113
|
if (p?.enabled) {
|
|
49
114
|
const models = p.models ?? {};
|
|
50
|
-
const modelId = Object.keys(models)[0] ??
|
|
51
|
-
return { providerId: "glm", modelRef: modelId };
|
|
115
|
+
const modelId = Object.keys(models)[0] ?? DEFAULT_MODEL_ID;
|
|
116
|
+
return { providerId: "glm", modelRef: `${providerKey}/${modelId}` };
|
|
52
117
|
}
|
|
53
118
|
}
|
|
54
119
|
}
|
|
55
120
|
catch {
|
|
56
121
|
// fall through to defaults
|
|
57
122
|
}
|
|
58
|
-
return { providerId: "glm", modelRef:
|
|
123
|
+
return { providerId: "glm", modelRef: DEFAULT_MODEL_ID };
|
|
59
124
|
}
|
|
60
125
|
/**
|
|
61
126
|
* Insert (or refresh) a row in tasks-index.sqlite so the App UI shows it.
|
|
@@ -67,9 +132,6 @@ function resolveProviderModel() {
|
|
|
67
132
|
export async function upsertSessionTask(opts) {
|
|
68
133
|
if (!existsSync(TASKS_INDEX_PATH))
|
|
69
134
|
return false; // App never installed → no index.
|
|
70
|
-
const DatabaseSync = await loadSqlite();
|
|
71
|
-
if (!DatabaseSync)
|
|
72
|
-
return false; // node:sqlite unavailable (Node < 22)
|
|
73
135
|
const nowMs = Date.now();
|
|
74
136
|
const { providerId, modelRef } = resolveProviderModel();
|
|
75
137
|
const model = opts.model ?? modelRef;
|
|
@@ -95,57 +157,94 @@ export async function upsertSessionTask(opts) {
|
|
|
95
157
|
catch {
|
|
96
158
|
return false;
|
|
97
159
|
}
|
|
160
|
+
// withSqliteRetry handles SQLITE_BUSY contention with the App's Electron
|
|
161
|
+
// host. Visible failure: a missing App-UI row is user-perceivable, so warn()
|
|
162
|
+
// (stderr, always emitted) rather than the quiet log() default.
|
|
98
163
|
try {
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
164
|
+
const result = await withSqliteRetry((con) => {
|
|
165
|
+
con
|
|
166
|
+
.prepare("INSERT OR IGNORE INTO tasks " +
|
|
102
167
|
"(workspace_key, workspace_path, workspace_identity, task_id, " +
|
|
103
168
|
" title, task_status, provider, mode, model, " +
|
|
104
169
|
" created_at, updated_at, unread_at, pinned, archived, deleted, " +
|
|
105
170
|
" title_overridden, meta_json, searchable_text) " +
|
|
106
|
-
"VALUES (?, ?, NULL, ?, ?, ?, ?, 'build', ?, ?, ?, NULL, 0, 0, 0, 0, ?, ?)"
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
return true;
|
|
171
|
+
"VALUES (?, ?, NULL, ?, ?, ?, ?, 'build', ?, ?, ?, NULL, 0, 0, 0, 0, ?, ?)")
|
|
172
|
+
.run(opts.workspaceKey, opts.workspaceKey, opts.taskId, opts.title, status, providerId, model, nowMs, nowMs, metaJson, opts.title);
|
|
173
|
+
return true;
|
|
174
|
+
});
|
|
175
|
+
return result ?? false;
|
|
112
176
|
}
|
|
113
177
|
catch (e) {
|
|
114
|
-
|
|
178
|
+
warn(`tasks-index sync skipped: ${e instanceof Error ? e.message : String(e)}`);
|
|
115
179
|
return false;
|
|
116
180
|
}
|
|
117
181
|
}
|
|
118
182
|
/**
|
|
119
|
-
* Update a session's title after the first turn.
|
|
120
|
-
*
|
|
121
|
-
*
|
|
183
|
+
* Update a session's title + searchable_text after the first turn.
|
|
184
|
+
*
|
|
185
|
+
* session/create leaves title empty; once the first prompt completes, set a
|
|
186
|
+
* meaningful title. Respects title_overridden: if the user already renamed in
|
|
187
|
+
* the App, their title wins (but searchable_text is still refreshed — it's not
|
|
188
|
+
* user-controlled).
|
|
189
|
+
*
|
|
190
|
+
* `searchableText` feeds the App's full-text search (the App builds it via
|
|
191
|
+
* `buildSearchableTextFromMessages`: each message's content trimmed + joined
|
|
192
|
+
* by newlines, capped at 200k chars). We pass the first user prompt here; the
|
|
193
|
+
* App later overwrites it with the full conversation when it reindexes, but
|
|
194
|
+
* having it non-empty from the start means the row shows up in search and
|
|
195
|
+
* matches the shape of App-created rows.
|
|
122
196
|
*/
|
|
123
|
-
export async function updateSessionTitle(taskId, title) {
|
|
197
|
+
export async function updateSessionTitle(taskId, title, searchableText) {
|
|
124
198
|
if (!existsSync(TASKS_INDEX_PATH) || !title)
|
|
125
199
|
return false;
|
|
126
|
-
const DatabaseSync = await loadSqlite();
|
|
127
|
-
if (!DatabaseSync)
|
|
128
|
-
return false;
|
|
129
200
|
const trimmed = title.trim().slice(0, 80);
|
|
130
201
|
if (!trimmed)
|
|
131
202
|
return false;
|
|
203
|
+
// Cap searchable_text at the App's limit (aD = 2e5 = 200000 chars).
|
|
204
|
+
const search = (searchableText ?? trimmed).trim().slice(0, 200_000);
|
|
205
|
+
// Title updates also write to tasks-index.sqlite and are equally exposed to
|
|
206
|
+
// SQLITE_BUSY contention with the App's Electron host — go through the same
|
|
207
|
+
// withSqliteRetry path as upsertSessionTask for consistent retry behaviour.
|
|
132
208
|
try {
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
209
|
+
const result = await withSqliteRetry((con) => {
|
|
210
|
+
const row = con
|
|
211
|
+
.prepare("SELECT title_overridden, meta_json FROM tasks WHERE task_id=?")
|
|
212
|
+
.get(taskId);
|
|
136
213
|
if (!row)
|
|
137
214
|
return false;
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
215
|
+
// The ZCode App reads title from meta_json first (falling back to the
|
|
216
|
+
// title column only when meta_json fails to parse). If we update only the
|
|
217
|
+
// column, the App keeps showing the stale meta_json title (empty at create
|
|
218
|
+
// time). So we patch meta_json.title in both branches below.
|
|
219
|
+
let metaJson;
|
|
220
|
+
try {
|
|
221
|
+
const meta = JSON.parse(row.meta_json ?? "{}");
|
|
222
|
+
meta["title"] = trimmed;
|
|
223
|
+
metaJson = JSON.stringify(meta);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// meta_json corrupt/unparseable — the App will fall back to the title
|
|
227
|
+
// column anyway, so skip the meta_json write rather than guessing.
|
|
228
|
+
metaJson = row.meta_json ?? "{}";
|
|
229
|
+
}
|
|
230
|
+
if (row.title_overridden === 1) {
|
|
231
|
+
// User overrode the title → respect the column value, but still refresh
|
|
232
|
+
// searchable_text and sync meta_json.title for consistency.
|
|
233
|
+
con
|
|
234
|
+
.prepare("UPDATE tasks SET updated_at=?, searchable_text=?, meta_json=? WHERE task_id=?")
|
|
235
|
+
.run(Date.now(), search, metaJson, taskId);
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
con
|
|
239
|
+
.prepare("UPDATE tasks SET title=?, updated_at=?, searchable_text=?, meta_json=? " +
|
|
240
|
+
"WHERE task_id=? AND title_overridden=0")
|
|
241
|
+
.run(trimmed, Date.now(), search, metaJson, taskId);
|
|
242
|
+
return true;
|
|
243
|
+
});
|
|
244
|
+
return result ?? false;
|
|
146
245
|
}
|
|
147
246
|
catch (e) {
|
|
148
|
-
|
|
247
|
+
warn(`tasks-index title update skipped: ${e instanceof Error ? e.message : String(e)}`);
|
|
149
248
|
return false;
|
|
150
249
|
}
|
|
151
250
|
}
|
package/dist/tasks-index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-index.js","sourceRoot":"","sources":["../src/tasks-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tasks-index.js","sourceRoot":"","sources":["../src/tasks-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,22 @@ export declare class EventTranslator {
|
|
|
22
22
|
turnFailed: boolean;
|
|
23
23
|
turnResultType: string | null;
|
|
24
24
|
turnError: Record<string, unknown> | null;
|
|
25
|
+
/**
|
|
26
|
+
* True while inside a background-task notification turn
|
|
27
|
+
* (`turn.started {inputSource:"background_task"}`). Set on its turn.started,
|
|
28
|
+
* cleared on the next user-initiated turn.started. While true, `translate`
|
|
29
|
+
* drops all events — that turn is owned by BackgroundTaskListener.
|
|
30
|
+
*/
|
|
31
|
+
private skippingBackgroundTurn;
|
|
32
|
+
/**
|
|
33
|
+
* Backend message ids (`assistantMessageId`) whose content reached this
|
|
34
|
+
* translator via the live event stream. Used by the turn loop to dedup the
|
|
35
|
+
* turn-completion fallback replay: a message already streamed live must not
|
|
36
|
+
* be re-emitted by `ProjectionDiffer.diff()`, while messages produced while
|
|
37
|
+
* no listener was attached (e.g. a backend turn resumed after compaction)
|
|
38
|
+
* have no live deltas and must be replayed.
|
|
39
|
+
*/
|
|
40
|
+
readonly deliveredMessageIds: Set<string>;
|
|
25
41
|
/** Tool call ids we've already emitted a ToolCallNew for. */
|
|
26
42
|
readonly seenToolIds: Set<string>;
|
|
27
43
|
/** call_id → tool_name (result/error events omit toolName). */
|
|
@@ -30,8 +46,25 @@ export declare class EventTranslator {
|
|
|
30
46
|
readonly toolInputs: Map<string, unknown>;
|
|
31
47
|
/** Tool call ids that reached a terminal state (result/error). */
|
|
32
48
|
readonly finalToolIds: Set<string>;
|
|
49
|
+
/**
|
|
50
|
+
* call_ids launched with `run_in_background: true`. Populated when the
|
|
51
|
+
* scheduled event resolves the input (streaming cache or payload), so the
|
|
52
|
+
* later `result` event — whose input is omitted — can still mark its
|
|
53
|
+
* ToolCallUpdate as background. Read by `translateTool` to thread the flag
|
|
54
|
+
* through to dispatch (which skips terminal_exit for background Bash).
|
|
55
|
+
*/
|
|
56
|
+
readonly backgroundCallIds: Set<string>;
|
|
33
57
|
/** Translate one zcode event into 0..n internal events. */
|
|
34
58
|
translate(event: ZcodeEventPayload): InternalEvent[];
|
|
59
|
+
/**
|
|
60
|
+
* `state.updated` → one ConfigChanged event carrying the new settings values.
|
|
61
|
+
* Payload shape (wrapped from the backend notification's params):
|
|
62
|
+
* { patch: { mode: {current}, model: {current:{providerId,modelId}},
|
|
63
|
+
* thoughtLevel: {current} }, reason, revision, sessionId }
|
|
64
|
+
* Fields missing from the patch are omitted — the dispatcher only emits
|
|
65
|
+
* updates for what actually changed.
|
|
66
|
+
*/
|
|
67
|
+
private translateStateUpdated;
|
|
35
68
|
private translateStreaming;
|
|
36
69
|
private translateTool;
|
|
37
70
|
private translateTurnDone;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-translator.d.ts","sourceRoot":"","sources":["../../src/translators/event-translator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"event-translator.d.ts","sourceRoot":"","sources":["../../src/translators/event-translator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAcD,qBAAa,eAAe;IAC1B,WAAW,UAAS;IACpB,QAAQ,UAAS;IACjB,UAAU,UAAS;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAQ;IACjD;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB,CAAS;IACvC;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,cAAqB;IAEjD,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,cAAqB;IACzC,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,sBAA6B;IAC/C,kEAAkE;IAClE,QAAQ,CAAC,UAAU,uBAA8B;IACjD,kEAAkE;IAClE,QAAQ,CAAC,YAAY,cAAqB;IAC1C;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,cAAqB;IAE/C,2DAA2D;IAC3D,SAAS,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,EAAE;IA4DpD;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,aAAa;IA8GrB,OAAO,CAAC,iBAAiB;CAS1B"}
|
|
@@ -13,12 +13,40 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { log, warn } from "../utils.js";
|
|
15
15
|
import { buildResultContent, extractLocations, renderToolOutput, summarizeToolInput, TOOL_KIND_MAP, } from "./tool-helpers.js";
|
|
16
|
+
/**
|
|
17
|
+
* Whether a tool input dict declared `run_in_background: true`. Used to tag
|
|
18
|
+
* ToolCallNew/Update events so the dispatcher and BackgroundTaskListener can
|
|
19
|
+
* keep the launch card in_progress and own its lifecycle via out-of-band
|
|
20
|
+
* `session.updated` events (rather than closing it the instant the launch
|
|
21
|
+
* acknowledgement returns).
|
|
22
|
+
*/
|
|
23
|
+
function isBackgroundInput(inp) {
|
|
24
|
+
if (!inp || typeof inp !== "object" || Array.isArray(inp))
|
|
25
|
+
return false;
|
|
26
|
+
return inp["run_in_background"] === true;
|
|
27
|
+
}
|
|
16
28
|
export class EventTranslator {
|
|
17
29
|
turnStarted = false;
|
|
18
30
|
turnDone = false;
|
|
19
31
|
turnFailed = false;
|
|
20
32
|
turnResultType = null;
|
|
21
33
|
turnError = null;
|
|
34
|
+
/**
|
|
35
|
+
* True while inside a background-task notification turn
|
|
36
|
+
* (`turn.started {inputSource:"background_task"}`). Set on its turn.started,
|
|
37
|
+
* cleared on the next user-initiated turn.started. While true, `translate`
|
|
38
|
+
* drops all events — that turn is owned by BackgroundTaskListener.
|
|
39
|
+
*/
|
|
40
|
+
skippingBackgroundTurn = false;
|
|
41
|
+
/**
|
|
42
|
+
* Backend message ids (`assistantMessageId`) whose content reached this
|
|
43
|
+
* translator via the live event stream. Used by the turn loop to dedup the
|
|
44
|
+
* turn-completion fallback replay: a message already streamed live must not
|
|
45
|
+
* be re-emitted by `ProjectionDiffer.diff()`, while messages produced while
|
|
46
|
+
* no listener was attached (e.g. a backend turn resumed after compaction)
|
|
47
|
+
* have no live deltas and must be replayed.
|
|
48
|
+
*/
|
|
49
|
+
deliveredMessageIds = new Set();
|
|
22
50
|
/** Tool call ids we've already emitted a ToolCallNew for. */
|
|
23
51
|
seenToolIds = new Set();
|
|
24
52
|
/** call_id → tool_name (result/error events omit toolName). */
|
|
@@ -27,15 +55,43 @@ export class EventTranslator {
|
|
|
27
55
|
toolInputs = new Map();
|
|
28
56
|
/** Tool call ids that reached a terminal state (result/error). */
|
|
29
57
|
finalToolIds = new Set();
|
|
58
|
+
/**
|
|
59
|
+
* call_ids launched with `run_in_background: true`. Populated when the
|
|
60
|
+
* scheduled event resolves the input (streaming cache or payload), so the
|
|
61
|
+
* later `result` event — whose input is omitted — can still mark its
|
|
62
|
+
* ToolCallUpdate as background. Read by `translateTool` to thread the flag
|
|
63
|
+
* through to dispatch (which skips terminal_exit for background Bash).
|
|
64
|
+
*/
|
|
65
|
+
backgroundCallIds = new Set();
|
|
30
66
|
/** Translate one zcode event into 0..n internal events. */
|
|
31
67
|
translate(event) {
|
|
32
68
|
const etype = event.type ?? "";
|
|
33
69
|
const payload = event.payload ?? {};
|
|
34
70
|
const results = [];
|
|
35
71
|
if (etype === "turn.started") {
|
|
72
|
+
// Background-task completion triggers an automatic backend turn
|
|
73
|
+
// (`inputSource:"background_task"`) whose text_delta is the task result.
|
|
74
|
+
// That turn is owned by the BackgroundTaskListener (session-scoped), NOT
|
|
75
|
+
// this per-prompt translator — if we consumed it we'd (a) double-forward
|
|
76
|
+
// the result and (b) mis-set turnDone and exit the user's real turn loop.
|
|
77
|
+
// So we skip every event of a background_task turn until the next
|
|
78
|
+
// user-initiated turn.started clears the flag.
|
|
79
|
+
const inputSource = payload["inputSource"];
|
|
80
|
+
if (inputSource === "background_task") {
|
|
81
|
+
this.skippingBackgroundTurn = true;
|
|
82
|
+
log(" [event] turn.started (background_task) → deferring to bg listener");
|
|
83
|
+
return results;
|
|
84
|
+
}
|
|
85
|
+
this.skippingBackgroundTurn = false;
|
|
36
86
|
this.turnStarted = true;
|
|
37
87
|
log(" [event] turn.started");
|
|
38
88
|
}
|
|
89
|
+
else if (this.skippingBackgroundTurn) {
|
|
90
|
+
// Inside a deferred background_task turn: drop everything (the bg
|
|
91
|
+
// listener handles it). turn.completed/turn.failed for the bg turn also
|
|
92
|
+
// land here and are intentionally NOT used to set turnDone.
|
|
93
|
+
return results;
|
|
94
|
+
}
|
|
39
95
|
else if (etype === "model.streaming") {
|
|
40
96
|
results.push(...this.translateStreaming(payload));
|
|
41
97
|
}
|
|
@@ -56,6 +112,13 @@ export class EventTranslator {
|
|
|
56
112
|
results.push({ kind: "UsageDelta", used, size });
|
|
57
113
|
}
|
|
58
114
|
}
|
|
115
|
+
else if (etype === "state.updated") {
|
|
116
|
+
// Session settings changed (model/mode/thoughtLevel switch, incl.
|
|
117
|
+
// mid-turn). The backend notification carries the authoritative full
|
|
118
|
+
// settings patch — forward the new values so the editor UI follows the
|
|
119
|
+
// switch immediately instead of at the next turn's completion.
|
|
120
|
+
results.push(...this.translateStateUpdated(payload));
|
|
121
|
+
}
|
|
59
122
|
else if (etype === "turn.failed") {
|
|
60
123
|
this.turnDone = true;
|
|
61
124
|
this.turnFailed = true;
|
|
@@ -66,10 +129,39 @@ export class EventTranslator {
|
|
|
66
129
|
}
|
|
67
130
|
return results;
|
|
68
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* `state.updated` → one ConfigChanged event carrying the new settings values.
|
|
134
|
+
* Payload shape (wrapped from the backend notification's params):
|
|
135
|
+
* { patch: { mode: {current}, model: {current:{providerId,modelId}},
|
|
136
|
+
* thoughtLevel: {current} }, reason, revision, sessionId }
|
|
137
|
+
* Fields missing from the patch are omitted — the dispatcher only emits
|
|
138
|
+
* updates for what actually changed.
|
|
139
|
+
*/
|
|
140
|
+
translateStateUpdated(payload) {
|
|
141
|
+
const patch = payload["patch"] ?? {};
|
|
142
|
+
const ev = { kind: "ConfigChanged" };
|
|
143
|
+
const mode = patch["mode"]?.current;
|
|
144
|
+
if (typeof mode === "string")
|
|
145
|
+
ev.mode = mode;
|
|
146
|
+
const model = patch["model"]?.current;
|
|
147
|
+
if (model && typeof model["providerId"] === "string" && typeof model["modelId"] === "string") {
|
|
148
|
+
ev.model = { providerId: model["providerId"], modelId: model["modelId"] };
|
|
149
|
+
}
|
|
150
|
+
const thought = patch["thoughtLevel"]?.current;
|
|
151
|
+
if (typeof thought === "string")
|
|
152
|
+
ev.thought = thought;
|
|
153
|
+
return [ev];
|
|
154
|
+
}
|
|
69
155
|
translateStreaming(payload) {
|
|
70
156
|
const results = [];
|
|
71
157
|
const kind = payload["kind"] ?? "";
|
|
72
158
|
const delta = payload["delta"] ?? "";
|
|
159
|
+
// Record the owning assistant message so the turn loop can distinguish
|
|
160
|
+
// "already streamed live" from "produced while no listener was attached"
|
|
161
|
+
// when replaying missing content at turn completion.
|
|
162
|
+
const msgId = payload["assistantMessageId"];
|
|
163
|
+
if (typeof msgId === "string" && msgId)
|
|
164
|
+
this.deliveredMessageIds.add(msgId);
|
|
73
165
|
if (kind === "text_delta") {
|
|
74
166
|
if (delta)
|
|
75
167
|
results.push({ kind: "TextDelta", text: delta });
|
|
@@ -111,6 +203,12 @@ export class EventTranslator {
|
|
|
111
203
|
inp = this.toolInputs.get(callId);
|
|
112
204
|
const summary = summarizeToolInput(toolName, inp);
|
|
113
205
|
const title = summary ? `${toolName}: ${summary}` : toolName;
|
|
206
|
+
// Track background launches so the later `result` event (input omitted)
|
|
207
|
+
// can still tag its ToolCallUpdate. The BackgroundTaskListener also
|
|
208
|
+
// keys off this to know which callId owns the card.
|
|
209
|
+
const isBackground = isBackgroundInput(inp);
|
|
210
|
+
if (isBackground)
|
|
211
|
+
this.backgroundCallIds.add(callId);
|
|
114
212
|
const newEv = {
|
|
115
213
|
kind: "ToolCallNew",
|
|
116
214
|
callId,
|
|
@@ -118,6 +216,7 @@ export class EventTranslator {
|
|
|
118
216
|
acpKind,
|
|
119
217
|
status: "pending",
|
|
120
218
|
title,
|
|
219
|
+
...(isBackground ? { background: true } : {}),
|
|
121
220
|
};
|
|
122
221
|
if (inp !== undefined)
|
|
123
222
|
newEv.input = inp;
|
|
@@ -157,6 +256,7 @@ export class EventTranslator {
|
|
|
157
256
|
status: "completed",
|
|
158
257
|
output: renderToolOutput(resultPayload),
|
|
159
258
|
rawResult: resultPayload,
|
|
259
|
+
...(this.backgroundCallIds.has(callId) ? { background: true } : {}),
|
|
160
260
|
};
|
|
161
261
|
// Bash content handled by the terminal path in dispatch; skip here.
|
|
162
262
|
if (tn !== "Bash" && tn !== "bash") {
|
|
@@ -178,6 +278,7 @@ export class EventTranslator {
|
|
|
178
278
|
tool: tn,
|
|
179
279
|
status: "failed",
|
|
180
280
|
output: renderToolOutput(errPayload),
|
|
281
|
+
...(this.backgroundCallIds.has(callId) ? { background: true } : {}),
|
|
181
282
|
};
|
|
182
283
|
const content = buildResultContent(tn, errPayload, true);
|
|
183
284
|
if (content.length > 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-translator.js","sourceRoot":"","sources":["../../src/translators/event-translator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,OAAO,eAAe;IAC1B,WAAW,GAAG,KAAK,CAAC;IACpB,QAAQ,GAAG,KAAK,CAAC;IACjB,UAAU,GAAG,KAAK,CAAC;IACnB,cAAc,GAAkB,IAAI,CAAC;IACrC,SAAS,GAAmC,IAAI,CAAC;IAEjD,6DAA6D;IACpD,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,+DAA+D;IACtD,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,kEAAkE;IACzD,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;IACjD,kEAAkE;IACzD,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"event-translator.js","sourceRoot":"","sources":["../../src/translators/event-translator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Translators barrel: internal event types + EventTranslator + ProjectionDiffer + helpers. */
|
|
2
2
|
export { EventTranslator } from "./event-translator.js";
|
|
3
3
|
export { ProjectionDiffer } from "./projection-differ.js";
|
|
4
|
-
export { TOOL_KIND_MAP, summarizeToolInput, renderToolOutput, extractExitCode, buildResultContent, buildDiffContent, extractLocations, formatTurnError, } from "./tool-helpers.js";
|
|
4
|
+
export { TOOL_KIND_MAP, summarizeToolInput, renderToolOutput, extractExitCode, buildResultContent, buildDiffContent, extractLocations, formatTurnError, isTransientTurnError, } from "./tool-helpers.js";
|
|
5
5
|
export type { InternalEvent, ToolCallNewEvent, ToolCallUpdateEvent, UsageDeltaEvent, TextDeltaEvent, ReasoningDeltaEvent, PlanUpdateEvent, FilesChangedEvent, } from "./types.js";
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/translators/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/translators/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Translators barrel: internal event types + EventTranslator + ProjectionDiffer + helpers. */
|
|
2
2
|
export { EventTranslator } from "./event-translator.js";
|
|
3
3
|
export { ProjectionDiffer } from "./projection-differ.js";
|
|
4
|
-
export { TOOL_KIND_MAP, summarizeToolInput, renderToolOutput, extractExitCode, buildResultContent, buildDiffContent, extractLocations, formatTurnError, } from "./tool-helpers.js";
|
|
4
|
+
export { TOOL_KIND_MAP, summarizeToolInput, renderToolOutput, extractExitCode, buildResultContent, buildDiffContent, extractLocations, formatTurnError, isTransientTurnError, } from "./tool-helpers.js";
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/translators/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/translators/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
|
|
@@ -42,6 +42,14 @@ export declare class ProjectionDiffer {
|
|
|
42
42
|
setLastUsage(used: number): void;
|
|
43
43
|
/** Diff two snapshots. Returns 0..n events. */
|
|
44
44
|
diff(curSnapshot: ZcodeSnapshot | null): InternalEvent[];
|
|
45
|
+
/**
|
|
46
|
+
* Detect a todos signature change and return a PlanUpdate event if it changed
|
|
47
|
+
* (including clearing to empty — the initial `_lastPlanSig = "__none__"` makes
|
|
48
|
+
* the first empty list also emit). Exposed so callers can run plan detection
|
|
49
|
+
* mid-turn (e.g. right after a TodoWrite tool completes) without a full diff,
|
|
50
|
+
* avoiding the lag of waiting until turn completion.
|
|
51
|
+
*/
|
|
52
|
+
diffPlan(todos: unknown[] | undefined): InternalEvent[];
|
|
45
53
|
private diffToolPart;
|
|
46
54
|
private messageDedupKey;
|
|
47
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection-differ.d.ts","sourceRoot":"","sources":["../../src/translators/projection-differ.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EACV,YAAY,EAGZ,aAAa,EACd,MAAM,qBAAqB,CAAC;AAS7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAUhD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IACrD,0EAA0E;IAC1E,mBAAmB,UAAS;IAE5B,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAOxC,gEAAgE;IAChE,cAAc,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO;IAKxC;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlC,4DAA4D;IAC5D,SAAS,IAAI,IAAI;IAIjB,4EAA4E;IAC5E,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC,+CAA+C;IAC/C,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,IAAI,GAAG,aAAa,EAAE;
|
|
1
|
+
{"version":3,"file":"projection-differ.d.ts","sourceRoot":"","sources":["../../src/translators/projection-differ.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EACV,YAAY,EAGZ,aAAa,EACd,MAAM,qBAAqB,CAAC;AAS7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAUhD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IACrD,0EAA0E;IAC1E,mBAAmB,UAAS;IAE5B,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAOxC,gEAAgE;IAChE,cAAc,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO;IAKxC;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlC,4DAA4D;IAC5D,SAAS,IAAI,IAAI;IAIjB,4EAA4E;IAC5E,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC,+CAA+C;IAC/C,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,IAAI,GAAG,aAAa,EAAE;IAiDxD;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,aAAa,EAAE;IAevD,OAAO,CAAC,YAAY;IAmEpB,OAAO,CAAC,eAAe;CAYxB"}
|