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.
Files changed (223) hide show
  1. package/README.md +192 -9
  2. package/README.zh-CN.md +143 -8
  3. package/dist/backend/client.d.ts +12 -4
  4. package/dist/backend/client.d.ts.map +1 -1
  5. package/dist/backend/client.js +72 -7
  6. package/dist/backend/client.js.map +1 -1
  7. package/dist/backend/credentials.d.ts.map +1 -1
  8. package/dist/backend/credentials.js +2 -1
  9. package/dist/backend/credentials.js.map +1 -1
  10. package/dist/backend/listener.d.ts +12 -4
  11. package/dist/backend/listener.d.ts.map +1 -1
  12. package/dist/backend/listener.js +68 -12
  13. package/dist/backend/listener.js.map +1 -1
  14. package/dist/backend/types.d.ts +1 -1
  15. package/dist/backend/types.d.ts.map +1 -1
  16. package/dist/bin/hub.d.ts +16 -0
  17. package/dist/bin/hub.d.ts.map +1 -0
  18. package/dist/bin/hub.js +41 -0
  19. package/dist/bin/hub.js.map +1 -0
  20. package/dist/bin/quota.d.ts +54 -0
  21. package/dist/bin/quota.d.ts.map +1 -0
  22. package/dist/bin/quota.js +333 -0
  23. package/dist/bin/quota.js.map +1 -0
  24. package/dist/config/auto-compact.d.ts +23 -0
  25. package/dist/config/auto-compact.d.ts.map +1 -0
  26. package/dist/config/auto-compact.js +67 -0
  27. package/dist/config/auto-compact.js.map +1 -0
  28. package/dist/config/mcp-discovery.d.ts +34 -0
  29. package/dist/config/mcp-discovery.d.ts.map +1 -0
  30. package/dist/config/mcp-discovery.js +153 -0
  31. package/dist/config/mcp-discovery.js.map +1 -0
  32. package/dist/config/model-cache.d.ts +12 -1
  33. package/dist/config/model-cache.d.ts.map +1 -1
  34. package/dist/config/model-cache.js +30 -8
  35. package/dist/config/model-cache.js.map +1 -1
  36. package/dist/config/options.d.ts +87 -9
  37. package/dist/config/options.d.ts.map +1 -1
  38. package/dist/config/options.js +248 -45
  39. package/dist/config/options.js.map +1 -1
  40. package/dist/config/plugin-commands.d.ts +24 -0
  41. package/dist/config/plugin-commands.d.ts.map +1 -0
  42. package/dist/config/plugin-commands.js +107 -0
  43. package/dist/config/plugin-commands.js.map +1 -0
  44. package/dist/config/provider-registry.d.ts +60 -0
  45. package/dist/config/provider-registry.d.ts.map +1 -0
  46. package/dist/config/provider-registry.js +128 -0
  47. package/dist/config/provider-registry.js.map +1 -0
  48. package/dist/config/runtime-model.d.ts +54 -18
  49. package/dist/config/runtime-model.d.ts.map +1 -1
  50. package/dist/config/runtime-model.js +105 -61
  51. package/dist/config/runtime-model.js.map +1 -1
  52. package/dist/config/skill-discovery.d.ts +35 -0
  53. package/dist/config/skill-discovery.d.ts.map +1 -0
  54. package/dist/config/skill-discovery.js +188 -0
  55. package/dist/config/skill-discovery.js.map +1 -0
  56. package/dist/handlers/account.d.ts +43 -0
  57. package/dist/handlers/account.d.ts.map +1 -0
  58. package/dist/handlers/account.js +59 -0
  59. package/dist/handlers/account.js.map +1 -0
  60. package/dist/handlers/background-tasks.d.ts +72 -0
  61. package/dist/handlers/background-tasks.d.ts.map +1 -0
  62. package/dist/handlers/background-tasks.js +330 -0
  63. package/dist/handlers/background-tasks.js.map +1 -0
  64. package/dist/handlers/dispatch.d.ts.map +1 -1
  65. package/dist/handlers/dispatch.js +134 -22
  66. package/dist/handlers/dispatch.js.map +1 -1
  67. package/dist/handlers/extensions.d.ts +15 -0
  68. package/dist/handlers/extensions.d.ts.map +1 -1
  69. package/dist/handlers/extensions.js +43 -27
  70. package/dist/handlers/extensions.js.map +1 -1
  71. package/dist/handlers/io.d.ts +31 -3
  72. package/dist/handlers/io.d.ts.map +1 -1
  73. package/dist/handlers/io.js +108 -9
  74. package/dist/handlers/io.js.map +1 -1
  75. package/dist/handlers/replay.d.ts +79 -0
  76. package/dist/handlers/replay.d.ts.map +1 -0
  77. package/dist/handlers/replay.js +252 -0
  78. package/dist/handlers/replay.js.map +1 -0
  79. package/dist/handlers/server-requests.d.ts +20 -4
  80. package/dist/handlers/server-requests.d.ts.map +1 -1
  81. package/dist/handlers/server-requests.js +293 -63
  82. package/dist/handlers/server-requests.js.map +1 -1
  83. package/dist/handlers/session.d.ts +113 -10
  84. package/dist/handlers/session.d.ts.map +1 -1
  85. package/dist/handlers/session.js +932 -277
  86. package/dist/handlers/session.js.map +1 -1
  87. package/dist/handlers/slash.d.ts +37 -1
  88. package/dist/handlers/slash.d.ts.map +1 -1
  89. package/dist/handlers/slash.js +143 -8
  90. package/dist/handlers/slash.js.map +1 -1
  91. package/dist/index.js +76 -12
  92. package/dist/index.js.map +1 -1
  93. package/dist/interaction/adapter.d.ts +19 -33
  94. package/dist/interaction/adapter.d.ts.map +1 -1
  95. package/dist/interaction/adapter.js +80 -79
  96. package/dist/interaction/adapter.js.map +1 -1
  97. package/dist/lazy-sessions.d.ts +35 -0
  98. package/dist/lazy-sessions.d.ts.map +1 -0
  99. package/dist/lazy-sessions.js +98 -0
  100. package/dist/lazy-sessions.js.map +1 -0
  101. package/dist/quota/cache.d.ts +18 -0
  102. package/dist/quota/cache.d.ts.map +1 -0
  103. package/dist/quota/cache.js +32 -0
  104. package/dist/quota/cache.js.map +1 -0
  105. package/dist/quota/client.d.ts +30 -0
  106. package/dist/quota/client.d.ts.map +1 -0
  107. package/dist/quota/client.js +57 -0
  108. package/dist/quota/client.js.map +1 -0
  109. package/dist/quota/color.d.ts +58 -0
  110. package/dist/quota/color.d.ts.map +1 -0
  111. package/dist/quota/color.js +95 -0
  112. package/dist/quota/color.js.map +1 -0
  113. package/dist/quota/combined.d.ts +66 -0
  114. package/dist/quota/combined.d.ts.map +1 -0
  115. package/dist/quota/combined.js +179 -0
  116. package/dist/quota/combined.js.map +1 -0
  117. package/dist/quota/format.d.ts +105 -0
  118. package/dist/quota/format.d.ts.map +1 -0
  119. package/dist/quota/format.js +219 -0
  120. package/dist/quota/format.js.map +1 -0
  121. package/dist/quota/index.d.ts +23 -0
  122. package/dist/quota/index.d.ts.map +1 -0
  123. package/dist/quota/index.js +42 -0
  124. package/dist/quota/index.js.map +1 -0
  125. package/dist/quota/opencode-go/cache.d.ts +17 -0
  126. package/dist/quota/opencode-go/cache.d.ts.map +1 -0
  127. package/dist/quota/opencode-go/cache.js +31 -0
  128. package/dist/quota/opencode-go/cache.js.map +1 -0
  129. package/dist/quota/opencode-go/client.d.ts +28 -0
  130. package/dist/quota/opencode-go/client.d.ts.map +1 -0
  131. package/dist/quota/opencode-go/client.js +48 -0
  132. package/dist/quota/opencode-go/client.js.map +1 -0
  133. package/dist/quota/opencode-go/config.d.ts +37 -0
  134. package/dist/quota/opencode-go/config.d.ts.map +1 -0
  135. package/dist/quota/opencode-go/config.js +58 -0
  136. package/dist/quota/opencode-go/config.js.map +1 -0
  137. package/dist/quota/opencode-go/format.d.ts +36 -0
  138. package/dist/quota/opencode-go/format.d.ts.map +1 -0
  139. package/dist/quota/opencode-go/format.js +87 -0
  140. package/dist/quota/opencode-go/format.js.map +1 -0
  141. package/dist/quota/opencode-go/index.d.ts +30 -0
  142. package/dist/quota/opencode-go/index.d.ts.map +1 -0
  143. package/dist/quota/opencode-go/index.js +108 -0
  144. package/dist/quota/opencode-go/index.js.map +1 -0
  145. package/dist/quota/opencode-go/parse.d.ts +41 -0
  146. package/dist/quota/opencode-go/parse.d.ts.map +1 -0
  147. package/dist/quota/opencode-go/parse.js +75 -0
  148. package/dist/quota/opencode-go/parse.js.map +1 -0
  149. package/dist/quota/opencode-go/types.d.ts +48 -0
  150. package/dist/quota/opencode-go/types.d.ts.map +1 -0
  151. package/dist/quota/opencode-go/types.js +11 -0
  152. package/dist/quota/opencode-go/types.js.map +1 -0
  153. package/dist/quota/parse.d.ts +33 -0
  154. package/dist/quota/parse.d.ts.map +1 -0
  155. package/dist/quota/parse.js +200 -0
  156. package/dist/quota/parse.js.map +1 -0
  157. package/dist/quota/types.d.ts +72 -0
  158. package/dist/quota/types.d.ts.map +1 -0
  159. package/dist/quota/types.js +10 -0
  160. package/dist/quota/types.js.map +1 -0
  161. package/dist/remote/broadcast.d.ts +47 -0
  162. package/dist/remote/broadcast.d.ts.map +1 -0
  163. package/dist/remote/broadcast.js +121 -0
  164. package/dist/remote/broadcast.js.map +1 -0
  165. package/dist/remote/config.d.ts +32 -0
  166. package/dist/remote/config.d.ts.map +1 -0
  167. package/dist/remote/config.js +65 -0
  168. package/dist/remote/config.js.map +1 -0
  169. package/dist/remote/endpoint.d.ts +30 -0
  170. package/dist/remote/endpoint.d.ts.map +1 -0
  171. package/dist/remote/endpoint.js +213 -0
  172. package/dist/remote/endpoint.js.map +1 -0
  173. package/dist/remote/hub-server.d.ts +41 -0
  174. package/dist/remote/hub-server.d.ts.map +1 -0
  175. package/dist/remote/hub-server.js +346 -0
  176. package/dist/remote/hub-server.js.map +1 -0
  177. package/dist/server.d.ts +139 -1
  178. package/dist/server.d.ts.map +1 -1
  179. package/dist/server.js +179 -4
  180. package/dist/server.js.map +1 -1
  181. package/dist/tasks-index.d.ts +14 -4
  182. package/dist/tasks-index.d.ts.map +1 -1
  183. package/dist/tasks-index.js +145 -46
  184. package/dist/tasks-index.js.map +1 -1
  185. package/dist/translators/event-translator.d.ts +33 -0
  186. package/dist/translators/event-translator.d.ts.map +1 -1
  187. package/dist/translators/event-translator.js +101 -0
  188. package/dist/translators/event-translator.js.map +1 -1
  189. package/dist/translators/index.d.ts +1 -1
  190. package/dist/translators/index.d.ts.map +1 -1
  191. package/dist/translators/index.js +1 -1
  192. package/dist/translators/index.js.map +1 -1
  193. package/dist/translators/projection-differ.d.ts +8 -0
  194. package/dist/translators/projection-differ.d.ts.map +1 -1
  195. package/dist/translators/projection-differ.js +19 -9
  196. package/dist/translators/projection-differ.js.map +1 -1
  197. package/dist/translators/tool-helpers.d.ts +28 -0
  198. package/dist/translators/tool-helpers.d.ts.map +1 -1
  199. package/dist/translators/tool-helpers.js +104 -0
  200. package/dist/translators/tool-helpers.js.map +1 -1
  201. package/dist/translators/types.d.ts +38 -1
  202. package/dist/translators/types.d.ts.map +1 -1
  203. package/dist/translators/types.js.map +1 -1
  204. package/dist/utils.d.ts +36 -7
  205. package/dist/utils.d.ts.map +1 -1
  206. package/dist/utils.js +69 -5
  207. package/dist/utils.js.map +1 -1
  208. package/docs/ARCHITECTURE.md +130 -40
  209. package/docs/BACKLOG.md +59 -0
  210. package/docs/DEVELOPMENT.md +31 -0
  211. package/docs/PROTOCOL.md +328 -23
  212. package/docs/REMOTE-CLIENTS.md +260 -0
  213. package/docs/REPLAY-GUIDE.md +131 -0
  214. package/docs/TROUBLESHOOTING.md +131 -14
  215. package/docs/adr/0001-bridge-lifetime-follows-primary-client.md +14 -0
  216. package/docs/adr/0002-stateless-hub-over-per-bridge-acp-endpoints.md +23 -0
  217. package/docs/adr/0003-tail-replay-meta-and-cursor-pagination.md +40 -0
  218. package/docs/agents/domain.md +51 -0
  219. package/docs/agents/issue-tracker.md +22 -0
  220. package/docs/agents/triage-labels.md +15 -0
  221. package/docs/proposals/0001-tail-session-replay.md +136 -0
  222. package/docs/proposals/0002-plan-quota-usage.md +81 -0
  223. package/package.json +10 -6
@@ -17,45 +17,110 @@
17
17
  */
18
18
  import { existsSync, readFileSync } from "node:fs";
19
19
  import path from "node:path";
20
- import { log, ZCODE_CREDS_PATH } from "./utils.js";
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 DatabaseSyncCtor;
27
+ let DatabaseSync;
27
28
  async function loadSqlite() {
28
- if (DatabaseSyncCtor !== undefined)
29
- return DatabaseSyncCtor;
29
+ if (DatabaseSync !== undefined)
30
+ return DatabaseSync;
30
31
  try {
31
- // node:sqlite ships with Node ≥ 22. Cast through unknown so this compiles
32
- // even if @types/node lags behind the runtime module.
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
- DatabaseSyncCtor = mod.DatabaseSync;
35
+ DatabaseSync = mod.DatabaseSync;
35
36
  }
36
37
  catch {
37
- DatabaseSyncCtor = null; // Node < 22 or sqlite unavailable
38
+ DatabaseSync = null; // Node < 22, sqlite unavailable, or flag missing
38
39
  }
39
- return DatabaseSyncCtor;
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
- /** Read provider id + model id from config.json (display-only fields). */
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] ?? "GLM-5.2";
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: "GLM-5.2" };
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 con = DatabaseSync(TASKS_INDEX_PATH, { timeout: 5000 });
100
- try {
101
- con.run("INSERT OR IGNORE INTO tasks " +
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, ?, ?)", opts.workspaceKey, opts.workspaceKey, opts.taskId, opts.title, status, providerId, model, nowMs, nowMs, metaJson, opts.title);
107
- }
108
- finally {
109
- con.close();
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
- log(`tasks-index sync skipped: ${e instanceof Error ? e.message : String(e)}`);
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. session/create leaves title
120
- * empty; once the first prompt completes, set a meaningful title. Respects
121
- * title_overridden: if the user already renamed in the App, their title wins.
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 con = DatabaseSync(TASKS_INDEX_PATH, { timeout: 5000 });
134
- try {
135
- const row = con.get("SELECT title_overridden FROM tasks WHERE task_id=?", taskId);
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
- if (row.title_overridden === 1)
139
- return true; // user overrode respect it
140
- con.run("UPDATE tasks SET title=?, updated_at=?, searchable_text=? WHERE task_id=? AND title_overridden=0", trimmed, Date.now(), trimmed, taskId);
141
- }
142
- finally {
143
- con.close();
144
- }
145
- return true;
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
- log(`tasks-index title update skipped: ${e instanceof Error ? e.message : String(e)}`);
247
+ warn(`tasks-index title update skipped: ${e instanceof Error ? e.message : String(e)}`);
149
248
  return false;
150
249
  }
151
250
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tasks-index.js","sourceRoot":"","sources":["../src/tasks-index.ts"],"names":[],"mappings":"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"}
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;AAED,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;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;IAE1C,2DAA2D;IAC3D,SAAS,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,EAAE;IAmCpD,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,aAAa;IAsGrB,OAAO,CAAC,iBAAiB;CAS1B"}
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":"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"}
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,GAChB,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
+ {"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,GAChB,MAAM,mBAAmB,CAAC"}
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;IA6DxD,OAAO,CAAC,YAAY;IAmEpB,OAAO,CAAC,eAAe;CAYxB"}
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"}